From 4b637b4fc8d300c6106b03cd865c78a4af1c4e26 Mon Sep 17 00:00:00 2001 From: Alan Kilborn <77065706+alankilborn@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:23:52 -0500 Subject: [PATCH] Fix wrong replace all while 2nd time replace in selection Prevent search from running with unintended "In selection" parameter. Fix #14897, fix #14624, fix #15992, close #15995 --- PowerEditor/installer/nativeLang/english.xml | 4 +- .../nativeLang/english_customizable.xml | 4 +- .../src/ScintillaComponent/FindReplaceDlg.cpp | 40 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index a327a612c..36c7afd40 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -1514,7 +1514,7 @@ Do you want to continue?"/> please give another one."/> - + + diff --git a/PowerEditor/installer/nativeLang/english_customizable.xml b/PowerEditor/installer/nativeLang/english_customizable.xml index baeb2d463..7c0173c15 100644 --- a/PowerEditor/installer/nativeLang/english_customizable.xml +++ b/PowerEditor/installer/nativeLang/english_customizable.xml @@ -1512,7 +1512,7 @@ Do you want to continue?"/> please give another one."/> - + + diff --git a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp index c68d36c41..db26aaaa2 100644 --- a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp @@ -1692,6 +1692,8 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA case WM_ACTIVATE : { + bool isInSelectionAutoChange = false; + if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) { Sci_CharacterRangeFull cr = (*_ppEditView)->getSelection(); @@ -1709,6 +1711,7 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA enableFindDlgItem(IDC_IN_SELECTION_CHECK, inSelEnabled); bool inSelChecked = isCheckedOrNot(IDC_IN_SELECTION_CHECK); + bool origInSelChecked = inSelChecked; const NppGUI& nppGui = (NppParameters::getInstance()).getNppGUI(); if (nppGui._inSelectionAutocheckThreshold != 0) @@ -1720,6 +1723,29 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA setChecked(IDC_IN_SELECTION_CHECK, inSelChecked); } + /* + In the scenario where the user clicks the action button (Count, + Find All in Current Document, Replace All, Mark All, or Clear All marks) + without activating the Find/Replace dialog, the "In Selection" checkbox could + be auto-changed after the button click. To prevent the search from running with + this unintended state, the search message has been removed from the queue. + Then, launch a message box to alert the user that the search didn't run and + they need to verify the settings. + */ + if (inSelChecked != origInSelChecked) + { + const std::vector inSelActionIds = { IDCCOUNTALL, IDC_FINDALL_CURRENTFILE, IDREPLACEALL, IDCMARKALL, IDC_CLEAR_ALL }; + for (const auto& id : inSelActionIds) + { + MSG msg; + if (PeekMessage(&msg, ::GetDlgItem(_hSelf, id), 0, 0, PM_REMOVE)) + { + isInSelectionAutoChange = true; + break; + } + } + } + _options._isInSelection = inSelEnabled && inSelChecked; } @@ -1746,7 +1772,21 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA { enableFindDlgItem(IDREDOTMATCHNL, false); } + enableProjectCheckmarks(); + + if (isInSelectionAutoChange) + { + NppParameters& nppParamInst = NppParameters::getInstance(); + (nppParamInst.getNativeLangSpeaker())->messageBox( + "FindAutoChangeOfInSelectionWarning", + _hSelf, + L"The \"In selection\" checkbox state has been automatically modified.\r\n" + L"Please verify the search condition before performing the action.", + L"Search warning", + MB_OK | MB_APPLMODAL); + } + return 0; }