Scintilla 라이브러리를 활용한 SPACE 코드 전용 에디터 AESPA 개발 [3일차]

1. 주요 기능 개발


1-1. 검색 기능

에디터의 기본 기능 중 하나인 검색 기능이 아래와 같이 구현되었다. 


    if(_searchingWord.isEmpty()) return;
    // 기존에 마커가 있으면 모두 지운다.
    textEdit->markerDeleteAll();
    //
    lineOfSearchedWords.clear();
    indexOfSearchedWords.clear();
    searchedWords.clear();
    //===================
    // 현재 커서 위치를 저장
    //===================
    int cur_line;
    long cur_pos = getCurrentPosition();
    int cur_index = 0;

    textEdit->lineIndexFromPosition(cur_pos, &cur_line, &cur_index);

    QString searchWord = _searchingWord;
    //======================
    // 파일 시작 부터 검색한다.
    //======================
    textEdit->setCursorPosition(0, 0);
    mFindFirst = textEdit->findFirst(_searchingWord, false, _caseSensitive, _wholeWordMatchOnly, false);
    //
    //
    int maxNumberOfFinds = 200;
    int count = 0;

    if(mFindFirst)
    {
        addLineIndexOfSearchedWord();
        count++;
    }
    else
    {
        emit searchingFailed();

        QString msg = QString("%1  검색되지 않습니다.").arg(searchWord);
        QMessageBox::information(this,"검색 실패", msg);
        return;
    }
    //
    while(textEdit->findNext())
    {
        addLineIndexOfSearchedWord();
        count++;
        if(count > maxNumberOfFinds)
        {
            QString msg = QString("%1 이(가) %2건 이상 검색되어 검색 작업을 중지합니다.").arg(searchWord).arg(maxNumberOfFinds);
            QMessageBox::information(this,"최대 검색 건수 도달", msg);
            break;
        }
    }
    //
    if(lineOfSearchedWords.isEmpty())
    {
        QString msg = QString("%1   이상 검색되지 않았습니다. 처음부터 다시 검색하시겠습니까?").arg(searchWord);
        if(QMessageBox::question(this,"검색 실패", msg)==QMessageBox::Yes)
        {
            textEdit->setCursorPosition(0, 0);
            find();
        }
    }
    else
    {
        emit searchingCompleted(lineOfSearchedWords, searchedWords);
        // 커서를  번째 검색 위치로 이동한다.
        textEdit->setCursorPosition(lineOfSearchedWords.first(), indexOfSearchedWords.first()-searchWord.size());
        // 검색된 라인에 마커를 설정해준다.
        setMarkerAtLines(lineOfSearchedWords);
    }

위 검색함수는 모든 검색 작업에서 활용할 수 있도록 설계되었다.


1-2. 임의의 텍스트 Replace 기능

임의의 텍스트를 다른 텍스트로 교체하는 Replace 기능이 아래와 같이 구현되었다.


    _searchingWord = searchingWord;
    _replacingWord = replacingWord;
    //
    int count = 0;
    bool find = textEdit->findFirst(_searchingWord, false, _caseSensitive, _wholeWordMatchOnly, false);
    //
    if(find)
    {
        QString msg = QString("%1을 모두 교체하시겠습니까?").arg(_searchingWord);
        if(QMessageBox::question(this,"교체 확인", msg)==QMessageBox::Yes)
        {
            textEdit->replace(_replacingWord);
            count++;
        }
        // 계속해서 다음 교체어 검색
        while(textEdit->findNext())
        {
            textEdit->replace(_replacingWord);
            count++;
        }
        // 재검색하여 교체된 내용을 반영한다.
        findAll();
        //
        msg = QString("%1 단어을(를) %2건 교체하였습니다.").arg(_searchingWord).arg(count);
        QMessageBox::information(this,"교체 완료", msg);
    }
    else
    {
        QString msg = QString("%1 단어를 찾지 못했습니다.").arg(_searchingWord);
        QMessageBox::information(this,"교체 실퍠", msg);

    }


1-3. 기타 기능

개발자 편의성 등을 고려한 기타 함수들이 개발되었다.











 

댓글

이 블로그의 인기 게시물

SPACE 코드 제어 계통도를 그림 파일로 변환하는 예시

Scintilla 라이브러리를 활용한 SPACE 코드 전용 에디터 AESPA 개발 [2일차]