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. 기타 기능
개발자 편의성 등을 고려한 기타 함수들이 개발되었다.
댓글
댓글 쓰기