From b8224808bdb6f9eaf94c066219634715703828da Mon Sep 17 00:00:00 2001 From: Alan Kilborn <77065706+alankilborn@users.noreply.github.com> Date: Tue, 5 Nov 2024 06:47:22 -0500 Subject: [PATCH] Add ability to open/copy selected files from Search-results Add ability to open/copy selected files from Search-results, not always ALL files. Fix #15741, close #15763 --- PowerEditor/installer/nativeLang/english.xml | 4 +- .../nativeLang/english_customizable.xml | 4 +- PowerEditor/src/Notepad_plus.cpp | 2 +- .../src/ScintillaComponent/FindReplaceDlg.cpp | 55 +++++++++++++------ .../src/ScintillaComponent/FindReplaceDlg.h | 2 +- .../ScintillaComponent/ScintillaEditView.cpp | 4 +- .../ScintillaComponent/ScintillaEditView.h | 4 +- 7 files changed, 48 insertions(+), 27 deletions(-) diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index 81948c429..2fc85af17 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -1719,9 +1719,9 @@ Find in all files but exclude all folders log or logs recursively: - + - + diff --git a/PowerEditor/installer/nativeLang/english_customizable.xml b/PowerEditor/installer/nativeLang/english_customizable.xml index 4731f5955..a3f7ee5b2 100644 --- a/PowerEditor/installer/nativeLang/english_customizable.xml +++ b/PowerEditor/installer/nativeLang/english_customizable.xml @@ -1717,9 +1717,9 @@ Find in all files but exclude all folders log or logs recursively: - + - + diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 722e11af5..ec7fdbfce 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -2055,7 +2055,7 @@ bool Notepad_plus::findInFinderFiles(FindersInfo *findInFolderInfo) _pEditView = &_invisibleEditView; Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); - vector fileNames = findInFolderInfo->_pSourceFinder->getResultFilePaths(); + vector fileNames = findInFolderInfo->_pSourceFinder->getResultFilePaths(false); findInFolderInfo->_pDestFinder->beginNewFilesSearch(); findInFolderInfo->_pDestFinder->addSearchLine(findInFolderInfo->_findOption._str2Search.c_str()); diff --git a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp index cbbc6cfe2..10f594ddf 100644 --- a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp @@ -682,24 +682,45 @@ void Finder::deleteResult() assert(size_t(_scintView.execute(SCI_GETLINECOUNT)) == _pMainFoundInfos->size() + 1); } -vector Finder::getResultFilePaths() const +vector Finder::getResultFilePaths(bool onlyInSelectedText) const { - vector paths; - size_t len = _pMainFoundInfos->size(); - for (size_t i = 0; i < len; ++i) + std::vector paths; + size_t fromLine = 0, toLine = 0; + + if (onlyInSelectedText) { - // make sure that path is not already in - wstring & path2add = (*_pMainFoundInfos)[i]._fullPath; - bool found = path2add.empty(); - for (size_t j = 0; j < paths.size() && !found; ++j) - { - if (paths[j] == path2add) - found = true; + const pair lineRange = _scintView.getSelectionLinesRange(); + fromLine = lineRange.first; + toLine = lineRange.second; + } + else + { + toLine = _scintView.execute(SCI_GETLINECOUNT) - 1; + } + for (size_t line = fromLine; line <= toLine; ++line) + { + const int lineFoldLevel = _scintView.execute(SCI_GETFOLDLEVEL, line) & SC_FOLDLEVELNUMBERMASK; + if (lineFoldLevel == fileHeaderLevel) + { + wstring lineStr = _scintView.getLine(line); + + // fileHeaderLevel line format examples: + // spacespaceD:\folder\file.ext (2 hits) + // spacespacenew 1 (1 hit) + const size_t startIndex = 2; // for number of leading spaces + auto endIndex = lineStr.find_last_of(L'('); + --endIndex; // adjust for space in front of ( + wstring path = lineStr.substr(startIndex, endIndex - startIndex); + + // make sure that path is not already in before adding + if (std::find(paths.begin(), paths.end(), path) == paths.end()) + { + paths.push_back(path); + } } - if (!found) - paths.push_back(path2add); } + return paths; } @@ -5350,7 +5371,7 @@ void Finder::removeAll() void Finder::openAll() { - for (auto&& path : getResultFilePaths()) + for (auto&& path : getResultFilePaths(true)) { ::SendMessage(_hParent, WM_DOOPEN, 0, reinterpret_cast(path.c_str())); } @@ -5359,7 +5380,7 @@ void Finder::openAll() void Finder::copyPathnames() { wstring toClipboard; - for (auto&& path : getResultFilePaths()) + for (auto&& path : getResultFilePaths(true)) { toClipboard += path + L"\r\n"; } @@ -5710,12 +5731,12 @@ intptr_t CALLBACK Finder::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam wstring copyLines = pNativeSpeaker->getLocalizedStrFromID("finder-copy", L"Copy Selected Line(s)"); wstring copyVerbatim = pNativeSpeaker->getNativeLangMenuString(IDM_EDIT_COPY, L"Copy", true); copyVerbatim += L"\tCtrl+C"; - wstring copyPaths = pNativeSpeaker->getLocalizedStrFromID("finder-copy-paths", L"Copy Pathname(s)"); + wstring copyPaths = pNativeSpeaker->getLocalizedStrFromID("finder-copy-paths", L"Copy Selected Pathname(s)"); wstring selectAll = pNativeSpeaker->getNativeLangMenuString(IDM_EDIT_SELECTALL, L"Select all", true); selectAll += L"\tCtrl+A"; wstring clearAll = pNativeSpeaker->getLocalizedStrFromID("finder-clear-all", L"Clear all"); wstring purgeForEverySearch = pNativeSpeaker->getLocalizedStrFromID("finder-purge-for-every-search", L"Purge for every search"); - wstring openAll = pNativeSpeaker->getLocalizedStrFromID("finder-open-all", L"Open all"); + wstring openAll = pNativeSpeaker->getLocalizedStrFromID("finder-open-all", L"Open Selected Pathname(s)"); wstring wrapLongLines = pNativeSpeaker->getLocalizedStrFromID("finder-wrap-long-lines", L"Word wrap long lines"); tmp.push_back(MenuItemUnit(NPPM_INTERNAL_FINDINFINDERDLG, findInFinder)); diff --git a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h index 8428cce95..62b438cc7 100644 --- a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h +++ b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.h @@ -143,7 +143,7 @@ public: void gotoNextFoundResult(int direction); std::pair gotoFoundLine(size_t nOccurrence = 0); // value 0 means this argument is not used void deleteResult(); - std::vector getResultFilePaths() const; + std::vector getResultFilePaths(bool onlyInSelectedText) const; bool canFind(const wchar_t *fileName, size_t lineNumber, size_t* indexToStartFrom) const; void setVolatiled(bool val) { _canBeVolatiled = val; }; std::wstring getHitsString(int count) const; diff --git a/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp index a99e61e58..cbd5ea15d 100644 --- a/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp @@ -2801,7 +2801,7 @@ void ScintillaEditView::showCallTip(size_t startPos, const wchar_t * def) execute(SCI_CALLTIPSHOW, startPos, reinterpret_cast(defA)); } -wstring ScintillaEditView::getLine(size_t lineNumber) +wstring ScintillaEditView::getLine(size_t lineNumber) const { size_t lineLen = execute(SCI_LINELENGTH, lineNumber); const size_t bufSize = lineLen + 1; @@ -2810,7 +2810,7 @@ wstring ScintillaEditView::getLine(size_t lineNumber) return buf.get(); } -void ScintillaEditView::getLine(size_t lineNumber, wchar_t * line, size_t lineBufferLen) +void ScintillaEditView::getLine(size_t lineNumber, wchar_t * line, size_t lineBufferLen) const { // make sure the buffer length is enough to get the whole line size_t lineLen = execute(SCI_LINELENGTH, lineNumber); diff --git a/PowerEditor/src/ScintillaComponent/ScintillaEditView.h b/PowerEditor/src/ScintillaComponent/ScintillaEditView.h index b1326ff90..fadc47bc6 100644 --- a/PowerEditor/src/ScintillaComponent/ScintillaEditView.h +++ b/PowerEditor/src/ScintillaComponent/ScintillaEditView.h @@ -476,8 +476,8 @@ public: intptr_t replaceTargetRegExMode(const wchar_t * re, intptr_t fromTargetPos = -1, intptr_t toTargetPos = -1) const; void showAutoComletion(size_t lenEntered, const wchar_t * list); void showCallTip(size_t startPos, const wchar_t * def); - std::wstring getLine(size_t lineNumber); - void getLine(size_t lineNumber, wchar_t * line, size_t lineBufferLen); + std::wstring getLine(size_t lineNumber) const; + void getLine(size_t lineNumber, wchar_t * line, size_t lineBufferLen) const; void addText(size_t length, const char *buf); void insertNewLineAboveCurrentLine();