diff --git a/src/Edit.c b/src/Edit.c index fe475d669..54fa67f36 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4889,7 +4889,7 @@ static RegExResult_t __fastcall _FindHasMatch(HWND hwnd, LPCEDITFINDREPLACE lpef else // mark all matches { if (bMarkAll && (iPos >= 0)) { - EditClearAllMarks(hwnd, (DocPos)0, iTextLength); + EditClearAllOccurrenceMarkers(hwnd, (DocPos)0, iTextLength); EditMarkAll(hwnd, szFind, (int)(lpefr->fuFlags), (DocPos)0, iTextLength, false, false, bMarkAll); } } @@ -5032,7 +5032,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA else { CheckDlgButton(hwnd, IDC_ALL_OCCURRENCES, BST_UNCHECKED); DialogEnableWindow(hwnd, IDC_TOGGLE_VISIBILITY, false); - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); } EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_VISIBLE, bMarkOccurrencesMatchVisible); @@ -5107,13 +5107,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { sg_pefrData->szFind[0] = '\0'; - EditClearAllMarks(g_hwndEdit, 0, -1); - if (bHideNonMatchedLines) { - EditApplyLexerStyle(g_hwndEdit, 0, -1); - bHideNonMatchedLines = false; + SendMessage(hwnd, WM_COMMAND, MAKELONG(IDC_TOGGLE_VISIBILITY, 1), 0); + } + if (sg_pefrData->bMarkOccurences) { + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); } - iMarkOccurrences = iSaveMarkOcc; bMarkOccurrencesMatchVisible = bSaveOccVisible; g_bCodeFoldingAvailable = bSaveFoldingAvailable; @@ -5316,7 +5315,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA sg_pefrData->bStateChanged = true; } DialogEnableWindow(hwnd, IDC_TOGGLE_VISIBILITY, false); - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, true); } EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, (iMarkOccurrences > 0)); @@ -5334,7 +5333,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA bHideNonMatchedLines = bHideNonMatchedLines ? false : true; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); sg_pefrData->bStateChanged = true; // force if (bHideNonMatchedLines) { @@ -5902,8 +5901,14 @@ void EditMarkAllOccurrences() if (EditIsInTargetTransaction()) { return; } // do not block, next event occurs for sure - BeginWaitCursor(NULL); - IgnoreNotifyChangeEvent(); + bool bWaitCursor = false; + if (iMarkOccurrencesCount > 2000) { + BeginWaitCursor(NULL); + bWaitCursor = true; + } + else { + IgnoreNotifyChangeEvent(); + } EditEnterTargetTransaction(); if (bMarkOccurrencesMatchVisible) @@ -5926,9 +5931,13 @@ void EditMarkAllOccurrences() UpdateStatusbar(); } EditLeaveTargetTransaction(); - ObserveNotifyChangeEvent(); - EndWaitCursor(); + if (bWaitCursor) { + EndWaitCursor(); + } + else { + ObserveNotifyChangeEvent(); + } } else { iMarkOccurrencesCount = 0; @@ -6233,10 +6242,11 @@ bool EditReplaceAllInSelection(HWND hwnd, LPCEDITFINDREPLACE lpefr, bool bShowIn //============================================================================= // -// EditClearAllMarks() +// EditClearAllOccurrenceMarkers() // -void EditClearAllMarks(HWND hwnd, DocPos iRangeStart, DocPos iRangeEnd) +void EditClearAllOccurrenceMarkers(HWND hwnd, DocPos iRangeStart, DocPos iRangeEnd) { + IgnoreNotifyChangeEvent(); if (iRangeStart < 0) { iRangeStart = 0; } @@ -6253,6 +6263,7 @@ void EditClearAllMarks(HWND hwnd, DocPos iRangeStart, DocPos iRangeEnd) for (DocLn iLine = SciCall_LineFromPosition(iRangeStart); iLine <= iEndLine; ++iLine) { SciCall_MarkerDelete(iLine, MARKER_NP3_OCCUR_LINE); } + ObserveNotifyChangeEvent(); } diff --git a/src/Edit.h b/src/Edit.h index 2c0576a7f..dae6a689a 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -97,7 +97,7 @@ bool EditPrint(HWND,LPCWSTR,LPCWSTR); void EditPrintSetup(HWND); void EditPrintInit(); void EditMatchBrace(HWND); -void EditClearAllMarks(HWND, DocPos, DocPos); +void EditClearAllOccurrenceMarkers(HWND, DocPos, DocPos); void EditMarkAll(HWND, char*, int, DocPos, DocPos, bool, bool, bool); void EditUpdateUrlHotspots(HWND, DocPos, DocPos, bool); void EditSetAccelWordNav(HWND,bool); diff --git a/src/Notepad3.c b/src/Notepad3.c index 424ca1097..2f4ddee2c 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -1071,7 +1071,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) // update Scintilla colors case WM_SYSCOLORCHANGE: UpdateLineNumberWidth(); - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(0); UpdateVisibleUrlHotspot(0); return DefWindowProc(hwnd,umsg,wParam,lParam); @@ -1797,7 +1797,7 @@ void MsgThemeChanged(HWND hwnd,WPARAM wParam,LPARAM lParam) UpdateToolbar(); UpdateStatusbar(); UpdateLineNumberWidth(); - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(0); EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); EditFinalizeStyling(g_hwndEdit, -1); @@ -4231,46 +4231,46 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_VIEW_ACCELWORDNAV: bAccelWordNavigation = (bAccelWordNavigation) ? false : true; // toggle EditSetAccelWordNav(g_hwndEdit,bAccelWordNavigation); - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); break; case IDM_VIEW_MARKOCCUR_ONOFF: iMarkOccurrences = (iMarkOccurrences == 0) ? max(1, IniGetInt(L"Settings", L"MarkOccurrences", 1)) : 0; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(0); break; case IDM_VIEW_MARKOCCUR_VISIBLE: bMarkOccurrencesMatchVisible = (bMarkOccurrencesMatchVisible) ? false : true; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(0); break; case IDM_VIEW_MARKOCCUR_CASE: bMarkOccurrencesMatchCase = (bMarkOccurrencesMatchCase) ? false : true; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); break; case IDM_VIEW_MARKOCCUR_WNONE: bMarkOccurrencesMatchWords = false; bMarkOccurrencesCurrentWord = false; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); break; case IDM_VIEW_MARKOCCUR_WORD: bMarkOccurrencesMatchWords = true; bMarkOccurrencesCurrentWord = false; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); break; case IDM_VIEW_MARKOCCUR_CURRENT: bMarkOccurrencesMatchWords = false; bMarkOccurrencesCurrentWord = true; - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); break; @@ -5460,14 +5460,19 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) } if (iMarkOccurrences > 0) { - // clear marks only, if caret/selection changed + // clear marks only, if selection changed if (scn->updated & SC_UPDATE_SELECTION) { - EditClearAllMarks(g_hwndEdit, 0, -1); - MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); - } - else { + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); + if (!SciCall_IsSelectionEmpty()) { + MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); + } + } + else if (scn->updated & SC_UPDATE_CONTENT) { MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); } + //else { + // //MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); + //} } if (bHyperlinkHotspot) { @@ -5506,7 +5511,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) } if (iMarkOccurrences > 0) { - EditClearAllMarks(g_hwndEdit, 0, -1); + EditClearAllOccurrenceMarkers(g_hwndEdit, 0, -1); MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); }