From 67b31f7a41b95dd7c8d6ea0457e9b91ca45ac6f0 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 30 May 2018 17:33:03 +0200 Subject: [PATCH 1/2] + fix: 2nd try to fix incremental search on F/R dialog vs. unintentional opening --- src/Edit.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 4d0dc272d..a61577ebb 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4527,7 +4527,6 @@ static void __fastcall _SetSearchFlags(HWND hwnd, LPEDITFINDREPLACE lpefr) bool bIsFindDlg = (GetDlgItem(g_hwndDlgFindReplace, IDC_REPLACE) == NULL); - GetDlgItemTextW2MB(hwnd, IDC_FINDTEXT, szBuf, COUNTOF(szBuf)); if (StringCchCompareXA(szBuf, lpefr->szFind) != 0) { StringCchCopyNA(lpefr->szFind, COUNTOF(lpefr->szFind), szBuf, COUNTOF(szBuf)); @@ -4938,7 +4937,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA static DocPos s_InitialSearchStart = 0; static DocLn s_InitialTopLine = -1; - static RegExResult_t regexMatch = INVALID; + static RegExResult_t regexMatch = NO_MATCH; static COLORREF rgbRed = RGB(255, 170, 170); static COLORREF rgbGreen = RGB(170, 255, 170); @@ -5003,7 +5002,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA //SHAutoComplete(infoR.hwndItem, SHACF_DEFAULT); SHAutoComplete(infoR.hwndItem, SHACF_FILESYS_ONLY | SHACF_AUTOAPPEND_FORCE_OFF | SHACF_AUTOSUGGEST_FORCE_OFF); - SetDlgItemTextMB2W(hwnd, IDC_REPLACETEXT, sg_pefrData->szReplace); } @@ -5099,6 +5097,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA bSwitchedFindReplace = false; CopyMemory(sg_pefrData, &efrSave, sizeof(EDITFINDREPLACE)); } + _SetSearchFlags(hwnd, sg_pefrData); // sync HMENU hmenu = GetSystemMenu(hwnd, false); GetString(IDS_SAVEPOS, tchBuf, COUNTOF(tchBuf)); @@ -5111,12 +5110,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA hBrushGreen = CreateSolidBrush(rgbGreen); hBrushBlue = CreateSolidBrush(rgbBlue); - s_InitialSearchStart = SciCall_GetSelectionStart(); - SetTimer(hwnd, IDT_TIMER_MRKALL, USER_TIMER_MINIMUM, MQ_ExecuteNext); - - _SetSearchFlags(hwnd, sg_pefrData); - _DelayMarkAll(hwnd, 50, s_InitialSearchStart); } return true; @@ -5146,6 +5140,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA SciCall_SetFirstVisibleLine(s_InitialTopLine); s_InitialTopLine = -1; } + else { + EditEnsureSelectionVisible(g_hwndEdit); + } CmdMessageQueue_t* pmqc = NULL; CmdMessageQueue_t* dummy; @@ -5184,11 +5181,10 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA s_InitialTopLine = SciCall_DocLineFromVisible(SciCall_GetFirstVisibleLine()); } + EditEnsureSelectionVisible(g_hwndEdit); + DialogEnableWindow(hwnd, IDC_REPLACEINSEL, !SciCall_IsSelectionEmpty()); - if (sg_pefrData->bMarkOccurences) { - _DelayMarkAll(hwnd, 50, s_InitialSearchStart); - } break; } } @@ -5209,10 +5205,11 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA case IDC_FINDTEXT: case IDC_REPLACETEXT: { + static char szFind[FNDRPL_BUFFER] = { '\0' }; + if (g_bFindReplCopySelOrClip) { char *lpszSelection = NULL; - char szFind[FNDRPL_BUFFER] = { '\0' }; tchBuf[0] = L'\0'; DocPos cchSelection = (DocPos)SendMessage(sg_pefrData->hwnd, SCI_GETSELTEXT, 0, (LPARAM)NULL); @@ -5259,12 +5256,18 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA MRU_Enum(g_pMRUfind, 0, tchBuf, COUNTOF(tchBuf)); } SetDlgItemText(hwnd, IDC_FINDTEXT, tchBuf); - GetDlgItemTextW2MB(hwnd, IDC_FINDTEXT, szFind, FNDRPL_BUFFER); } g_bFindReplCopySelOrClip = false; } + char szCmpBuf[FNDRPL_BUFFER] = { '\0' }; + GetDlgItemTextW2MB(hwnd, IDC_FINDTEXT, szCmpBuf, FNDRPL_BUFFER); + if ((StringCchCompareXA(szCmpBuf, szFind) != 0)) { + s_InitialTopLine = -1; + StringCchCopyNA(szFind, FNDRPL_BUFFER, szCmpBuf, FNDRPL_BUFFER); + } + bool bEnableF = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT)) || CB_ERR != SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_GETCURSEL, 0, 0)); @@ -5285,9 +5288,10 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA SendDlgItemMessage(hwnd, LOWORD(wParam), CB_GETEDITSEL, 0, (LPARAM)&lSelEnd); SendDlgItemMessage(hwnd, LOWORD(wParam), CB_SETEDITSEL, 0, MAKELPARAM(lSelEnd, lSelEnd)); } - - _SetSearchFlags(hwnd, sg_pefrData); - _DelayMarkAll(hwnd, 50, s_InitialSearchStart); + if (HIWORD(wParam) == CBN_EDITCHANGE) { + _SetSearchFlags(hwnd, sg_pefrData); + _DelayMarkAll(hwnd, 50, s_InitialSearchStart); + } } break; @@ -5308,7 +5312,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, true); if (match != MATCH) { EditClearAllOccurrenceMarkers(g_hwndEdit); - if (s_InitialTopLine >= 0) { SciCall_SetFirstVisibleLine(s_InitialTopLine); } + if (s_InitialTopLine >= 0) { + SciCall_SetFirstVisibleLine(s_InitialTopLine); + } + else { + EditEnsureSelectionVisible(g_hwndEdit); + } } if (EditToggleView(g_hwndEdit, false)) { EditHideNotMarkedLineRange(g_hwndEdit, -1, -1, true); } _OBSERVE_NOTIFY_CHANGE_; @@ -5361,6 +5370,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (EditToggleView(g_hwndEdit, false)) { EditToggleView(g_hwndEdit, true); sg_pefrData->bStateChanged = true; + s_InitialTopLine = -1; EditClearAllOccurrenceMarkers(g_hwndEdit); _DelayMarkAll(hwnd, 0, s_InitialSearchStart); } From aa84fdc05ab4558efd75e0afa99c2602a8fea254 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 31 May 2018 01:41:20 +0200 Subject: [PATCH 2/2] + fix: addendum incremental search on F/R dialog vs. unintentional opening --- src/Edit.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index a61577ebb..5b156d4eb 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4864,6 +4864,7 @@ static RegExResult_t __fastcall _FindHasMatch(HWND hwnd, LPCEDITFINDREPLACE lpef { char szFind[FNDRPL_BUFFER]; DocPos slen = _EditGetFindStrg(hwnd, lpefr, szFind, COUNTOF(szFind)); + if (slen == 0) { return NO_MATCH; } const DocPos iStart = bFirstMatchOnly ? iStartPos : 0; const DocPos iTextEnd = Sci_GetDocEndPosition(); @@ -4935,9 +4936,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { static LPEDITFINDREPLACE sg_pefrData = NULL; static DocPos s_InitialSearchStart = 0; + static DocPos s_InitialAnchorPos = 0; + static DocPos s_InitialCaretPos = 0; static DocLn s_InitialTopLine = -1; - static RegExResult_t regexMatch = NO_MATCH; + static RegExResult_t s_anyMatch = NO_MATCH; + static RegExResult_t s_fwrdMatch = NO_MATCH; static COLORREF rgbRed = RGB(255, 170, 170); static COLORREF rgbGreen = RGB(170, 255, 170); @@ -4989,9 +4993,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA //SHAutoComplete(infoF.hwndItem, SHACF_DEFAULT); SHAutoComplete(infoF.hwndItem, SHACF_FILESYS_ONLY | SHACF_AUTOAPPEND_FORCE_OFF | SHACF_AUTOSUGGEST_FORCE_OFF); - if (!GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT))) + if (!GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT))) { SetDlgItemTextMB2W(hwnd, IDC_FINDTEXT, sg_pefrData->szFind); - + } if (GetDlgItem(hwnd, IDC_REPLACETEXT)) { SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_LIMITTEXT, FNDRPL_BUFFER, 0); @@ -5098,6 +5102,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA CopyMemory(sg_pefrData, &efrSave, sizeof(EDITFINDREPLACE)); } _SetSearchFlags(hwnd, sg_pefrData); // sync + s_anyMatch = s_fwrdMatch = NO_MATCH; HMENU hmenu = GetSystemMenu(hwnd, false); GetString(IDS_SAVEPOS, tchBuf, COUNTOF(tchBuf)); @@ -5141,6 +5146,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA s_InitialTopLine = -1; } else { + if (s_fwrdMatch == NO_MATCH) { + EditSelectEx(g_hwndEdit, s_InitialAnchorPos, s_InitialCaretPos, -1, -1); + } EditEnsureSelectionVisible(g_hwndEdit); } @@ -5174,10 +5182,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA // mouse click activation case WA_ACTIVE: default: - + s_fwrdMatch = NO_MATCH; s_InitialSearchStart = SciCall_GetSelectionStart(); if (s_InitialTopLine < 0) { + s_InitialAnchorPos = SciCall_GetAnchor(); + s_InitialCaretPos = SciCall_GetCurrentPos(); s_InitialTopLine = SciCall_DocLineFromVisible(SciCall_GetFirstVisibleLine()); } @@ -5259,6 +5269,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA GetDlgItemTextW2MB(hwnd, IDC_FINDTEXT, szFind, FNDRPL_BUFFER); } g_bFindReplCopySelOrClip = false; + s_anyMatch = s_fwrdMatch = NO_MATCH; } char szCmpBuf[FNDRPL_BUFFER] = { '\0' }; @@ -5283,6 +5294,8 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA DialogEnableWindow(hwnd, IDC_REPLACEINSEL, bEnableF && bEnableIS); DialogEnableWindow(hwnd, IDC_SWAPSTRG, bEnableF || bEnableR); + if (!bEnableF) { s_anyMatch = s_fwrdMatch = NO_MATCH; } + if (HIWORD(wParam) == CBN_CLOSEUP) { LONG lSelEnd; SendDlgItemMessage(hwnd, LOWORD(wParam), CB_GETEDITSEL, 0, (LPARAM)&lSelEnd); @@ -5304,18 +5317,19 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (EditToggleView(g_hwndEdit, false)) { _DeleteLineStateAll(LINESTATE_OCCURRENCE_MARK); } StringCchCopyA(g_lastFind, COUNTOF(g_lastFind), sg_pefrData->szFind); RegExResult_t match = _FindHasMatch(g_hwndEdit, sg_pefrData, 0, (sg_pefrData->bMarkOccurences), false); - if (regexMatch != match) { regexMatch = match; } + 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; - _FindHasMatch(g_hwndEdit, sg_pefrData, iStartPos, false, true); + s_fwrdMatch = _FindHasMatch(g_hwndEdit, sg_pefrData, iStartPos, false, true); sg_pefrData->bStateChanged = false; InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, true); if (match != MATCH) { - EditClearAllOccurrenceMarkers(g_hwndEdit); + EditClearAllOccurrenceMarkers(g_hwndEdit); if (s_InitialTopLine >= 0) { SciCall_SetFirstVisibleLine(s_InitialTopLine); } else { + EditSelectEx(g_hwndEdit, s_InitialAnchorPos, s_InitialCaretPos, -1, -1); EditEnsureSelectionVisible(g_hwndEdit); } } @@ -5535,6 +5549,8 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (!SciCall_IsSelectionEmpty()) { EditJumpToSelectionEnd(hwnd); } EditFindNext(sg_pefrData->hwnd, sg_pefrData, (LOWORD(wParam) == IDACC_SELTONEXT), HIBYTE(GetKeyState(VK_F3))); s_InitialSearchStart = SciCall_GetSelectionStart(); + s_InitialAnchorPos = SciCall_GetAnchor(); + s_InitialCaretPos = SciCall_GetCurrentPos(); s_InitialTopLine = -1; break; @@ -5544,6 +5560,8 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (!SciCall_IsSelectionEmpty()) { EditJumpToSelectionStart(hwnd); } EditFindPrev(sg_pefrData->hwnd, sg_pefrData, (LOWORD(wParam) == IDACC_SELTOPREV), HIBYTE(GetKeyState(VK_F3))); s_InitialSearchStart = SciCall_GetSelectionStart(); + s_InitialAnchorPos = SciCall_GetAnchor(); + s_InitialCaretPos = SciCall_GetCurrentPos(); s_InitialTopLine = -1; break; @@ -5712,7 +5730,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (hCheck == ci.hwndItem) { SetBkMode(hDC, TRANSPARENT); INT_PTR hBrush; - switch (regexMatch) { + switch (s_anyMatch) { case MATCH: //SetTextColor(hDC, green); SetBkColor(hDC, rgbGreen);