From e2487e389135feb9716bb67d8e81eeaaa3a1c887 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 6 Dec 2018 17:52:52 +0100 Subject: [PATCH] + fix: behavior of replace (dialog) in case of multi-line selection --- src/Edit.c | 25 ++++++++++--------------- src/SciCall.h | 2 +- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 5c4a797ce..489ac09b0 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4972,7 +4972,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA static int iSaveMarkOcc = -1; static bool bSaveOccVisible = false; static bool bSaveTFBackSlashes = false; - static bool _bRestoreMarkOcc = true; WCHAR tchBuf[FNDRPL_BUFFER] = { L'\0' }; @@ -4994,7 +4993,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA iSaveMarkOcc = s_bSwitchedFindReplace ? iSaveMarkOcc : Settings.MarkOccurrences; bSaveOccVisible = s_bSwitchedFindReplace ? bSaveOccVisible : Settings.MarkOccurrencesMatchVisible; - _bRestoreMarkOcc = sg_pefrData->bMarkOccurences; //const WORD wTabSpacing = (WORD)SendMessage(sg_pefrData->hwnd, SCI_GETTABWIDTH, 0, 0);; // dialog box units //SendDlgItemMessage(hwnd, IDC_FINDTEXT, EM_SETTABSTOPS, 1, (LPARAM)&wTabSpacing); @@ -5015,9 +5013,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA COMBOBOXINFO infoF = { sizeof(COMBOBOXINFO) }; GetComboBoxInfo(GetDlgItem(hwnd, IDC_FINDTEXT), &infoF); //SHAutoComplete(infoF.hwndItem, SHACF_DEFAULT); - if (infoF.hwndItem) + if (infoF.hwndItem) { SHAutoComplete(infoF.hwndItem, SHACF_FILESYS_ONLY | SHACF_AUTOAPPEND_FORCE_OFF | SHACF_AUTOSUGGEST_FORCE_OFF); - + } if (!GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT))) { SetDlgItemTextMB2W(hwnd, IDC_FINDTEXT, sg_pefrData->szFind); } @@ -5064,12 +5062,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA DialogEnableWindow(hwnd, IDC_DOT_MATCH_ALL, false); } - // switch off "mark all occ" in case of initial replace dialog on multiline selection - if (GetDlgItem(hwnd, IDC_REPLACE) && !s_bSwitchedFindReplace) { - if (Sci_IsMultiLineSelection()) { - sg_pefrData->bMarkOccurences = false; - } - } if (sg_pefrData->bMarkOccurences) { Settings.MarkOccurrences = 0; Settings.MarkOccurrencesMatchVisible = false; @@ -5145,6 +5137,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA hBrushBlue = CreateSolidBrush(rgbBlueColorRef); SetTimer(hwnd, IDT_TIMER_MRKALL, USER_TIMER_MINIMUM, MQ_ExecuteNext); + _DelayMarkAll(hwnd, 0, s_InitialSearchStart); } return true; @@ -5163,7 +5156,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA } } sg_pefrData->szFind[0] = '\0'; - sg_pefrData->bMarkOccurences = _bRestoreMarkOcc; Settings.MarkOccurrences = iSaveMarkOcc; Settings.MarkOccurrencesMatchVisible = bSaveOccVisible; @@ -5265,7 +5257,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA tchBuf[0] = L'\0'; DocPos const cchSelection = SciCall_GetSelText(NULL); - if (1 < cchSelection) { + if ((1 < cchSelection) && !(GetDlgItem(hwnd, IDC_REPLACE) && Sci_IsMultiLineSelection())) { lpszSelection = AllocMem(cchSelection, HEAP_ZERO_MEMORY); SciCall_GetSelText(lpszSelection); } @@ -5369,7 +5361,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (s_anyMatch != match) { s_anyMatch = match; } // we have to set Sci's regex instance to first find (have substitution in place) DocPos const iStartPos = (DocPos)lParam; - s_fwrdMatch = _FindHasMatch(Globals.hwndEdit, sg_pefrData, iStartPos, false, true); + if (!GetDlgItem(hwnd, IDC_REPLACE) || !Sci_IsMultiLineSelection()) { + s_fwrdMatch = _FindHasMatch(Globals.hwndEdit, sg_pefrData, iStartPos, false, true); + } + else { + s_fwrdMatch = match; + } sg_pefrData->bStateChanged = false; InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, true); if (match != MATCH) { @@ -5401,7 +5398,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { iSaveMarkOcc = Settings.MarkOccurrences; bSaveOccVisible = Settings.MarkOccurrencesMatchVisible; - _bRestoreMarkOcc = true; Settings.MarkOccurrences = 0; Settings.MarkOccurrencesMatchVisible = false; @@ -5414,7 +5410,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA else { // switched OFF Settings.MarkOccurrences = iSaveMarkOcc; Settings.MarkOccurrencesMatchVisible = bSaveOccVisible; - _bRestoreMarkOcc = false; //DialogEnableWindow(hwnd, IDC_TOGGLE_VISIBILITY, (Settings.MarkOccurrences > 0) && !Settings.MarkOccurrencesMatchVisible); DialogEnableWindow(hwnd, IDC_TOGGLE_VISIBILITY, false); if (EditToggleView(Globals.hwndEdit, false)) { diff --git a/src/SciCall.h b/src/SciCall.h index d3f4874ba..0f7a81c40 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -470,7 +470,7 @@ DeclareSciCallR0(IsSelectionEmpty, GETSELECTIONEMPTY, bool) DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, bool) #define Sci_IsSingleLineSelection() (SciCall_LineFromPosition(SciCall_GetSelectionEnd()) == SciCall_LineFromPosition(SciCall_GetSelectionStart())) -#define Sci_IsMultiLineSelection() ((SciCall_LineFromPosition(SciCall_GetSelectionEnd()) - SciCall_LineFromPosition(SciCall_GetSelectionStart())) >= 1) +#define Sci_IsMultiLineSelection() ((SciCall_LineFromPosition(SciCall_GetSelectionEnd()) - SciCall_LineFromPosition(SciCall_GetSelectionStart())) > 1) #define Sci_IsForwardSelection() (SciCall_GetAnchor() <= SciCall_GetCurrentPos())