diff --git a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp index 9fa697db5..6a15cfa5f 100644 --- a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp @@ -664,15 +664,18 @@ vector Finder::getResultFilePaths() const return paths; } -bool Finder::canFind(const TCHAR *fileName, size_t lineNumber) const +bool Finder::canFind(const TCHAR *fileName, size_t lineNumber, size_t* indexToStartFrom) const { size_t len = _pMainFoundInfos->size(); - for (size_t i = 0; i < len; ++i) + for (size_t i = *indexToStartFrom; i < len; ++i) { if ((*_pMainFoundInfos)[i]._fullPath == fileName) { if (lineNumber == (*_pMainFoundInfos)[i]._lineNumber) + { + *indexToStartFrom = i; return true; + } } } return false; @@ -2738,6 +2741,10 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl bool findAllFileNameAdded = false; + // A temporary string which is used to populate the search result window + std::unique_ptr text2AddUtf8(new std::string()); + size_t indexBuffer = 0; + while (targetStart >= 0) { targetStart = pEditView->searchInTarget(pTextFind, stringSizeFind, findReplaceInfo._startRange, findReplaceInfo._endRange); @@ -2794,8 +2801,15 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl SearchResultMarkingLine srml; srml._segmentPostions.push_back(std::pair(start_mark, end_mark)); - _pFinder->add(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber); + text2AddUtf8->append(_pFinder->foundLine(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber)); + if (text2AddUtf8->length() > FINDTEMPSTRING_MAXSIZE) + { + _pFinder->setFinderReadOnly(false); + _pFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast(text2AddUtf8->c_str())); + _pFinder->setFinderReadOnly(true); + text2AddUtf8->clear(); + } break; } @@ -2828,7 +2842,7 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl SearchResultMarkingLine srml; srml._segmentPostions.push_back(std::pair(start_mark, end_mark)); - processed = (!pOptions->_isMatchLineNumber) || (pFindersInfo->_pSourceFinder->canFind(pFileName, lineNumber + 1)); + processed = (!pOptions->_isMatchLineNumber) || (pFindersInfo->_pSourceFinder->canFind(pFileName, lineNumber + 1, &indexBuffer)); if (processed) { if (!findAllFileNameAdded) //add new filetitle in hits if we haven't already @@ -2836,7 +2850,15 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl pFindersInfo->_pDestFinder->addFileNameTitle(pFileName); findAllFileNameAdded = true; } - pFindersInfo->_pDestFinder->add(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber); + text2AddUtf8->append(pFindersInfo->_pDestFinder->foundLine(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber)); + + if (text2AddUtf8->length() > FINDTEMPSTRING_MAXSIZE) + { + pFindersInfo->_pDestFinder->setFinderReadOnly(false); + pFindersInfo->_pDestFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast(text2AddUtf8->c_str())); + pFindersInfo->_pDestFinder->setFinderReadOnly(true); + text2AddUtf8->clear(); + } } break; } @@ -2947,12 +2969,22 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl Finder *pFinder = nullptr; if (op == ProcessFindAll) { + _pFinder->setFinderReadOnly(false); + _pFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast(text2AddUtf8->c_str())); + _pFinder->setFinderReadOnly(true); + text2AddUtf8->clear(); pFinder = _pFinder; } else if (op == ProcessFindInFinder) { if (pFindersInfo && pFindersInfo->_pDestFinder) + { + pFindersInfo->_pDestFinder->setFinderReadOnly(false); + pFindersInfo->_pDestFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast(text2AddUtf8->c_str())); + pFindersInfo->_pDestFinder->setFinderReadOnly(true); + text2AddUtf8->clear(); pFinder = pFindersInfo->_pDestFinder; + } else pFinder = _pFinder; } @@ -4467,7 +4499,7 @@ void Finder::addSearchHitCount(int count, int countSearched, bool isMatchLines, setFinderReadOnly(true); } -void Finder::add(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foundline, size_t totalLineNumber) +const char* Finder::foundLine(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foundline, size_t totalLineNumber) { bool isRepeatedLine = false; @@ -4514,6 +4546,7 @@ void Finder::add(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foun // Add start and end markers into the previous line's info for colourizing _pMainMarkings->back()._segmentPostions.push_back(std::pair(miLine._segmentPostions[0].first, miLine._segmentPostions[0].second)); _pMainFoundInfos->back()._ranges.push_back(fi._ranges.back()); + return ""; } else // default mode: allow same found line has several entries in search result if the searched occurrence is matched several times in the same line { @@ -4533,10 +4566,9 @@ void Finder::add(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foun len = cut + lenEndOfLongLine; } - setFinderReadOnly(false); - _scintView.execute(SCI_ADDTEXT, len, reinterpret_cast(text2AddUtf8)); - setFinderReadOnly(true); _pMainMarkings->push_back(miLine); + + return text2AddUtf8; } } diff --git a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h index 8506a50c5..8873ba9aa 100644 --- a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h +++ b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h @@ -29,6 +29,8 @@ #define FINDREPLACE_MAXLENGTH 2048 +#define FINDTEMPSTRING_MAXSIZE 1024*1024 + enum DIALOG_TYPE {FIND_DLG, REPLACE_DLG, FINDINFILES_DLG, FINDINPROJECTS_DLG, MARK_DLG}; #define DIR_DOWN true @@ -121,7 +123,7 @@ public: void addFileNameTitle(const TCHAR * fileName); void addFileHitCount(int count); void addSearchHitCount(int count, int countSearched, bool isMatchLines, bool searchedEntireNotSelection); - void add(FoundInfo fi, SearchResultMarkingLine mi, const TCHAR* foundline, size_t totalLineNumber); + const char* foundLine(FoundInfo fi, SearchResultMarkingLine mi, const TCHAR* foundline, size_t totalLineNumber); void setFinderStyle(); void removeAll(); void openAll(); @@ -136,7 +138,7 @@ public: std::pair gotoFoundLine(size_t nOccurrence = 0); // value 0 means this argument is not used void deleteResult(); std::vector getResultFilePaths() const; - bool canFind(const TCHAR *fileName, size_t lineNumber) const; + bool canFind(const TCHAR *fileName, size_t lineNumber, size_t* indexToStartFrom) const; void setVolatiled(bool val) { _canBeVolatiled = val; }; generic_string getHitsString(int count) const;