From ec58295fd9187c9e2adf96f830e0026722455b8f Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Tue, 2 Jan 2018 22:06:52 +0100 Subject: [PATCH 1/9] + feature: (Mark Occurences) instant word highligting --- src/Edit.c | 88 +++++++++++++++++++++++++++++-------------------- src/Notepad3.c | 45 +++++++++++++++++-------- src/Notepad3.rc | 7 ++-- src/resource.h | 17 +++++----- 4 files changed, 98 insertions(+), 59 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index cfdbcb995..93fb8cda6 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4352,7 +4352,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (lpefr->bMarkOccurences) { iSaveMarkOcc = iMarkOccurrences; - EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, FALSE); + EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, FALSE); iMarkOccurrences = 0; CheckDlgButton(hwnd, IDC_ALL_OCCURRENCES, BST_CHECKED); } @@ -4543,9 +4543,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA DeleteObject(hBrushBlue); if (iSaveMarkOcc >= 0) { - EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, TRUE); + EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, TRUE); if (iSaveMarkOcc != 0) { - SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCURRENCES_ONOFF, 1), 0); + SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCUR_ONOFF, 1), 0); } } KillTimer(hwnd, IDT_TIMER_MRKALL); @@ -4619,15 +4619,15 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { lpefr->bMarkOccurences = TRUE; iSaveMarkOcc = iMarkOccurrences; - EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, FALSE); + EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, FALSE); iMarkOccurrences = 0; } else { // switched OFF lpefr->bMarkOccurences = FALSE; if (iSaveMarkOcc >= 0) { - EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, TRUE); + EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, TRUE); if (iSaveMarkOcc != 0) { - SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCURRENCES_ONOFF, 1), 0); + SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCUR_ONOFF, 1), 0); } } iSaveMarkOcc = -1; @@ -5477,42 +5477,64 @@ void EditClearAllMarks(HWND hwnd) // void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMatchWords) { + char* pszText = NULL; + char txtBuffer[LARGE_BUFFER] = { '\0' }; + EditClearAllMarks(hwnd); int iTextLength = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); int iFindLength = 0; - char* pszText = pszFind; + if (pszFind != NULL) + pszText = pszFind; + else + pszText = txtBuffer; - if (pszText == NULL) { - // get current selection - int iSelStart = (int)SendMessage(hwnd, SCI_GETSELECTIONSTART, 0, 0); - int iSelEnd = (int)SendMessage(hwnd, SCI_GETSELECTIONEND, 0, 0); - int iSelCount = iSelEnd - iSelStart; + if (pszFind == NULL) { + if (!SciCall_IsSelectionEmpty()) + { + // get current selection + int iSelStart = (int)SendMessage(hwnd, SCI_GETSELECTIONSTART, 0, 0); + int iSelEnd = (int)SendMessage(hwnd, SCI_GETSELECTIONEND, 0, 0); + int iSelCount = iSelEnd - iSelStart; - // if nothing selected or multiple lines are selected exit - if ((iSelCount == 0) || - (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelStart, 0) != - (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelEnd, 0)) - return; + // if multiple lines are selected exit + if (((int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelStart, 0) != + (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelEnd, 0)) || (iSelCount >= LARGE_BUFFER)) + return; - iFindLength = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)NULL) - 1; - pszText = LocalAlloc(LPTR, iFindLength + 1); - (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)pszText); + iFindLength = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)NULL) - 1; + (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)pszText); - // exit if selection is not a word and Match whole words only is enabled - if (bMatchWords) { - int iSelStart2 = 0; - const char* delims = (bAccelWordNavigation ? DelimCharsAccel : DelimChars); - while ((iSelStart2 <= iSelCount) && pszText[iSelStart2]) { - if (StrChrIA(delims, pszText[iSelStart2])) { - LocalFree(pszText); - return; + // exit if selection is not a word and Match whole words only is enabled + if (bMatchWords) { + int iSelStart2 = 0; + const char* delims = (bAccelWordNavigation ? DelimCharsAccel : DelimChars); + while ((iSelStart2 <= iSelCount) && pszText[iSelStart2]) { + if (StrChrIA(delims, pszText[iSelStart2])) { + return; + } + iSelStart2++; } - iSelStart2++; } + else if (flags) { return; } // no current word matching if we have a selection } - // override flags + else if (flags) { // nothing selected, get word under caret if flagged + int iCurrPos = SciCall_GetCurrentPos(); + int iWordStart = (int)SendMessage(hwnd, SCI_WORDSTARTPOSITION, iCurrPos, (LPARAM)1); + int iWordEnd = (int)SendMessage(hwnd, SCI_WORDENDPOSITION, iCurrPos, (LPARAM)1); + iFindLength = iWordEnd - iWordStart; + struct Sci_TextRange tr = { { 0, -1 }, NULL }; + tr.lpstrText = pszText; + tr.chrg.cpMin = iWordStart; + tr.chrg.cpMax = iWordEnd; + SendMessage(hwnd, SCI_GETTEXTRANGE, 0, (LPARAM)&tr); + } + else { + return; // no selection and no word mark choosen + } + + // set additional flags flags = 0; flags |= (bMatchCase ? SCFIND_MATCHCASE : 0); flags |= (bMatchWords ? SCFIND_WHOLEWORD : 0); @@ -5521,7 +5543,7 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMat iFindLength = StringCchLenA(pszFind, FNDRPL_BUFFER); } - if (iFindLength <= 0) return; + if (iFindLength <= 0) { return; } int start = 0; int end = iTextLength; @@ -5541,10 +5563,6 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMat break; } - // free text buffer if not set from outside (pszFind) - if (pszFind == NULL) - LocalFree(pszText); - UpdateStatusbar(); } diff --git a/src/Notepad3.c b/src/Notepad3.c index 7d3a43dd2..44b506dfd 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -153,6 +153,7 @@ int iMarkOccurrencesCount; int iMarkOccurrencesMaxCount; BOOL bMarkOccurrencesMatchCase; BOOL bMarkOccurrencesMatchWords; +BOOL bMarkOccurrencesCurrentWord; BOOL bUseOldStyleBraceMatching; BOOL bAutoCompleteWords; BOOL bAccelWordNavigation; @@ -2378,11 +2379,13 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam) CheckCmd(hmenu,IDM_VIEW_AUTOCOMPLETEWORDS,bAutoCompleteWords); CheckCmd(hmenu,IDM_VIEW_ACCELWORDNAV,bAccelWordNavigation); - CheckCmd(hmenu, IDM_VIEW_MARKOCCURRENCES_ONOFF, iMarkOccurrences != 0); - CheckCmd(hmenu,IDM_VIEW_MARKOCCURRENCES_CASE,bMarkOccurrencesMatchCase); - CheckCmd(hmenu,IDM_VIEW_MARKOCCURRENCES_WORD,bMarkOccurrencesMatchWords); - EnableCmd(hmenu,IDM_VIEW_MARKOCCURRENCES_CASE,iMarkOccurrences != 0); - EnableCmd(hmenu,IDM_VIEW_MARKOCCURRENCES_WORD,iMarkOccurrences != 0); + CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_ONOFF, iMarkOccurrences != 0); + CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_CASE, bMarkOccurrencesMatchCase); + CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_WORD, bMarkOccurrencesMatchWords); + CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_CURRENT, bMarkOccurrencesCurrentWord && !bMarkOccurrencesMatchWords); + EnableCmd(hmenu,IDM_VIEW_MARKOCCUR_CASE,iMarkOccurrences != 0); + EnableCmd(hmenu,IDM_VIEW_MARKOCCUR_WORD,iMarkOccurrences != 0); + EnableCmd(hmenu, IDM_VIEW_MARKOCCUR_CURRENT, iMarkOccurrences != 0); CheckCmd(hmenu,IDM_VIEW_SHOWWHITESPACE,bViewWhiteSpace); CheckCmd(hmenu,IDM_VIEW_SHOWEOLS,bViewEOLs); @@ -4208,11 +4211,11 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) bAccelWordNavigation = (bAccelWordNavigation) ? FALSE : TRUE; // toggle EditSetAccelWordNav(g_hwndEdit,bAccelWordNavigation); if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, 0, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } break; - case IDM_VIEW_MARKOCCURRENCES_ONOFF: + case IDM_VIEW_MARKOCCUR_ONOFF: iMarkOccurrences = (iMarkOccurrences == 0) ? max(1, IniGetInt(L"Settings", L"MarkOccurrences", 1)) : 0; if (iMarkOccurrences == 0) { // clear all marks @@ -4221,20 +4224,33 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) iMarkOccurrencesCount = -1; } else - EditMarkAll(g_hwndEdit, NULL, 0, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); break; - case IDM_VIEW_MARKOCCURRENCES_CASE: + case IDM_VIEW_MARKOCCUR_CASE: bMarkOccurrencesMatchCase = (bMarkOccurrencesMatchCase) ? FALSE : TRUE; if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, 0, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } break; - case IDM_VIEW_MARKOCCURRENCES_WORD: + case IDM_VIEW_MARKOCCUR_WORD: bMarkOccurrencesMatchWords = (bMarkOccurrencesMatchWords) ? FALSE : TRUE; + if (bMarkOccurrencesMatchWords) { + bMarkOccurrencesCurrentWord = FALSE; + } if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, 0, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + } + break; + + case IDM_VIEW_MARKOCCUR_CURRENT: + bMarkOccurrencesCurrentWord = (bMarkOccurrencesCurrentWord) ? FALSE : TRUE; + if (bMarkOccurrencesCurrentWord) { + bMarkOccurrencesMatchWords = FALSE; + } + if (iMarkOccurrences != 0) { + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } break; @@ -5518,7 +5534,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) // mark occurrences of text currently selected if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, 0, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } // Brace Match if (bMatchBraces) { @@ -5961,6 +5977,8 @@ void LoadSettings() iMarkOccurrences = max(min(iMarkOccurrences, 3), 0); bMarkOccurrencesMatchCase = IniSectionGetBool(pIniSection,L"MarkOccurrencesMatchCase",FALSE); bMarkOccurrencesMatchWords = IniSectionGetBool(pIniSection,L"MarkOccurrencesMatchWholeWords",TRUE); + bMarkOccurrencesCurrentWord = IniSectionGetBool(pIniSection, L"MarkOccurrencesMatchWholeWords", !bMarkOccurrencesMatchWords); + bMarkOccurrencesCurrentWord = bMarkOccurrencesCurrentWord && !bMarkOccurrencesMatchWords; bViewWhiteSpace = IniSectionGetBool(pIniSection,L"ViewWhiteSpace", FALSE); @@ -6258,6 +6276,7 @@ void SaveSettings(BOOL bSaveSettingsNow) { IniSectionSetInt(pIniSection, L"MarkOccurrences", iMarkOccurrences); IniSectionSetBool(pIniSection, L"MarkOccurrencesMatchCase", bMarkOccurrencesMatchCase); IniSectionSetBool(pIniSection, L"MarkOccurrencesMatchWholeWords", bMarkOccurrencesMatchWords); + IniSectionSetBool(pIniSection, L"MarkOccurrencesCurrentWord", bMarkOccurrencesCurrentWord); IniSectionSetBool(pIniSection, L"ViewWhiteSpace", bViewWhiteSpace); IniSectionSetBool(pIniSection, L"ViewEOLs", bViewEOLs); IniSectionSetInt(pIniSection, L"DefaultEncoding", Encoding_MapIniSetting(FALSE, iDefaultEncoding)); diff --git a/src/Notepad3.rc b/src/Notepad3.rc index df3e12201..6009d2fce 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -302,10 +302,11 @@ BEGIN MENUITEM "Highlight C&urrent Line\tCtrl+Shift+I", IDM_VIEW_HILITECURRENTLINE POPUP "Mar&k Occurrences" BEGIN - MENUITEM "&Active", IDM_VIEW_MARKOCCURRENCES_ONOFF + MENUITEM "&Active", IDM_VIEW_MARKOCCUR_ONOFF MENUITEM SEPARATOR - MENUITEM "Match &Case", IDM_VIEW_MARKOCCURRENCES_CASE - MENUITEM "Match &Whole Words Only", IDM_VIEW_MARKOCCURRENCES_WORD + MENUITEM "Match &Case", IDM_VIEW_MARKOCCUR_CASE + MENUITEM "Match &Whole Word Only", IDM_VIEW_MARKOCCUR_WORD + MENUITEM "&Instant Match Word", IDM_VIEW_MARKOCCUR_CURRENT END MENUITEM SEPARATOR MENUITEM "Line &Numbers\tCtrl+Shift+N", IDM_VIEW_LINENUMBERS diff --git a/src/resource.h b/src/resource.h index 9b58ee4a8..77228dc0f 100644 --- a/src/resource.h +++ b/src/resource.h @@ -381,14 +381,15 @@ #define IDM_VIEW_SAVESETTINGSNOW 40444 #define IDM_VIEW_FOLDING 40445 #define IDM_VIEW_TOGGLEFOLDS 40446 -#define IDM_VIEW_MARKOCCURRENCES_ONOFF 40447 -#define IDM_VIEW_MARKOCCURRENCES_CASE 40448 -#define IDM_VIEW_MARKOCCURRENCES_WORD 40449 -#define IDM_VIEW_AUTOCOMPLETEWORDS 40450 -#define IDM_VIEW_ACCELWORDNAV 40451 -#define IDM_VIEW_NOPRESERVECARET 40452 -#define IDM_VIEW_HYPERLINKHOTSPOTS 40453 -#define IDM_VIEW_CURRENTSCHEME 40454 +#define IDM_VIEW_MARKOCCUR_ONOFF 40447 +#define IDM_VIEW_MARKOCCUR_CASE 40448 +#define IDM_VIEW_MARKOCCUR_WORD 40449 +#define IDM_VIEW_MARKOCCUR_CURRENT 40450 +#define IDM_VIEW_AUTOCOMPLETEWORDS 40451 +#define IDM_VIEW_ACCELWORDNAV 40452 +#define IDM_VIEW_NOPRESERVECARET 40453 +#define IDM_VIEW_HYPERLINKHOTSPOTS 40454 +#define IDM_VIEW_CURRENTSCHEME 40455 #define IDM_HELP_ABOUT 40500 #define IDM_HELP_CMD 40501 #define IDM_HELP_ONLINEDOCUMENTATION 40502 From c92b2c2ce376418d2e312bccb2898812db51685e Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 3 Jan 2018 17:34:58 +0100 Subject: [PATCH 2/9] + add: switch to draw all occurrences in visible area only + opt: delayed mark all occurrences for better UI response --- src/Edit.c | 118 ++++++------ src/Edit.h | 2 +- src/Helpers.c | 9 +- src/Helpers.h | 4 +- src/Notepad3.c | 473 ++++++++++++++++++++++++++++-------------------- src/Notepad3.h | 3 +- src/Notepad3.rc | 2 + src/resource.h | 15 +- 8 files changed, 361 insertions(+), 265 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 93fb8cda6..7898f2c5e 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -89,7 +89,6 @@ extern BOOL bHyperlinkHotspot; extern int iMarkOccurrences; extern int iMarkOccurrencesCount; -extern int iMarkOccurrencesMaxCount; extern NP2ENCODING mEncoding[]; @@ -423,7 +422,7 @@ BOOL EditSetNewEncoding(HWND hwnd,int iNewEncoding,BOOL bNoUI,BOOL bSetSavePoint BOOL doNewEncoding = (!bNoUI) ? (InfoBox(MBYESNO, L"MsgConv1", IDS_ASK_ENCODING) == IDYES) : TRUE; if (doNewEncoding) { - BeginWaitCursor(); + BeginWaitCursor(NULL); BOOL result = EditConvertText(hwnd,iCurrentEncoding,iNewEncoding,FALSE); EndWaitCursor(); return result; @@ -4301,17 +4300,22 @@ RegExResult_t __fastcall EditFindHasMatch(HWND hwnd, LPCEDITFINDREPLACE lpefr, B char szFind[FNDRPL_BUFFER]; int slen = EditGetFindStrg(hwnd, lpefr, szFind, COUNTOF(szFind)); + const int iTextLength = SciCall_GetTextLength(); + int start = bFirstMatchOnly ? (int)SendMessage(hwnd, SCI_GETSELECTIONNSTART, 0, 0) : 0; - int end = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int end = iTextLength; int iPos = EditFindInTarget(hwnd, szFind, slen, (int)(lpefr->fuFlags), &start, &end, FALSE); if (!bFirstMatchOnly) { - if (bMarkAll && (iPos >= 0)) - EditMarkAll(hwnd, szFind, (int)(lpefr->fuFlags), FALSE, FALSE); - else - EditMarkAll(hwnd, "", 0, FALSE, FALSE); + if (bMarkAll && (iPos >= 0)) { + EditClearAllMarks(hwnd); + EditMarkAll(hwnd, szFind, (int)(lpefr->fuFlags), 0, iTextLength, FALSE, FALSE); + } + else { + EditMarkAll(hwnd, "", 0, 0, iTextLength, FALSE, FALSE); + } } return ((iPos >= 0) ? MATCH : ((iPos == -1) ? NO_MATCH : INVALID)); } @@ -4532,7 +4536,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA EditSetSearchFlags(hwnd, lpefr); bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 200, NULL); + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); } return TRUE; @@ -4557,6 +4561,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { if (LOWORD(wParam) == IDT_TIMER_MRKALL) { + KillTimer(hwnd, IDT_TIMER_MRKALL); PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MARKALL_OCC, 1), 0); return TRUE; } @@ -4569,7 +4574,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA lpefr = (LPEDITFINDREPLACE)GetWindowLongPtr(hwnd, DWLP_USER); if (lpefr->bMarkOccurences) { bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 50, NULL); + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); } else { DialogEnableWindow(hwnd, IDC_REPLACEINSEL, !(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)); @@ -4644,7 +4649,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA EditSetSearchFlags(hwnd, lpefr); if (lpefr->bMarkOccurences) { if (bFlagsChanged || (StringCchCompareXA(g_lastFind, lpefr->szFind) != 0)) { - BeginWaitCursor(); StringCchCopyA(g_lastFind, COUNTOF(g_lastFind), lpefr->szFind); RegExResult_t match = EditFindHasMatch(g_hwndEdit, lpefr, (iSaveMarkOcc > 0), FALSE); if (regexMatch != match) { @@ -4654,7 +4658,6 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA EditFindHasMatch(g_hwndEdit, lpefr, FALSE, TRUE); bFlagsChanged = FALSE; InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, TRUE); - EndWaitCursor(); } } } @@ -5329,7 +5332,7 @@ int EditReplaceAllInRange(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bShowInfo, i int start = iStartPos; int end = iEndPos; - BeginWaitCursor(); + BeginWaitCursor(NULL); int iPos = EditFindInTarget(hwnd, szFind, slen, (int)(lpefr->fuFlags), &start, &end, FALSE); @@ -5465,7 +5468,7 @@ BOOL EditReplaceAllInSelection(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo void EditClearAllMarks(HWND hwnd) { SendMessage(hwnd, SCI_SETINDICATORCURRENT, INDIC_NP3_MARK_OCCURANCE, 0); - SendMessage(hwnd, SCI_INDICATORCLEARRANGE, 0, (int)SendMessage(hwnd, SCI_GETLENGTH, 0, 0)); + SendMessage(hwnd, SCI_INDICATORCLEARRANGE, 0, SciCall_GetTextLength()); iMarkOccurrencesCount = -1; // -1 ! } @@ -5473,16 +5476,13 @@ void EditClearAllMarks(HWND hwnd) //============================================================================= // // EditMarkAll() -// Mark all occurrences of the text currently selected (by Aleksandar Lekov) +// Mark all occurrences of the matching text in range (by Aleksandar Lekov) // -void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMatchWords) +void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeEnd, BOOL bMatchCase, BOOL bMatchWords) { char* pszText = NULL; char txtBuffer[LARGE_BUFFER] = { '\0' }; - EditClearAllMarks(hwnd); - - int iTextLength = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); int iFindLength = 0; if (pszFind != NULL) @@ -5491,19 +5491,37 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMat pszText = txtBuffer; if (pszFind == NULL) { - if (!SciCall_IsSelectionEmpty()) - { + if (SciCall_IsSelectionEmpty()) { + + if (flags) { // nothing selected, get word under caret if flagged + int iCurrPos = SciCall_GetCurrentPos(); + int iWordStart = (int)SendMessage(hwnd, SCI_WORDSTARTPOSITION, iCurrPos, (LPARAM)1); + int iWordEnd = (int)SendMessage(hwnd, SCI_WORDENDPOSITION, iCurrPos, (LPARAM)1); + iFindLength = iWordEnd - iWordStart; + struct Sci_TextRange tr = { { 0, -1 }, NULL }; + tr.lpstrText = pszText; + tr.chrg.cpMin = iWordStart; + tr.chrg.cpMax = iWordEnd; + SendMessage(hwnd, SCI_GETTEXTRANGE, 0, (LPARAM)&tr); + } + else { + return; // no selection and no word mark chosen + } + } + else { // selection found + + if (flags) { return; } // no current word matching if we have a selection + // get current selection - int iSelStart = (int)SendMessage(hwnd, SCI_GETSELECTIONSTART, 0, 0); - int iSelEnd = (int)SendMessage(hwnd, SCI_GETSELECTIONEND, 0, 0); - int iSelCount = iSelEnd - iSelStart; + int iSelStart = SciCall_GetSelectionStart(); + int iSelEnd = SciCall_GetSelectionEnd(); + int iSelCount = (iSelEnd - iSelStart); + iFindLength = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)NULL) - 1; // if multiple lines are selected exit - if (((int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelStart, 0) != - (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelEnd, 0)) || (iSelCount >= LARGE_BUFFER)) + if ((SciCall_LineFromPosition(iSelStart) != SciCall_LineFromPosition(iSelEnd)) || (iFindLength >= LARGE_BUFFER)) return; - iFindLength = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)NULL) - 1; (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)pszText); // exit if selection is not a word and Match whole words only is enabled @@ -5517,21 +5535,6 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMat iSelStart2++; } } - else if (flags) { return; } // no current word matching if we have a selection - } - else if (flags) { // nothing selected, get word under caret if flagged - int iCurrPos = SciCall_GetCurrentPos(); - int iWordStart = (int)SendMessage(hwnd, SCI_WORDSTARTPOSITION, iCurrPos, (LPARAM)1); - int iWordEnd = (int)SendMessage(hwnd, SCI_WORDENDPOSITION, iCurrPos, (LPARAM)1); - iFindLength = iWordEnd - iWordStart; - struct Sci_TextRange tr = { { 0, -1 }, NULL }; - tr.lpstrText = pszText; - tr.chrg.cpMin = iWordStart; - tr.chrg.cpMax = iWordEnd; - SendMessage(hwnd, SCI_GETTEXTRANGE, 0, (LPARAM)&tr); - } - else { - return; // no selection and no word mark choosen } // set additional flags @@ -5543,24 +5546,29 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMat iFindLength = StringCchLenA(pszFind, FNDRPL_BUFFER); } - if (iFindLength <= 0) { return; } + if (iFindLength > 0) { - int start = 0; - int end = iTextLength; - while (++iMarkOccurrencesCount < iMarkOccurrencesMaxCount) - { - int iPos = EditFindInTarget(hwnd, pszText, iFindLength, flags, &start, &end, (end == start)); + int iTextLength = SciCall_GetTextLength(); + rangeStart = max(0, rangeStart); + rangeEnd = min(rangeEnd, iTextLength); - if (iPos < 0) - break; // not found + int start = rangeStart; + int end = rangeEnd; - // mark this match - SendMessage(hwnd, SCI_INDICATORFILLRANGE, iPos, (end - start)); - start = end; - end = iTextLength; + do { + ++iMarkOccurrencesCount; - if (start >= end) - break; + int iPos = EditFindInTarget(hwnd, pszText, iFindLength, flags, &start, &end, (end == start)); + + if (iPos < 0) + break; // not found + + // mark this match + SendMessage(hwnd, SCI_INDICATORFILLRANGE, iPos, (end - start)); + start = end; + end = rangeEnd; + + } while (start < end); // < iMarkOccurrencesMaxCount } UpdateStatusbar(); diff --git a/src/Edit.h b/src/Edit.h index 9d282fe7a..d80e82f6a 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -123,7 +123,7 @@ void EditPrintSetup(HWND); void EditPrintInit(); void EditMatchBrace(HWND); void EditClearAllMarks(HWND); -void EditMarkAll(HWND,char*,int,BOOL,BOOL); +void EditMarkAll(HWND,char*,int,int,int,BOOL,BOOL); void EditUpdateUrlHotspots(HWND, int, int, BOOL); void EditSetAccelWordNav(HWND,BOOL); void EditCompleteWord(HWND,BOOL); diff --git a/src/Helpers.c b/src/Helpers.c index f052b0b44..d82ee64fa 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -37,6 +37,7 @@ #include "scintilla.h" #include "resource.h" #include "edit.h" +#include "notepad3.h" #include "helpers.h" @@ -895,9 +896,11 @@ void DeleteBitmapButton(HWND hwnd,int nCtlId) BOOL StatusSetText(HWND hwnd,UINT nPart,LPCWSTR lpszText) { - UINT uFlags = (nPart == 255) ? nPart|SBT_NOBORDERS : nPart; - return (BOOL)SendMessage(hwnd,SB_SETTEXT,uFlags,(LPARAM)lpszText); - + UINT uFlags = (nPart == (UINT)STATUS_HELP) ? nPart|SBT_NOBORDERS : nPart; + if (lpszText) + return (BOOL)SendMessage(hwnd, SB_SETTEXT, uFlags, (LPARAM)lpszText); + else + return (BOOL)SendMessage(hwnd, SB_SETTEXT, uFlags, (LPARAM)L"..."); } diff --git a/src/Helpers.h b/src/Helpers.h index 15322f3f5..0c40c4412 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -71,8 +71,8 @@ __inline BOOL IniSectionSetBool(LPWSTR lpCachedIniSection, LPCWSTR lpName, BOOL //extern HWND g_hwndEdit; -#define BeginWaitCursor() { SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORWAIT,0); StatusSetText(g_hwndStatus,255,L"..."); } -#define EndWaitCursor() { POINT pt; SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORNORMAL,0); GetCursorPos(&pt); SetCursorPos(pt.x,pt.y); UpdateStatusbar(); } +#define BeginWaitCursor(TCH) { SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORWAIT,0); StatusSetText(g_hwndStatus,STATUS_HELP,(TCH)); } +#define EndWaitCursor() { POINT pt; SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORNORMAL,0); GetCursorPos(&pt); SetCursorPos(pt.x,pt.y); StatusSetSimple(g_hwndStatus,FALSE); UpdateStatusbar(); } //#define Is2k() (g_uWinVer >= 0x0500) diff --git a/src/Notepad3.c b/src/Notepad3.c index 44b506dfd..225c4d4c8 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -150,7 +150,7 @@ BOOL bShowSelectionMargin; BOOL bShowLineNumbers; int iMarkOccurrences; int iMarkOccurrencesCount; -int iMarkOccurrencesMaxCount; +BOOL bMarkOccurrencesMatchVisible; BOOL bMarkOccurrencesMatchCase; BOOL bMarkOccurrencesMatchWords; BOOL bMarkOccurrencesCurrentWord; @@ -1062,7 +1062,6 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) PostMessage(g_hwndMain, WM_CLOSE, 0, 0); } - UNUSED(pszCmdLine); return(g_hwndMain); @@ -1164,8 +1163,20 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) UpdateLineNumberWidth(); return DefWindowProc(hwnd,umsg,wParam,lParam); - //case WM_TIMER: - // return DefWindowProc(hwnd,umsg,wParam,lParam); + case WM_TIMER: + { + if (LOWORD(wParam) == IDT_TIMER_MAIN_MARKOCC) { + KillTimer(hwnd, IDT_TIMER_MAIN_MARKOCC); + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); + return TRUE; + } + else if (LOWORD(wParam) == IDT_TIMER_STATUSBAR) { + KillTimer(hwnd, IDT_TIMER_STATUSBAR); + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_UPDATE_STATUSBAR, 1), 0); + return TRUE; + } + } + break; case WM_SIZE: MsgSize(hwnd,wParam,lParam); @@ -1436,6 +1447,9 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) g_hwndStatus == NULL || hwndToolbar == NULL || hwndReBar == NULL) return(-1); + SetTimer(hwnd, IDT_TIMER_MAIN_MARKOCC, 200, NULL); + SetTimer(hwnd, IDT_TIMER_STATUSBAR, 200, NULL); + UNUSED(wParam); return(0); } @@ -1636,6 +1650,10 @@ void MsgEndSession(HWND hwnd, UINT umsg) if (!bShutdownOK) { + // destroy timer + KillTimer(hwnd, IDT_TIMER_MAIN_MARKOCC); + KillTimer(hwnd, IDT_TIMER_STATUSBAR); + // Terminate file watching InstallFileWatching(NULL); @@ -2380,10 +2398,12 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam) CheckCmd(hmenu,IDM_VIEW_ACCELWORDNAV,bAccelWordNavigation); CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_ONOFF, iMarkOccurrences != 0); + CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_VISIBLE, bMarkOccurrencesMatchVisible); CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_CASE, bMarkOccurrencesMatchCase); CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_WORD, bMarkOccurrencesMatchWords); CheckCmd(hmenu, IDM_VIEW_MARKOCCUR_CURRENT, bMarkOccurrencesCurrentWord && !bMarkOccurrencesMatchWords); - EnableCmd(hmenu,IDM_VIEW_MARKOCCUR_CASE,iMarkOccurrences != 0); + EnableCmd(hmenu, IDM_VIEW_MARKOCCUR_VISIBLE, iMarkOccurrences != 0); + EnableCmd(hmenu, IDM_VIEW_MARKOCCUR_CASE, iMarkOccurrences != 0); EnableCmd(hmenu,IDM_VIEW_MARKOCCUR_WORD,iMarkOccurrences != 0); EnableCmd(hmenu, IDM_VIEW_MARKOCCUR_CURRENT, iMarkOccurrences != 0); @@ -2493,17 +2513,178 @@ LRESULT MsgSysCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) } + +//============================================================================= +// +// UpdateStatusbarTimer() +// +// +void _fastcall UpdateStatusbarTimer() +{ + static WCHAR tchLn[32] = { L'\0' }; + static WCHAR tchLines[32] = { L'\0' }; + static WCHAR tchCol[32] = { L'\0' }; + static WCHAR tchCols[32] = { L'\0' }; + static WCHAR tchSel[32] = { L'\0' }; + static WCHAR tchOcc[32] = { L'\0' }; + static WCHAR tchDocPos[256] = { L'\0' }; + + int iBytes; + static WCHAR tchBytes[64] = { L'\0' }; + static WCHAR tchDocSize[256] = { L'\0' }; + + static WCHAR tchEOLMode[32] = { L'\0' }; + static WCHAR tchOvrMode[32] = { L'\0' }; + static WCHAR tchLexerName[128] = { L'\0' }; + static WCHAR tchLinesSelected[32] = { L'\0' }; + + if (!bShowStatusbar) + return; + + int iPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); + + int iLn = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iPos, 0) + 1; + StringCchPrintf(tchLn, COUNTOF(tchLn), L"%i", iLn); + FormatNumberStr(tchLn); + + int iLines = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); + StringCchPrintf(tchLines, COUNTOF(tchLines), L"%i", iLines); + FormatNumberStr(tchLines); + + int iCol = (int)SendMessage(g_hwndEdit, SCI_GETCOLUMN, iPos, 0) + 1; + iCol += (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONNCARETVIRTUALSPACE, 0, 0); + + StringCchPrintf(tchCol, COUNTOF(tchCol), L"%i", iCol); + FormatNumberStr(tchCol); + + if (bMarkLongLines) { + StringCchPrintf(tchCols, COUNTOF(tchCols), L"%i", iLongLinesLimit); + FormatNumberStr(tchCols); + } + + int iSelStart = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0); + int iSelEnd = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0); + + // Print number of selected chars in statusbar + if (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0)) { + int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd); + StringCchPrintf(tchSel, COUNTOF(tchSel), L"%i", iSel); + FormatNumberStr(tchSel); + } + else + StringCchCopy(tchSel, COUNTOF(tchSel), L"--"); + + + if ((iMarkOccurrencesCount >= 0) && !bMarkOccurrencesMatchVisible) { + + //if (iMarkOccurrencesCount < iMarkOccurrencesMaxCount) { + // StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount); + // FormatNumberStr(tchOcc); + //} + //else + // StringCchPrintf(tchOcc, COUNTOF(tchOcc), L">= %i", iMarkOccurrencesMaxCount); + + StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount); + FormatNumberStr(tchOcc); + } + else + StringCchCopy(tchOcc, COUNTOF(tchOcc), L"--"); + + + // Print number of lines selected lines in statusbar + int iLineStart = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelStart, 0); + int iLineEnd = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelEnd, 0); + int iStartOfLinePos = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, iLineEnd, 0); + int iLinesSelected = iLineEnd - iLineStart; + if ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) iLinesSelected += 1; + StringCchPrintf(tchLinesSelected, COUNTOF(tchLinesSelected), L"%i", iLinesSelected); + FormatNumberStr(tchLinesSelected); + + if (!bMarkLongLines) + FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS, tchLn, tchLines, tchCol, tchSel, tchLinesSelected, tchOcc); + else + FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS2, tchLn, tchLines, tchCol, tchCols, tchSel, tchLinesSelected, tchOcc); + + iBytes = (int)SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0); + StrFormatByteSize(iBytes, tchBytes, COUNTOF(tchBytes)); + + FormatString(tchDocSize, COUNTOF(tchDocSize), IDS_DOCSIZE, tchBytes); + + Encoding_GetLabel(Encoding_Current(CPI_GET)); + + if (iEOLMode == SC_EOL_CR) + StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR"); + else if (iEOLMode == SC_EOL_LF) + StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" LF"); + else + StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR+LF"); + + if (SendMessage(g_hwndEdit, SCI_GETOVERTYPE, 0, 0)) + StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" OVR"); + else + StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" INS"); + + Style_GetCurrentLexerName(tchLexerName, COUNTOF(tchLexerName)); + + StatusSetText(g_hwndStatus, STATUS_DOCPOS, tchDocPos); + StatusSetText(g_hwndStatus, STATUS_DOCSIZE, tchDocSize); + StatusSetText(g_hwndStatus, STATUS_CODEPAGE, mEncoding[Encoding_Current(CPI_GET)].wchLabel); + StatusSetText(g_hwndStatus, STATUS_EOLMODE, tchEOLMode); + StatusSetText(g_hwndStatus, STATUS_OVRMODE, tchOvrMode); + StatusSetText(g_hwndStatus, STATUS_LEXER, tchLexerName); + + //InvalidateRect(g_hwndStatus,NULL,TRUE); +} + + + +//============================================================================= +// +// MarkAllOccurrencesTimer() - called by timer event only +// +void __fastcall MarkAllOccurrencesTimer() +{ + if (iMarkOccurrences != 0) { + if (bMarkOccurrencesMatchVisible) { + int iLinesOnScreen = (int)SendMessage(g_hwndEdit, SCI_LINESONSCREEN, 0, 0); + int iFirstVisibleLine = (int)SendMessage(g_hwndEdit, SCI_GETFIRSTVISIBLELINE, 0, 0); + int iLastLineOfDOc = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); + int iStartLine = max(0, (iFirstVisibleLine - iLinesOnScreen)); + int iEndLine = min((iFirstVisibleLine + (iLinesOnScreen << 1)), iLastLineOfDOc); + int iPosStart = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, (WPARAM)iStartLine, 0); + int iPosEnd = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, (WPARAM)iEndLine, 0); + EditClearAllMarks(g_hwndEdit); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, iPosStart, iPosEnd, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + } + else { + EditClearAllMarks(g_hwndEdit); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, 0, SciCall_GetTextLength(), bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + } + } +} + + + //============================================================================= // // MsgCommand() - Handles WM_COMMAND // // -LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) +LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { BOOL bSwapClipBoard = FALSE; switch(LOWORD(wParam)) { + case IDC_UPDATE_STATUSBAR: + UpdateStatusbarTimer(); + break; + + + case IDC_MAIN_MARKALL_OCC: + MarkAllOccurrencesTimer(); + break; + case IDM_FILE_NEW: FileLoad(FALSE,TRUE,FALSE,FALSE,L""); @@ -2514,6 +2695,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) FileLoad(FALSE,FALSE,FALSE,FALSE,L""); break; + case IDM_FILE_REVERT: if ((bModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_REVERT) != IDOK) { return(0); @@ -2526,6 +2708,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) FileSave(TRUE,FALSE,FALSE,FALSE); break; + case IDM_FILE_SAVEAS: FileSave(TRUE,FALSE,TRUE,FALSE); break; @@ -2536,7 +2719,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) break; - case IDM_FILE_READONLY: + case IDM_FILE_READONLY: //bReadOnly = (bReadOnly) ? FALSE : TRUE; //SendMessage(g_hwndEdit,SCI_SETREADONLY,bReadOnly,0); //UpdateToolbar(); @@ -3226,7 +3409,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_ENCLOSESELECTION: if (EditEncloseSelectionDlg(hwnd,wchPrefixSelection,wchAppendSelection)) { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditEncloseSelection(g_hwndEdit,wchPrefixSelection,wchAppendSelection); EndSelUndoAction(token); @@ -3237,7 +3420,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_SELECTIONDUPLICATE: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); SendMessage(g_hwndEdit,SCI_SELECTIONDUPLICATE,0,0); EndSelUndoAction(token); @@ -3248,7 +3431,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_PADWITHSPACES: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditPadWithSpaces(g_hwndEdit,FALSE,FALSE); EndSelUndoAction(token); @@ -3259,7 +3442,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_STRIP1STCHAR: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditStripFirstCharacter(g_hwndEdit); EndSelUndoAction(token); @@ -3270,7 +3453,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_STRIPLASTCHAR: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditStripLastCharacter(g_hwndEdit); EndSelUndoAction(token); @@ -3280,7 +3463,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_TRIMLINES: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditStripTrailingBlanks(g_hwndEdit,FALSE); EndWaitCursor(); break; @@ -3288,7 +3471,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_COMPRESSWS: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditCompressSpaces(g_hwndEdit); EndSelUndoAction(token); @@ -3299,7 +3482,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_MERGEBLANKLINES: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditRemoveBlankLines(g_hwndEdit,TRUE); EndSelUndoAction(token); @@ -3310,7 +3493,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_REMOVEBLANKLINES: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditRemoveBlankLines(g_hwndEdit,FALSE); EndSelUndoAction(token); @@ -3322,7 +3505,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_MODIFYLINES: { if (EditModifyLinesDlg(hwnd,wchPrefixLines,wchAppendLines)) { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditModifyLines(g_hwndEdit,wchPrefixLines,wchAppendLines); EndSelUndoAction(token); @@ -3335,7 +3518,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_ALIGN: { if (EditAlignDlg(hwnd,&iAlignMode)) { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditAlignText(g_hwndEdit,iAlignMode); EndSelUndoAction(token); @@ -3348,7 +3531,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_SORTLINES: { if (EditSortDlg(hwnd,&iSortOptions)) { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditSortLines(g_hwndEdit,iSortOptions); EndSelUndoAction(token); @@ -3366,7 +3549,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) if (ColumnWrapDlg(hwnd,IDD_COLUMNWRAP,&iWrapCol)) { iWrapCol = max(min(iWrapCol,512),1); - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditWrapToColumn(g_hwndEdit,iWrapCol); EndSelUndoAction(token); @@ -3378,7 +3561,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_SPLITLINES: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); SendMessage(g_hwndEdit,SCI_TARGETFROMSELECTION,0,0); SendMessage(g_hwndEdit,SCI_LINESSPLIT,0,0); @@ -3390,7 +3573,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_JOINLINES: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); SendMessage(g_hwndEdit,SCI_TARGETFROMSELECTION,0,0); SendMessage(g_hwndEdit,SCI_LINESJOIN,0,0); @@ -3403,7 +3586,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_JOINLINESEX: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditJoinLinesEx(g_hwndEdit); EndSelUndoAction(token); @@ -3414,7 +3597,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_CONVERTUPPERCASE: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); SendMessage(g_hwndEdit,SCI_UPPERCASE,0,0); EndSelUndoAction(token); @@ -3425,7 +3608,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_CONVERTLOWERCASE: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); SendMessage(g_hwndEdit,SCI_LOWERCASE,0,0); EndSelUndoAction(token); @@ -3436,7 +3619,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_INVERTCASE: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditInvertCase(g_hwndEdit); EndSelUndoAction(token); @@ -3447,7 +3630,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_TITLECASE: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditTitleCase(g_hwndEdit); EndSelUndoAction(token); @@ -3458,7 +3641,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_SENTENCECASE: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditSentenceCase(g_hwndEdit); EndSelUndoAction(token); @@ -3469,7 +3652,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_CONVERTTABS: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditTabsToSpaces(g_hwndEdit, iTabWidth, FALSE); EndSelUndoAction(token); @@ -3480,7 +3663,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_CONVERTSPACES: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditSpacesToTabs(g_hwndEdit, iTabWidth, FALSE); EndSelUndoAction(token); @@ -3491,7 +3674,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_CONVERTTABS2: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditTabsToSpaces(g_hwndEdit, iTabWidth, TRUE); EndSelUndoAction(token); @@ -3502,7 +3685,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_CONVERTSPACES2: { - BeginWaitCursor(); + BeginWaitCursor(NULL); int token = BeginSelUndoAction(); EditSpacesToTabs(g_hwndEdit, iTabWidth, TRUE); EndSelUndoAction(token); @@ -3649,13 +3832,13 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCLEX_XML: case SCLEX_CPP: case SCLEX_PASCAL: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L"//",FALSE); EndWaitCursor(); break; case SCLEX_VBSCRIPT: case SCLEX_VB: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L"'",FALSE); EndWaitCursor(); break; @@ -3671,7 +3854,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCLEX_AVS: case SCLEX_YAML: case SCLEX_COFFEESCRIPT: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L"#",TRUE); EndWaitCursor(); break; @@ -3681,30 +3864,30 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCLEX_AHK: case SCLEX_NSIS: // # could also be used instead case SCLEX_INNOSETUP: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L";",TRUE); EndWaitCursor(); break; case SCLEX_REGISTRY: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L";;",TRUE); EndWaitCursor(); break; case SCLEX_SQL: case SCLEX_LUA: case SCLEX_VHDL: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L"--",TRUE); EndWaitCursor(); break; case SCLEX_BATCH: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L"rem ",TRUE); EndWaitCursor(); break; case SCLEX_LATEX: case SCLEX_MATLAB: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditToggleLineComments(g_hwndEdit,L"%",TRUE); EndWaitCursor(); break; @@ -3765,42 +3948,42 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_URLENCODE: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditURLEncode(g_hwndEdit); EndWaitCursor(); break; case IDM_EDIT_URLDECODE: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditURLDecode(g_hwndEdit); EndWaitCursor(); break; case IDM_EDIT_ESCAPECCHARS: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditEscapeCChars(g_hwndEdit); EndWaitCursor(); break; case IDM_EDIT_UNESCAPECCHARS: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditUnescapeCChars(g_hwndEdit); EndWaitCursor(); break; case IDM_EDIT_CHAR2HEX: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditChar2Hex(g_hwndEdit); EndWaitCursor(); break; case IDM_EDIT_HEX2CHAR: - BeginWaitCursor(); + BeginWaitCursor(NULL); EditHex2Char(g_hwndEdit); EndWaitCursor(); break; @@ -4210,28 +4393,27 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_VIEW_ACCELWORDNAV: bAccelWordNavigation = (bAccelWordNavigation) ? FALSE : TRUE; // toggle EditSetAccelWordNav(g_hwndEdit,bAccelWordNavigation); - if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); - } + MarkAllOccurrences(); break; case IDM_VIEW_MARKOCCUR_ONOFF: iMarkOccurrences = (iMarkOccurrences == 0) ? max(1, IniGetInt(L"Settings", L"MarkOccurrences", 1)) : 0; if (iMarkOccurrences == 0) { - // clear all marks - SendMessage(g_hwndEdit, SCI_SETINDICATORCURRENT, INDIC_NP3_MARK_OCCURANCE, 0); - SendMessage(g_hwndEdit, SCI_INDICATORCLEARRANGE, 0, (int)SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0)); - iMarkOccurrencesCount = -1; + EditClearAllMarks(g_hwndEdit); + } + else { + MarkAllOccurrences(); } - else - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); break; case IDM_VIEW_MARKOCCUR_CASE: bMarkOccurrencesMatchCase = (bMarkOccurrencesMatchCase) ? FALSE : TRUE; - if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); - } + MarkAllOccurrences(); + break; + + case IDM_VIEW_MARKOCCUR_VISIBLE: + bMarkOccurrencesMatchVisible = (bMarkOccurrencesMatchVisible) ? FALSE : TRUE; + MarkAllOccurrences(); break; case IDM_VIEW_MARKOCCUR_WORD: @@ -4239,9 +4421,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) if (bMarkOccurrencesMatchWords) { bMarkOccurrencesCurrentWord = FALSE; } - if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); - } + MarkAllOccurrences(); break; case IDM_VIEW_MARKOCCUR_CURRENT: @@ -4249,9 +4429,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) if (bMarkOccurrencesCurrentWord) { bMarkOccurrencesMatchWords = FALSE; } - if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); - } + MarkAllOccurrences(); break; case IDM_VIEW_FOLDING: @@ -4552,13 +4730,13 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) if (WritePrivateProfileString(L"Settings",L"WriteTest",L"ok",szIniFile)) { - BeginWaitCursor(); - StatusSetTextID(g_hwndStatus,STATUS_HELP,IDS_SAVINGSETTINGS); - StatusSetSimple(g_hwndStatus,TRUE); - InvalidateRect(g_hwndStatus,NULL,TRUE); - UpdateWindow(g_hwndStatus); + BeginWaitCursor(NULL); + //StatusSetTextID(g_hwndStatus,STATUS_HELP,IDS_SAVINGSETTINGS); + //StatusSetSimple(g_hwndStatus,TRUE); + //InvalidateRect(g_hwndStatus,NULL,TRUE); + //UpdateWindow(g_hwndStatus); SaveSettings(TRUE); - StatusSetSimple(g_hwndStatus,FALSE); + //StatusSetSimple(g_hwndStatus,FALSE); EndWaitCursor(); MsgBox(MBINFO,IDS_SAVEDSETTINGS); } @@ -5533,16 +5711,20 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) InvalidateSelections(); // mark occurrences of text currently selected - if (iMarkOccurrences != 0) { - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); - } + MarkAllOccurrences(); + // Brace Match if (bMatchBraces) { EditMatchBrace(g_hwndEdit); } + UpdateToolbar(); UpdateStatusbar(); } + else if ((scn->updated & SC_UPDATE_V_SCROLL) && bMarkOccurrencesMatchVisible) + { + MarkAllOccurrences(); + } break; case SCN_CHARADDED: @@ -5975,9 +6157,10 @@ void LoadSettings() iMarkOccurrences = IniSectionGetInt(pIniSection,L"MarkOccurrences",1); iMarkOccurrences = max(min(iMarkOccurrences, 3), 0); + bMarkOccurrencesMatchVisible = IniSectionGetBool(pIniSection, L"MarkOccurrencesMatchVisible", TRUE); bMarkOccurrencesMatchCase = IniSectionGetBool(pIniSection,L"MarkOccurrencesMatchCase",FALSE); bMarkOccurrencesMatchWords = IniSectionGetBool(pIniSection,L"MarkOccurrencesMatchWholeWords",TRUE); - bMarkOccurrencesCurrentWord = IniSectionGetBool(pIniSection, L"MarkOccurrencesMatchWholeWords", !bMarkOccurrencesMatchWords); + bMarkOccurrencesCurrentWord = IniSectionGetBool(pIniSection, L"MarkOccurrencesCurrentWord", !bMarkOccurrencesMatchWords); bMarkOccurrencesCurrentWord = bMarkOccurrencesCurrentWord && !bMarkOccurrencesMatchWords; bViewWhiteSpace = IniSectionGetBool(pIniSection,L"ViewWhiteSpace", FALSE); @@ -6115,8 +6298,8 @@ void LoadSettings() iSciFontQuality = max(min(iSciFontQuality, 3), 0); iMarkOccurrencesCount = -1; - iMarkOccurrencesMaxCount = IniSectionGetInt(pIniSection,L"MarkOccurrencesMaxCount",2000); - iMarkOccurrencesMaxCount = max(min(iMarkOccurrencesMaxCount,100000),2); + //iMarkOccurrencesMaxCount = IniSectionGetInt(pIniSection,L"MarkOccurrencesMaxCount",2000); + //iMarkOccurrencesMaxCount = max(min(iMarkOccurrencesMaxCount,100000),2); bDenyVirtualSpaceAccess = IniSectionGetBool(pIniSection, L"DenyVirtualSpaceAccess", FALSE); bUseOldStyleBraceMatching = IniSectionGetBool(pIniSection, L"UseOldStyleBraceMatching", FALSE); @@ -6274,6 +6457,7 @@ void SaveSettings(BOOL bSaveSettingsNow) { IniSectionSetBool(pIniSection, L"ShowLineNumbers", bShowLineNumbers); IniSectionSetBool(pIniSection, L"ShowCodeFolding", bShowCodeFolding); IniSectionSetInt(pIniSection, L"MarkOccurrences", iMarkOccurrences); + IniSectionSetBool(pIniSection, L"MarkOccurrencesMatchVisible", bMarkOccurrencesMatchVisible); IniSectionSetBool(pIniSection, L"MarkOccurrencesMatchCase", bMarkOccurrencesMatchCase); IniSectionSetBool(pIniSection, L"MarkOccurrencesMatchWholeWords", bMarkOccurrencesMatchWords); IniSectionSetBool(pIniSection, L"MarkOccurrencesCurrentWord", bMarkOccurrencesCurrentWord); @@ -7041,9 +7225,19 @@ void UpdateEditWndUI() scn.updated = SC_UPDATE_CONTENT; //SendMessage(g_hwndMain, WM_NOTIFY, IDC_EDIT, (LPARAM)&scn); PostMessage(g_hwndMain, WM_NOTIFY, IDC_EDIT, (LPARAM)&scn); - // -------------------------------------------------------------- - //~ don't SendMessage(hwnd, SCI_COLOURISE, 0, (LPARAM)-1); here ! - // -------------------------------------------------------------- + // --------------------------------------------------------------------------- + // ~~~ don't Send/Post Message(hwnd, SCI_COLOURISE, 0, (LPARAM)-1); here ! ~~~ + // --------------------------------------------------------------------------- +} + + +//============================================================================= +// +// MarkAllOccurrences() +// +void MarkAllOccurrences() +{ + SetTimer(g_hwndMain, IDT_TIMER_MAIN_MARKOCC, 100, NULL); } @@ -7104,116 +7298,7 @@ void UpdateToolbar() // void UpdateStatusbar() { - - WCHAR tchLn[32] = { L'\0' }; - WCHAR tchLines[32] = { L'\0' }; - WCHAR tchCol[32] = { L'\0' }; - WCHAR tchCols[32] = { L'\0' }; - WCHAR tchSel[32] = { L'\0' }; - WCHAR tchOcc[32] = { L'\0' }; - WCHAR tchDocPos[256] = { L'\0' }; - - int iBytes; - WCHAR tchBytes[64] = { L'\0' }; - WCHAR tchDocSize[256] = { L'\0' }; - - WCHAR tchEOLMode[32] = { L'\0' }; - WCHAR tchOvrMode[32] = { L'\0' }; - WCHAR tchLexerName[128] = { L'\0' }; - WCHAR tchLinesSelected[32] = { L'\0' }; - - if (!bShowStatusbar) - return; - - int iPos = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); - - int iLn = (int)SendMessage(g_hwndEdit,SCI_LINEFROMPOSITION,iPos,0) + 1; - StringCchPrintf(tchLn,COUNTOF(tchLn),L"%i",iLn); - FormatNumberStr(tchLn); - - int iLines = (int)SendMessage(g_hwndEdit,SCI_GETLINECOUNT,0,0); - StringCchPrintf(tchLines,COUNTOF(tchLines),L"%i",iLines); - FormatNumberStr(tchLines); - - int iCol = (int)SendMessage(g_hwndEdit,SCI_GETCOLUMN,iPos,0) + 1; - iCol += (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONNCARETVIRTUALSPACE, 0, 0); - - StringCchPrintf(tchCol,COUNTOF(tchCol),L"%i",iCol); - FormatNumberStr(tchCol); - - if (bMarkLongLines) { - StringCchPrintf(tchCols,COUNTOF(tchCols),L"%i",iLongLinesLimit); - FormatNumberStr(tchCols); - } - - int iSelStart = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0); - int iSelEnd = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0); - - // Print number of selected chars in statusbar - if (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0)) { - int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd); - StringCchPrintf(tchSel, COUNTOF(tchSel), L"%i", iSel); - FormatNumberStr(tchSel); - } - else - StringCchCopy(tchSel, COUNTOF(tchSel), L"--"); - - - if (iMarkOccurrencesCount > 0) { - if (iMarkOccurrencesCount < iMarkOccurrencesMaxCount) { - StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount); - FormatNumberStr(tchOcc); - } - else - StringCchPrintf(tchOcc, COUNTOF(tchOcc), L">= %i", iMarkOccurrencesMaxCount); - } - else - StringCchCopy(tchOcc, COUNTOF(tchOcc), L"--"); - - - // Print number of lines selected lines in statusbar - int iLineStart = (int)SendMessage( g_hwndEdit , SCI_LINEFROMPOSITION , iSelStart , 0 ); - int iLineEnd = (int)SendMessage( g_hwndEdit , SCI_LINEFROMPOSITION , iSelEnd , 0 ); - int iStartOfLinePos = (int)SendMessage( g_hwndEdit , SCI_POSITIONFROMLINE , iLineEnd , 0 ); - int iLinesSelected = iLineEnd - iLineStart; - if ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) iLinesSelected += 1; - StringCchPrintf(tchLinesSelected,COUNTOF(tchLinesSelected),L"%i",iLinesSelected); - FormatNumberStr(tchLinesSelected); - - if (!bMarkLongLines) - FormatString(tchDocPos,COUNTOF(tchDocPos),IDS_DOCPOS,tchLn,tchLines,tchCol,tchSel,tchLinesSelected,tchOcc); - else - FormatString(tchDocPos,COUNTOF(tchDocPos),IDS_DOCPOS2,tchLn,tchLines,tchCol,tchCols,tchSel,tchLinesSelected,tchOcc); - - iBytes = (int)SendMessage(g_hwndEdit,SCI_GETLENGTH,0,0); - StrFormatByteSize(iBytes,tchBytes,COUNTOF(tchBytes)); - - FormatString(tchDocSize,COUNTOF(tchDocSize),IDS_DOCSIZE,tchBytes); - - Encoding_GetLabel(Encoding_Current(CPI_GET)); - - if (iEOLMode == SC_EOL_CR) - StringCchCopy(tchEOLMode,COUNTOF(tchEOLMode),L" CR"); - else if (iEOLMode == SC_EOL_LF) - StringCchCopy(tchEOLMode,COUNTOF(tchEOLMode),L" LF"); - else - StringCchCopy(tchEOLMode,COUNTOF(tchEOLMode),L" CR+LF"); - - if (SendMessage(g_hwndEdit,SCI_GETOVERTYPE,0,0)) - StringCchCopy(tchOvrMode,COUNTOF(tchOvrMode),L" OVR"); - else - StringCchCopy(tchOvrMode,COUNTOF(tchOvrMode),L" INS"); - - Style_GetCurrentLexerName(tchLexerName,COUNTOF(tchLexerName)); - - StatusSetText(g_hwndStatus,STATUS_DOCPOS,tchDocPos); - StatusSetText(g_hwndStatus,STATUS_DOCSIZE,tchDocSize); - StatusSetText(g_hwndStatus,STATUS_CODEPAGE,mEncoding[Encoding_Current(CPI_GET)].wchLabel); - StatusSetText(g_hwndStatus,STATUS_EOLMODE,tchEOLMode); - StatusSetText(g_hwndStatus,STATUS_OVRMODE,tchOvrMode); - StatusSetText(g_hwndStatus,STATUS_LEXER,tchLexerName); - - //InvalidateRect(g_hwndStatus,NULL,TRUE); + SetTimer(g_hwndMain, IDT_TIMER_STATUSBAR, 100, NULL); } @@ -7451,15 +7536,9 @@ BOOL FileIO(BOOL fLoad,LPCWSTR pszFileName,BOOL bNoEncDetect,int *ienc,int *ieol BOOL fSuccess; DWORD dwFileAttributes; - BeginWaitCursor(); - FormatString(tch,COUNTOF(tch),(fLoad) ? IDS_LOADFILE : IDS_SAVEFILE,PathFindFileName(pszFileName)); - StatusSetText(g_hwndStatus,STATUS_HELP,tch); - StatusSetSimple(g_hwndStatus,TRUE); - - InvalidateRect(g_hwndStatus,NULL,TRUE); - UpdateWindow(g_hwndStatus); + BeginWaitCursor(tch); if (fLoad) { fSuccess = EditLoadFile(g_hwndEdit,pszFileName,bNoEncDetect,ienc,ieol,pbUnicodeErr,pbFileTooBig,pbUnknownExt); @@ -7481,8 +7560,6 @@ BOOL FileIO(BOOL fLoad,LPCWSTR pszFileName,BOOL bNoEncDetect,int *ienc,int *ieol dwFileAttributes = GetFileAttributes(pszFileName); bReadOnly = (dwFileAttributes != INVALID_FILE_ATTRIBUTES && dwFileAttributes & FILE_ATTRIBUTE_READONLY); - StatusSetSimple(g_hwndStatus,FALSE); - EndWaitCursor(); return(fSuccess); diff --git a/src/Notepad3.h b/src/Notepad3.h index 580a83abf..22e6a63a0 100644 --- a/src/Notepad3.h +++ b/src/Notepad3.h @@ -139,9 +139,10 @@ int CreateIniFile(); int CreateIniFileEx(LPCWSTR); +void MarkAllOccurrences(); void UpdateEditWndUI(); -void UpdateStatusbar(); void UpdateToolbar(); +void UpdateStatusbar(); void UpdateLineNumberWidth(); void UpdateSettingsCmds(); diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 6009d2fce..bd61d349a 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -304,7 +304,9 @@ BEGIN BEGIN MENUITEM "&Active", IDM_VIEW_MARKOCCUR_ONOFF MENUITEM SEPARATOR + MENUITEM "Match Visible Only", IDM_VIEW_MARKOCCUR_VISIBLE MENUITEM "Match &Case", IDM_VIEW_MARKOCCUR_CASE + MENUITEM SEPARATOR MENUITEM "Match &Whole Word Only", IDM_VIEW_MARKOCCUR_WORD MENUITEM "&Instant Match Word", IDM_VIEW_MARKOCCUR_CURRENT END diff --git a/src/resource.h b/src/resource.h index 77228dc0f..4a8a9c229 100644 --- a/src/resource.h +++ b/src/resource.h @@ -120,6 +120,10 @@ #define IDC_ALL_OCCURRENCES 131 #define IDC_MARKALL_OCC 132 #define IDC_DOT_MATCH_ALL 133 +#define IDT_TIMER_MAIN_MARKOCC 134 +#define IDC_MAIN_MARKALL_OCC 135 +#define IDT_TIMER_STATUSBAR 136 +#define IDC_UPDATE_STATUSBAR 137 #define IDC_BACKSLASHHELP 151 #define IDC_REGEXPHELP 152 #define IDC_WILDCARDHELP 153 @@ -385,11 +389,12 @@ #define IDM_VIEW_MARKOCCUR_CASE 40448 #define IDM_VIEW_MARKOCCUR_WORD 40449 #define IDM_VIEW_MARKOCCUR_CURRENT 40450 -#define IDM_VIEW_AUTOCOMPLETEWORDS 40451 -#define IDM_VIEW_ACCELWORDNAV 40452 -#define IDM_VIEW_NOPRESERVECARET 40453 -#define IDM_VIEW_HYPERLINKHOTSPOTS 40454 -#define IDM_VIEW_CURRENTSCHEME 40455 +#define IDM_VIEW_MARKOCCUR_VISIBLE 40451 +#define IDM_VIEW_AUTOCOMPLETEWORDS 40452 +#define IDM_VIEW_ACCELWORDNAV 40453 +#define IDM_VIEW_NOPRESERVECARET 40454 +#define IDM_VIEW_HYPERLINKHOTSPOTS 40455 +#define IDM_VIEW_CURRENTSCHEME 40456 #define IDM_HELP_ABOUT 40500 #define IDM_HELP_CMD 40501 #define IDM_HELP_ONLINEDOCUMENTATION 40502 From cacd252be0535f12e520bae352ce1214a83d9b95 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 3 Jan 2018 21:15:41 +0100 Subject: [PATCH 3/9] + enhancement: async mark all occurrences via timer (UI response) --- src/Edit.c | 21 ++-- src/Helpers.c | 26 ++--- src/Helpers.h | 1 + src/Notepad3.c | 291 +++++++++++++++++++++---------------------------- src/resource.h | 4 +- 5 files changed, 150 insertions(+), 193 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 7898f2c5e..3f5f4732a 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4310,7 +4310,6 @@ RegExResult_t __fastcall EditFindHasMatch(HWND hwnd, LPCEDITFINDREPLACE lpefr, B if (!bFirstMatchOnly) { if (bMarkAll && (iPos >= 0)) { - EditClearAllMarks(hwnd); EditMarkAll(hwnd, szFind, (int)(lpefr->fuFlags), 0, iTextLength, FALSE, FALSE); } else { @@ -4659,6 +4658,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA bFlagsChanged = FALSE; InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, TRUE); } + UpdateStatusbar(); } } break; @@ -5481,7 +5481,7 @@ void EditClearAllMarks(HWND hwnd) void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeEnd, BOOL bMatchCase, BOOL bMatchWords) { char* pszText = NULL; - char txtBuffer[LARGE_BUFFER] = { '\0' }; + char txtBuffer[HUGE_BUFFER] = { '\0' }; int iFindLength = 0; @@ -5490,14 +5490,17 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE else pszText = txtBuffer; + EditClearAllMarks(hwnd); + if (pszFind == NULL) { + if (SciCall_IsSelectionEmpty()) { if (flags) { // nothing selected, get word under caret if flagged int iCurrPos = SciCall_GetCurrentPos(); int iWordStart = (int)SendMessage(hwnd, SCI_WORDSTARTPOSITION, iCurrPos, (LPARAM)1); int iWordEnd = (int)SendMessage(hwnd, SCI_WORDENDPOSITION, iCurrPos, (LPARAM)1); - iFindLength = iWordEnd - iWordStart; + iFindLength = (iWordEnd - iWordStart); struct Sci_TextRange tr = { { 0, -1 }, NULL }; tr.lpstrText = pszText; tr.chrg.cpMin = iWordStart; @@ -5516,13 +5519,14 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE int iSelStart = SciCall_GetSelectionStart(); int iSelEnd = SciCall_GetSelectionEnd(); int iSelCount = (iSelEnd - iSelStart); - iFindLength = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)NULL) - 1; // if multiple lines are selected exit - if ((SciCall_LineFromPosition(iSelStart) != SciCall_LineFromPosition(iSelEnd)) || (iFindLength >= LARGE_BUFFER)) + + if ((SciCall_LineFromPosition(iSelStart) != SciCall_LineFromPosition(iSelEnd)) || (iSelCount >= HUGE_BUFFER)) { return; + } - (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)pszText); + iFindLength = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)pszText) - 1; // exit if selection is not a word and Match whole words only is enabled if (bMatchWords) { @@ -5536,7 +5540,6 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE } } } - // set additional flags flags = 0; flags |= (bMatchCase ? SCFIND_MATCHCASE : 0); @@ -5548,7 +5551,7 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE if (iFindLength > 0) { - int iTextLength = SciCall_GetTextLength(); + const int iTextLength = SciCall_GetTextLength(); rangeStart = max(0, rangeStart); rangeEnd = min(rangeEnd, iTextLength); @@ -5570,8 +5573,6 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE } while (start < end); // < iMarkOccurrencesMaxCount } - - UpdateStatusbar(); } diff --git a/src/Helpers.c b/src/Helpers.c index d82ee64fa..61d11ec75 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -889,6 +889,18 @@ void DeleteBitmapButton(HWND hwnd,int nCtlId) } +//============================================================================= +// +// SendWMSize() +// +LRESULT SendWMSize(HWND hwnd) +{ + RECT rc; GetClientRect(hwnd, &rc); + return(SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, + MAKELPARAM(rc.right, rc.bottom))); +} + + //============================================================================= // // StatusSetText() @@ -904,18 +916,6 @@ BOOL StatusSetText(HWND hwnd,UINT nPart,LPCWSTR lpszText) } -//============================================================================= -// -// SendWMSize() -// -LRESULT SendWMSize(HWND hwnd) -{ - RECT rc; GetClientRect(hwnd,&rc); - return(SendMessage(hwnd,WM_SIZE,SIZE_RESTORED, - MAKELPARAM(rc.right,rc.bottom))); -} - - //============================================================================= // // StatusSetTextID() @@ -924,7 +924,7 @@ BOOL StatusSetTextID(HWND hwnd,UINT nPart,UINT uID) { WCHAR szText[256] = { L'\0' }; - UINT uFlags = (nPart == 255) ? nPart|SBT_NOBORDERS : nPart; + UINT uFlags = (nPart == STATUS_HELP) ? nPart|SBT_NOBORDERS : nPart; if (!uID) { diff --git a/src/Helpers.h b/src/Helpers.h index 0c40c4412..e7d990014 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -72,6 +72,7 @@ __inline BOOL IniSectionSetBool(LPWSTR lpCachedIniSection, LPCWSTR lpName, BOOL //extern HWND g_hwndEdit; #define BeginWaitCursor(TCH) { SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORWAIT,0); StatusSetText(g_hwndStatus,STATUS_HELP,(TCH)); } +#define BeginWaitCursorID(UID) { SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORWAIT,0); StatusSetTextID(g_hwndStatus,STATUS_HELP,(UID)); } #define EndWaitCursor() { POINT pt; SendMessage(g_hwndEdit,SCI_SETCURSOR,(WPARAM)SC_CURSORNORMAL,0); GetCursorPos(&pt); SetCursorPos(pt.x,pt.y); StatusSetSimple(g_hwndStatus,FALSE); UpdateStatusbar(); } diff --git a/src/Notepad3.c b/src/Notepad3.c index 225c4d4c8..0fbbe00c0 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -1164,17 +1164,10 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) return DefWindowProc(hwnd,umsg,wParam,lParam); case WM_TIMER: - { - if (LOWORD(wParam) == IDT_TIMER_MAIN_MARKOCC) { - KillTimer(hwnd, IDT_TIMER_MAIN_MARKOCC); - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); - return TRUE; - } - else if (LOWORD(wParam) == IDT_TIMER_STATUSBAR) { - KillTimer(hwnd, IDT_TIMER_STATUSBAR); - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_UPDATE_STATUSBAR, 1), 0); - return TRUE; - } + if (LOWORD(wParam) == IDT_TIMER_MAIN_MRKALL) { + KillTimer(hwnd, IDT_TIMER_MAIN_MRKALL); + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); + return TRUE; } break; @@ -1447,9 +1440,6 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) g_hwndStatus == NULL || hwndToolbar == NULL || hwndReBar == NULL) return(-1); - SetTimer(hwnd, IDT_TIMER_MAIN_MARKOCC, 200, NULL); - SetTimer(hwnd, IDT_TIMER_STATUSBAR, 200, NULL); - UNUSED(wParam); return(0); } @@ -1650,10 +1640,6 @@ void MsgEndSession(HWND hwnd, UINT umsg) if (!bShutdownOK) { - // destroy timer - KillTimer(hwnd, IDT_TIMER_MAIN_MARKOCC); - KillTimer(hwnd, IDT_TIMER_STATUSBAR); - // Terminate file watching InstallFileWatching(NULL); @@ -2516,131 +2502,7 @@ LRESULT MsgSysCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) //============================================================================= // -// UpdateStatusbarTimer() -// -// -void _fastcall UpdateStatusbarTimer() -{ - static WCHAR tchLn[32] = { L'\0' }; - static WCHAR tchLines[32] = { L'\0' }; - static WCHAR tchCol[32] = { L'\0' }; - static WCHAR tchCols[32] = { L'\0' }; - static WCHAR tchSel[32] = { L'\0' }; - static WCHAR tchOcc[32] = { L'\0' }; - static WCHAR tchDocPos[256] = { L'\0' }; - - int iBytes; - static WCHAR tchBytes[64] = { L'\0' }; - static WCHAR tchDocSize[256] = { L'\0' }; - - static WCHAR tchEOLMode[32] = { L'\0' }; - static WCHAR tchOvrMode[32] = { L'\0' }; - static WCHAR tchLexerName[128] = { L'\0' }; - static WCHAR tchLinesSelected[32] = { L'\0' }; - - if (!bShowStatusbar) - return; - - int iPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); - - int iLn = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iPos, 0) + 1; - StringCchPrintf(tchLn, COUNTOF(tchLn), L"%i", iLn); - FormatNumberStr(tchLn); - - int iLines = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); - StringCchPrintf(tchLines, COUNTOF(tchLines), L"%i", iLines); - FormatNumberStr(tchLines); - - int iCol = (int)SendMessage(g_hwndEdit, SCI_GETCOLUMN, iPos, 0) + 1; - iCol += (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONNCARETVIRTUALSPACE, 0, 0); - - StringCchPrintf(tchCol, COUNTOF(tchCol), L"%i", iCol); - FormatNumberStr(tchCol); - - if (bMarkLongLines) { - StringCchPrintf(tchCols, COUNTOF(tchCols), L"%i", iLongLinesLimit); - FormatNumberStr(tchCols); - } - - int iSelStart = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0); - int iSelEnd = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0); - - // Print number of selected chars in statusbar - if (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0)) { - int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd); - StringCchPrintf(tchSel, COUNTOF(tchSel), L"%i", iSel); - FormatNumberStr(tchSel); - } - else - StringCchCopy(tchSel, COUNTOF(tchSel), L"--"); - - - if ((iMarkOccurrencesCount >= 0) && !bMarkOccurrencesMatchVisible) { - - //if (iMarkOccurrencesCount < iMarkOccurrencesMaxCount) { - // StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount); - // FormatNumberStr(tchOcc); - //} - //else - // StringCchPrintf(tchOcc, COUNTOF(tchOcc), L">= %i", iMarkOccurrencesMaxCount); - - StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount); - FormatNumberStr(tchOcc); - } - else - StringCchCopy(tchOcc, COUNTOF(tchOcc), L"--"); - - - // Print number of lines selected lines in statusbar - int iLineStart = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelStart, 0); - int iLineEnd = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelEnd, 0); - int iStartOfLinePos = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, iLineEnd, 0); - int iLinesSelected = iLineEnd - iLineStart; - if ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) iLinesSelected += 1; - StringCchPrintf(tchLinesSelected, COUNTOF(tchLinesSelected), L"%i", iLinesSelected); - FormatNumberStr(tchLinesSelected); - - if (!bMarkLongLines) - FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS, tchLn, tchLines, tchCol, tchSel, tchLinesSelected, tchOcc); - else - FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS2, tchLn, tchLines, tchCol, tchCols, tchSel, tchLinesSelected, tchOcc); - - iBytes = (int)SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0); - StrFormatByteSize(iBytes, tchBytes, COUNTOF(tchBytes)); - - FormatString(tchDocSize, COUNTOF(tchDocSize), IDS_DOCSIZE, tchBytes); - - Encoding_GetLabel(Encoding_Current(CPI_GET)); - - if (iEOLMode == SC_EOL_CR) - StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR"); - else if (iEOLMode == SC_EOL_LF) - StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" LF"); - else - StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR+LF"); - - if (SendMessage(g_hwndEdit, SCI_GETOVERTYPE, 0, 0)) - StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" OVR"); - else - StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" INS"); - - Style_GetCurrentLexerName(tchLexerName, COUNTOF(tchLexerName)); - - StatusSetText(g_hwndStatus, STATUS_DOCPOS, tchDocPos); - StatusSetText(g_hwndStatus, STATUS_DOCSIZE, tchDocSize); - StatusSetText(g_hwndStatus, STATUS_CODEPAGE, mEncoding[Encoding_Current(CPI_GET)].wchLabel); - StatusSetText(g_hwndStatus, STATUS_EOLMODE, tchEOLMode); - StatusSetText(g_hwndStatus, STATUS_OVRMODE, tchOvrMode); - StatusSetText(g_hwndStatus, STATUS_LEXER, tchLexerName); - - //InvalidateRect(g_hwndStatus,NULL,TRUE); -} - - - -//============================================================================= -// -// MarkAllOccurrencesTimer() - called by timer event only +// MarkAllOccurrencesTimer() // void __fastcall MarkAllOccurrencesTimer() { @@ -2653,18 +2515,18 @@ void __fastcall MarkAllOccurrencesTimer() int iEndLine = min((iFirstVisibleLine + (iLinesOnScreen << 1)), iLastLineOfDOc); int iPosStart = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, (WPARAM)iStartLine, 0); int iPosEnd = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, (WPARAM)iEndLine, 0); - EditClearAllMarks(g_hwndEdit); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, iPosStart, iPosEnd, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } else { - EditClearAllMarks(g_hwndEdit); - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, 0, SciCall_GetTextLength(), bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + const int iTextLength = (int)SendMessage(g_hwndEdit, SCI_GETTEXTLENGTH, 0, 0); + + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, 0, iTextLength, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } } } - //============================================================================= // // MsgCommand() - Handles WM_COMMAND @@ -2676,16 +2538,10 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) switch(LOWORD(wParam)) { - case IDC_UPDATE_STATUSBAR: - UpdateStatusbarTimer(); - break; - - case IDC_MAIN_MARKALL_OCC: MarkAllOccurrencesTimer(); break; - case IDM_FILE_NEW: FileLoad(FALSE,TRUE,FALSE,FALSE,L""); break; @@ -4398,11 +4254,11 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_VIEW_MARKOCCUR_ONOFF: iMarkOccurrences = (iMarkOccurrences == 0) ? max(1, IniGetInt(L"Settings", L"MarkOccurrences", 1)) : 0; - if (iMarkOccurrences == 0) { - EditClearAllMarks(g_hwndEdit); + if (iMarkOccurrences != 0) { + MarkAllOccurrences(); } else { - MarkAllOccurrences(); + EditClearAllMarks(g_hwndEdit); } break; @@ -4730,13 +4586,8 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) if (WritePrivateProfileString(L"Settings",L"WriteTest",L"ok",szIniFile)) { - BeginWaitCursor(NULL); - //StatusSetTextID(g_hwndStatus,STATUS_HELP,IDS_SAVINGSETTINGS); - //StatusSetSimple(g_hwndStatus,TRUE); - //InvalidateRect(g_hwndStatus,NULL,TRUE); - //UpdateWindow(g_hwndStatus); + BeginWaitCursorID(IDS_SAVINGSETTINGS); SaveSettings(TRUE); - //StatusSetSimple(g_hwndStatus,FALSE); EndWaitCursor(); MsgBox(MBINFO,IDS_SAVEDSETTINGS); } @@ -5710,7 +5561,6 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) { InvalidateSelections(); - // mark occurrences of text currently selected MarkAllOccurrences(); // Brace Match @@ -6157,7 +6007,7 @@ void LoadSettings() iMarkOccurrences = IniSectionGetInt(pIniSection,L"MarkOccurrences",1); iMarkOccurrences = max(min(iMarkOccurrences, 3), 0); - bMarkOccurrencesMatchVisible = IniSectionGetBool(pIniSection, L"MarkOccurrencesMatchVisible", TRUE); + bMarkOccurrencesMatchVisible = IniSectionGetBool(pIniSection, L"MarkOccurrencesMatchVisible", FALSE); bMarkOccurrencesMatchCase = IniSectionGetBool(pIniSection,L"MarkOccurrencesMatchCase",FALSE); bMarkOccurrencesMatchWords = IniSectionGetBool(pIniSection,L"MarkOccurrencesMatchWholeWords",TRUE); bMarkOccurrencesCurrentWord = IniSectionGetBool(pIniSection, L"MarkOccurrencesCurrentWord", !bMarkOccurrencesMatchWords); @@ -7237,7 +7087,7 @@ void UpdateEditWndUI() // void MarkAllOccurrences() { - SetTimer(g_hwndMain, IDT_TIMER_MAIN_MARKOCC, 100, NULL); + SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); } @@ -7296,12 +7146,119 @@ void UpdateToolbar() // UpdateStatusbar() // // -void UpdateStatusbar() +void UpdateStatusbar() { - SetTimer(g_hwndMain, IDT_TIMER_STATUSBAR, 100, NULL); + static WCHAR tchLn[32] = { L'\0' }; + static WCHAR tchLines[32] = { L'\0' }; + static WCHAR tchCol[32] = { L'\0' }; + static WCHAR tchCols[32] = { L'\0' }; + static WCHAR tchSel[32] = { L'\0' }; + static WCHAR tchOcc[32] = { L'\0' }; + static WCHAR tchDocPos[256] = { L'\0' }; + + int iBytes; + static WCHAR tchBytes[64] = { L'\0' }; + static WCHAR tchDocSize[256] = { L'\0' }; + + static WCHAR tchEOLMode[32] = { L'\0' }; + static WCHAR tchOvrMode[32] = { L'\0' }; + static WCHAR tchLexerName[128] = { L'\0' }; + static WCHAR tchLinesSelected[32] = { L'\0' }; + + if (!bShowStatusbar) + return; + + int iPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); + + int iLn = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iPos, 0) + 1; + StringCchPrintf(tchLn, COUNTOF(tchLn), L"%i", iLn); + FormatNumberStr(tchLn); + + int iLines = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); + StringCchPrintf(tchLines, COUNTOF(tchLines), L"%i", iLines); + FormatNumberStr(tchLines); + + int iCol = (int)SendMessage(g_hwndEdit, SCI_GETCOLUMN, iPos, 0) + 1; + iCol += (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONNCARETVIRTUALSPACE, 0, 0); + + StringCchPrintf(tchCol, COUNTOF(tchCol), L"%i", iCol); + FormatNumberStr(tchCol); + + if (bMarkLongLines) { + StringCchPrintf(tchCols, COUNTOF(tchCols), L"%i", iLongLinesLimit); + FormatNumberStr(tchCols); + } + + int iSelStart = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0); + int iSelEnd = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0); + + // Print number of selected chars in statusbar + if (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0)) { + int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd); + StringCchPrintf(tchSel, COUNTOF(tchSel), L"%i", iSel); + FormatNumberStr(tchSel); + } + else + StringCchCopy(tchSel, COUNTOF(tchSel), L"--"); + + + if ((iMarkOccurrencesCount > 0) && !bMarkOccurrencesMatchVisible) { + StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount); + FormatNumberStr(tchOcc); + } + else { + StringCchCopy(tchOcc, COUNTOF(tchOcc), L"--"); + } + + // Print number of lines selected lines in statusbar + int iLineStart = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelStart, 0); + int iLineEnd = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelEnd, 0); + int iStartOfLinePos = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, iLineEnd, 0); + int iLinesSelected = iLineEnd - iLineStart; + if ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) iLinesSelected += 1; + StringCchPrintf(tchLinesSelected, COUNTOF(tchLinesSelected), L"%i", iLinesSelected); + FormatNumberStr(tchLinesSelected); + + if (!bMarkLongLines) + FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS, tchLn, tchLines, tchCol, tchSel, tchLinesSelected, tchOcc); + else + FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS2, tchLn, tchLines, tchCol, tchCols, tchSel, tchLinesSelected, tchOcc); + + iBytes = (int)SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0); + StrFormatByteSize(iBytes, tchBytes, COUNTOF(tchBytes)); + + FormatString(tchDocSize, COUNTOF(tchDocSize), IDS_DOCSIZE, tchBytes); + + Encoding_GetLabel(Encoding_Current(CPI_GET)); + + if (iEOLMode == SC_EOL_CR) + StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR"); + else if (iEOLMode == SC_EOL_LF) + StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" LF"); + else + StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR+LF"); + + if (SendMessage(g_hwndEdit, SCI_GETOVERTYPE, 0, 0)) + StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" OVR"); + else + StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" INS"); + + Style_GetCurrentLexerName(tchLexerName, COUNTOF(tchLexerName)); + + StatusSetText(g_hwndStatus, STATUS_DOCPOS, tchDocPos); + StatusSetText(g_hwndStatus, STATUS_DOCSIZE, tchDocSize); + StatusSetText(g_hwndStatus, STATUS_CODEPAGE, mEncoding[Encoding_Current(CPI_GET)].wchLabel); + StatusSetText(g_hwndStatus, STATUS_EOLMODE, tchEOLMode); + StatusSetText(g_hwndStatus, STATUS_OVRMODE, tchOvrMode); + StatusSetText(g_hwndStatus, STATUS_LEXER, tchLexerName); + + //InvalidateRect(g_hwndStatus,NULL,TRUE); } + + + //============================================================================= // // UpdateLineNumberWidth() diff --git a/src/resource.h b/src/resource.h index 4a8a9c229..948674db1 100644 --- a/src/resource.h +++ b/src/resource.h @@ -120,10 +120,8 @@ #define IDC_ALL_OCCURRENCES 131 #define IDC_MARKALL_OCC 132 #define IDC_DOT_MATCH_ALL 133 -#define IDT_TIMER_MAIN_MARKOCC 134 +#define IDT_TIMER_MAIN_MRKALL 134 #define IDC_MAIN_MARKALL_OCC 135 -#define IDT_TIMER_STATUSBAR 136 -#define IDC_UPDATE_STATUSBAR 137 #define IDC_BACKSLASHHELP 151 #define IDC_REGEXPHELP 152 #define IDC_WILDCARDHELP 153 From 437accfdf004ccf3cf341ec97bd08a2de169a42d Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 3 Jan 2018 21:30:39 +0100 Subject: [PATCH 4/9] + fix: menu wording --- src/Notepad3.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Notepad3.rc b/src/Notepad3.rc index bd61d349a..352faa98a 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -305,10 +305,10 @@ BEGIN MENUITEM "&Active", IDM_VIEW_MARKOCCUR_ONOFF MENUITEM SEPARATOR MENUITEM "Match Visible Only", IDM_VIEW_MARKOCCUR_VISIBLE - MENUITEM "Match &Case", IDM_VIEW_MARKOCCUR_CASE + MENUITEM "Match &Case Sensitive", IDM_VIEW_MARKOCCUR_CASE MENUITEM SEPARATOR MENUITEM "Match &Whole Word Only", IDM_VIEW_MARKOCCUR_WORD - MENUITEM "&Instant Match Word", IDM_VIEW_MARKOCCUR_CURRENT + MENUITEM "Match Cu&rrent Word", IDM_VIEW_MARKOCCUR_CURRENT END MENUITEM SEPARATOR MENUITEM "Line &Numbers\tCtrl+Shift+N", IDM_VIEW_LINENUMBERS From 244f4c5f0de33487dbf2196847b049f461148340 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 4 Jan 2018 10:58:21 +0100 Subject: [PATCH 5/9] + fix: "Match Current Word" should not highlight partial word matches in other lines + add: Hyperlink Hotspot Style updates on UpdateUI event (visible area only) + minor performance enhancements --- src/Edit.c | 4 +- src/Notepad3.c | 149 +++++++++++++++++++++++++++++++------------------ src/Notepad3.h | 1 + src/SciCall.h | 2 + src/Styles.c | 2 +- src/resource.h | 2 + 6 files changed, 104 insertions(+), 56 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 3f5f4732a..f320e4e7a 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -5541,9 +5541,9 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE } } // set additional flags - flags = 0; + flags = flags ? SCFIND_WHOLEWORD : 0; // match current word under caret ? + flags |= (bMatchWords) ? SCFIND_WHOLEWORD : 0; flags |= (bMatchCase ? SCFIND_MATCHCASE : 0); - flags |= (bMatchWords ? SCFIND_WHOLEWORD : 0); } else { iFindLength = StringCchLenA(pszFind, FNDRPL_BUFFER); diff --git a/src/Notepad3.c b/src/Notepad3.c index 0fbbe00c0..5a5782c0f 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -307,7 +307,6 @@ HANDLE g_hScintilla; WCHAR g_wchAppUserModelID[32] = { L'\0' }; WCHAR g_wchWorkingDirectory[MAX_PATH+2] = { L'\0' }; - // undo / redo selections static UT_icd UndoRedoSelection_icd = { sizeof(UndoRedoSelection_t), NULL, NULL, NULL }; static UT_array* UndoRedoSelectionUTArray = NULL; @@ -1159,8 +1158,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) // update Scintilla colors case WM_SYSCOLORCHANGE: - EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); UpdateLineNumberWidth(); + MarkAllOccurrences(); + EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); return DefWindowProc(hwnd,umsg,wParam,lParam); case WM_TIMER: @@ -1169,6 +1169,11 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); return TRUE; } + else if (LOWORD(wParam) == IDT_TIMER_UPDATE_HOTSPOT) { + KillTimer(hwnd, IDT_TIMER_UPDATE_HOTSPOT); + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_CALL_UPDATE_HOTSPOT, 1), 0); + return TRUE; + } break; case WM_SIZE: @@ -1756,6 +1761,7 @@ void MsgThemeChanged(HWND hwnd,WPARAM wParam,LPARAM lParam) UpdateToolbar(); UpdateStatusbar(); UpdateLineNumberWidth(); + MarkAllOccurrences(); EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); UNUSED(lParam); @@ -2255,7 +2261,7 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam) i = !(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0); - i2 = (int)SendMessage(g_hwndEdit, SCI_GETTEXTLENGTH, 0, 0); + i2 = SciCall_GetTextLength(); i3 = (int)SendMessage(g_hwndEdit, SCI_CANPASTE, 0, 0); EnableCmd(hmenu,IDM_EDIT_CUT,i2 /*&& !bReadOnly*/); // allow Ctrl-X w/o selection @@ -2507,26 +2513,48 @@ LRESULT MsgSysCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) void __fastcall MarkAllOccurrencesTimer() { if (iMarkOccurrences != 0) { - if (bMarkOccurrencesMatchVisible) { - int iLinesOnScreen = (int)SendMessage(g_hwndEdit, SCI_LINESONSCREEN, 0, 0); + if (bMarkOccurrencesMatchVisible) + { + // get visible lines for update int iFirstVisibleLine = (int)SendMessage(g_hwndEdit, SCI_GETFIRSTVISIBLELINE, 0, 0); - int iLastLineOfDOc = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); - int iStartLine = max(0, (iFirstVisibleLine - iLinesOnScreen)); - int iEndLine = min((iFirstVisibleLine + (iLinesOnScreen << 1)), iLastLineOfDOc); - int iPosStart = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, (WPARAM)iStartLine, 0); - int iPosEnd = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, (WPARAM)iEndLine, 0); + + int iStartLine = max(0, (iFirstVisibleLine - SciCall_LinesOnScreen())); + int iEndLine = min((iFirstVisibleLine + (SciCall_LinesOnScreen() << 1)), (SciCall_GetLineCount() - 1)); + + int iPosStart = SciCall_PositionFromLine(iStartLine); + int iPosEnd = SciCall_GetLineEndPosition(iEndLine); EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, iPosStart, iPosEnd, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } else { - const int iTextLength = (int)SendMessage(g_hwndEdit, SCI_GETTEXTLENGTH, 0, 0); - - EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, 0, iTextLength, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); + EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, 0, SciCall_GetTextLength(), bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); } } } +//============================================================================= +// +// UpdateVisibleUrlHotspotTimer() +// +void __fastcall UpdateVisibleUrlHotspotTimer() +{ + if (bHyperlinkHotspot) + { + // get visible lines for update + int iFirstVisibleLine = SciCall_GetFirstVisibleLine(); + + int iStartLine = max(0, (iFirstVisibleLine - SciCall_LinesOnScreen())); + int iEndLine = min((iFirstVisibleLine + (SciCall_LinesOnScreen() << 1)), (SciCall_GetLineCount() - 1)); + + int iPosStart = SciCall_PositionFromLine(iStartLine); + int iPosEnd = SciCall_GetLineEndPosition(iEndLine); + + EditUpdateUrlHotspots(g_hwndEdit, iPosStart, iPosEnd, bHyperlinkHotspot); + } +} + + //============================================================================= // // MsgCommand() - Handles WM_COMMAND @@ -2542,6 +2570,10 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) MarkAllOccurrencesTimer(); break; + case IDC_CALL_UPDATE_HOTSPOT: + UpdateVisibleUrlHotspotTimer(); + break; + case IDM_FILE_NEW: FileLoad(FALSE,TRUE,FALSE,FALSE,L""); break; @@ -3956,8 +3988,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) int iNextLine = (int)SendMessage( g_hwndEdit , SCI_MARKERPREVIOUS , iLine-1 , bitmask ); if( iNextLine == -1 ) { - int nLines = (int)SendMessage( g_hwndEdit , SCI_GETLINECOUNT , 0 , 0 ); - iNextLine = (int)SendMessage( g_hwndEdit , SCI_MARKERPREVIOUS , nLines , bitmask ); + iNextLine = (int)SendMessage( g_hwndEdit , SCI_MARKERPREVIOUS , SciCall_GetLineCount(), bitmask ); } if( iNextLine != -1 ) @@ -5549,6 +5580,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) } break; + //case SCN_STYLENEEDED: // this event needs SCI_SETLEXER(SCLEX_CONTAINER) // { // int lineNumber = SciCall_LineFromPosition(SciCall_GetEndStyled()); @@ -5556,6 +5588,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) // } // break; + case SCN_UPDATEUI: if (scn->updated & ~(SC_UPDATE_V_SCROLL | SC_UPDATE_H_SCROLL)) { @@ -5570,13 +5603,36 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) UpdateToolbar(); UpdateStatusbar(); + UpdateVisibleUrlHotspot(); } - else if ((scn->updated & SC_UPDATE_V_SCROLL) && bMarkOccurrencesMatchVisible) + else if (scn->updated & SC_UPDATE_V_SCROLL) { MarkAllOccurrences(); + UpdateVisibleUrlHotspot(); } break; + + case SCN_MODIFIED: + // check for ADDUNDOACTION step + if (scn->modificationType & SC_MOD_CONTAINER) { + if (scn->modificationType & SC_PERFORMED_UNDO) { + RestoreSelectionAction(scn->token, UNDO); + } + else if (scn->modificationType & SC_PERFORMED_REDO) { + RestoreSelectionAction(scn->token, REDO); + } + } + else if (scn->modificationType & SC_MOD_CHANGESTYLE) { + EditUpdateUrlHotspots(g_hwndEdit, (int)scn->position, (int)(scn->position + scn->length), bHyperlinkHotspot); + } + if (scn->linesAdded != 0) { + UpdateLineNumberWidth(); + } + bModified = TRUE; + break; + + case SCN_CHARADDED: // Auto indent if (bAutoIndent && (scn->ch == '\x0D' || scn->ch == '\x0A')) @@ -5708,54 +5764,38 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) } } } - else if (bAutoCompleteWords && !SendMessage(g_hwndEdit, SCI_AUTOCACTIVE, 0, 0)) + else if (bAutoCompleteWords && !SendMessage(g_hwndEdit, SCI_AUTOCACTIVE, 0, 0)) { EditCompleteWord(g_hwndEdit, FALSE); - + } break; - case SCN_MODIFIED: - // check for ADDUNDOACTION step - if (scn->modificationType & SC_MOD_CONTAINER) { - if (scn->modificationType & SC_PERFORMED_UNDO) { - RestoreSelectionAction(scn->token,UNDO); - } else if (scn->modificationType & SC_PERFORMED_REDO) { - RestoreSelectionAction(scn->token,REDO); - } - } - else if (scn->modificationType & SC_MOD_CHANGESTYLE) { - EditUpdateUrlHotspots(g_hwndEdit, (int)scn->position, (int)(scn->position + scn->length), bHyperlinkHotspot); - } - if (scn->linesAdded != 0) { - EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); - UpdateLineNumberWidth(); - } - bModified = TRUE; - break; case SCN_ZOOM: UpdateLineNumberWidth(); break; + case SCN_SAVEPOINTREACHED: bModified = FALSE; UpdateToolbar(); - EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); break; + case SCN_MARGINCLICK: if (scn->margin == MARGIN_FOLD_INDEX) FoldClick(SciCall_LineFromPosition(scn->position), scn->modifiers); break; + case SCN_KEY: // Also see the corresponding patch in scintilla\src\Editor.cxx FoldAltArrow(scn->ch, scn->modifiers); break; + case SCN_SAVEPOINTLEFT: bModified = TRUE; UpdateToolbar(); - //~EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot); break; } break; @@ -6078,8 +6118,7 @@ void LoadSettings() bTransparentMode = IniSectionGetBool(pIniSection,L"TransparentMode",FALSE); // Check if SetLayeredWindowAttributes() is available - bTransparentModeAvailable = - (GetProcAddress(GetModuleHandle(L"User32"),"SetLayeredWindowAttributes") != NULL); + bTransparentModeAvailable = (GetProcAddress(GetModuleHandle(L"User32"),"SetLayeredWindowAttributes") != NULL); bTransparentModeAvailable = (bTransparentModeAvailable) ? TRUE : FALSE; IniSectionGetString(pIniSection,L"ToolbarButtons",L"",tchToolbarButtons,COUNTOF(tchToolbarButtons)); @@ -7090,6 +7129,15 @@ void MarkAllOccurrences() SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); } +//============================================================================= +// +// UpdateVisibleUrlHotspot() +// +void UpdateVisibleUrlHotspot() +{ + SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 250, NULL); +} + //============================================================================= // @@ -7117,7 +7165,7 @@ void UpdateToolbar() int i, i2, i3; i = !(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0); - i2 = (int)SendMessage(g_hwndEdit, SCI_GETTEXTLENGTH, 0, 0); + i2 = SciCall_GetTextLength(); i3 = (int)SendMessage(g_hwndEdit, SCI_CANPASTE, 0, 0); @@ -7174,8 +7222,7 @@ void UpdateStatusbar() StringCchPrintf(tchLn, COUNTOF(tchLn), L"%i", iLn); FormatNumberStr(tchLn); - int iLines = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); - StringCchPrintf(tchLines, COUNTOF(tchLines), L"%i", iLines); + StringCchPrintf(tchLines, COUNTOF(tchLines), L"%i", SciCall_GetLineCount()); FormatNumberStr(tchLines); int iCol = (int)SendMessage(g_hwndEdit, SCI_GETCOLUMN, iPos, 0) + 1; @@ -7256,9 +7303,6 @@ void UpdateStatusbar() } - - - //============================================================================= // // UpdateLineNumberWidth() @@ -7266,12 +7310,10 @@ void UpdateStatusbar() // void UpdateLineNumberWidth() { - if (bShowLineNumbers) + if (bShowLineNumbers) { - int iLineCnt = (int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0); - char chLines[32] = { '\0' }; - StringCchPrintfA(chLines, COUNTOF(chLines), "_%i_", iLineCnt); + StringCchPrintfA(chLines, COUNTOF(chLines), "_%i_", SciCall_GetLineCount()); int iLineMarginWidthNow = (int)SendMessage(g_hwndEdit, SCI_GETMARGINWIDTHN, MARGIN_NP3_LINENUM, 0); int iLineMarginWidthFit = (int)SendMessage(g_hwndEdit, SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)chLines); @@ -7280,8 +7322,9 @@ void UpdateLineNumberWidth() SendMessage(g_hwndEdit, SCI_SETMARGINWIDTHN, MARGIN_NP3_LINENUM, iLineMarginWidthFit); } } - else - SendMessage(g_hwndEdit,SCI_SETMARGINWIDTHN, MARGIN_NP3_LINENUM, 0); + else { + SendMessage(g_hwndEdit, SCI_SETMARGINWIDTHN, MARGIN_NP3_LINENUM, 0); + } } @@ -7761,7 +7804,7 @@ BOOL FileRevert(LPCWSTR szFileName) int iDocTopLine = (int)SendMessage(g_hwndEdit,SCI_DOCLINEFROMVISIBLE,(WPARAM)iVisTopLine,0); int iXOffset = (int)SendMessage(g_hwndEdit,SCI_GETXOFFSET,0,0); //BOOL bIsTail = (iCurPos == iAnchorPos) && (iCurPos == SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0)); - BOOL bIsTail = (iCurPos == iAnchorPos) && (iCurrLine >= ((int)SendMessage(g_hwndEdit, SCI_GETLINECOUNT, 0, 0) - 1)); + BOOL bIsTail = (iCurPos == iAnchorPos) && (iCurrLine >= (SciCall_GetLineCount() - 1)); Encoding_SrcWeak(Encoding_Current(CPI_GET)); diff --git a/src/Notepad3.h b/src/Notepad3.h index 22e6a63a0..71ca584ab 100644 --- a/src/Notepad3.h +++ b/src/Notepad3.h @@ -145,6 +145,7 @@ void UpdateToolbar(); void UpdateStatusbar(); void UpdateLineNumberWidth(); void UpdateSettingsCmds(); +void UpdateVisibleUrlHotspot(); void InvalidateSelections(); diff --git a/src/SciCall.h b/src/SciCall.h index 7705e1f61..b40006688 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -106,6 +106,8 @@ DeclareSciCallR1(PositionFromLine, POSITIONFROMLINE, int, Sci_Position, line); DeclareSciCallR1(GetLineEndPosition, GETLINEENDPOSITION, int, Sci_Position, line); DeclareSciCallR0(GetEndStyled, GETENDSTYLED, int); DeclareSciCallR1(GetColumn, GETCOLUMN, int, Sci_Position, position); +DeclareSciCallR0(LinesOnScreen, LINESONSCREEN, int); +DeclareSciCallR0(GetFirstVisibleLine, GETFIRSTVISIBLELINE, int); DeclareSciCallR1(GetCharAt, GETCHARAT, char, Sci_Position, position); diff --git a/src/Styles.c b/src/Styles.c index c1610a041..794ca41e2 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -6,7 +6,7 @@ * Styles.c * * Scintilla Style Management * * Based on code from Notepad2, (c) Florian Balmer 1996-2011 * -* Mostly taken from SciTE, (c) Neil Hodgson * +* Mostly taken from SciTE, (c) Neil Hodgson * * * * (c) Rizonesoft 2008-2016 * * http://www.rizonesoft.com * diff --git a/src/resource.h b/src/resource.h index 948674db1..dc8d58418 100644 --- a/src/resource.h +++ b/src/resource.h @@ -122,6 +122,8 @@ #define IDC_DOT_MATCH_ALL 133 #define IDT_TIMER_MAIN_MRKALL 134 #define IDC_MAIN_MARKALL_OCC 135 +#define IDT_TIMER_UPDATE_HOTSPOT 136 +#define IDC_CALL_UPDATE_HOTSPOT 137 #define IDC_BACKSLASHHELP 151 #define IDC_REGEXPHELP 152 #define IDC_WILDCARDHELP 153 From 05b0ff10c848fa9aa393ccd78c9999f4a300ed51 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 4 Jan 2018 14:13:39 +0100 Subject: [PATCH 6/9] + fix: fetching wrong visible document line number in case of hidden or wrapped lines + fix: ignoring queued timer event, if timer has been killed --- src/Notepad3.c | 25 ++++++++++++++++++------- src/SciCall.h | 1 + 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/Notepad3.c b/src/Notepad3.c index 5a5782c0f..431033fa7 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -317,6 +317,12 @@ static POINTL ptDummy = { 0, 0 }; static PDROPTARGET pDropTarget = NULL; static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); +// Timer bitfield +static volatile LONG g_lTimerBits = 0; +#define TIMER_BIT_MARK_OCC 1L +#define TIMER_BIT_UPDATE_HYPER 2L +#define TEST_AND_SET(B) InterlockedBitTestAndSet(&g_lTimerBits, B) +#define TEST_AND_RESET(B) InterlockedBitTestAndReset(&g_lTimerBits, B) //============================================================================= // @@ -1155,7 +1161,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) MsgThemeChanged(hwnd,wParam,lParam); break; - // update Scintilla colors case WM_SYSCOLORCHANGE: UpdateLineNumberWidth(); @@ -1165,13 +1170,17 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) case WM_TIMER: if (LOWORD(wParam) == IDT_TIMER_MAIN_MRKALL) { - KillTimer(hwnd, IDT_TIMER_MAIN_MRKALL); - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); + if (TEST_AND_RESET(TIMER_BIT_MARK_OCC)) { + KillTimer(hwnd, IDT_TIMER_MAIN_MRKALL); + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); + } return TRUE; } else if (LOWORD(wParam) == IDT_TIMER_UPDATE_HOTSPOT) { - KillTimer(hwnd, IDT_TIMER_UPDATE_HOTSPOT); - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_CALL_UPDATE_HOTSPOT, 1), 0); + if (TEST_AND_RESET(TIMER_BIT_UPDATE_HYPER)) { + KillTimer(hwnd, IDT_TIMER_UPDATE_HOTSPOT); + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_CALL_UPDATE_HOTSPOT, 1), 0); + } return TRUE; } break; @@ -2516,7 +2525,7 @@ void __fastcall MarkAllOccurrencesTimer() if (bMarkOccurrencesMatchVisible) { // get visible lines for update - int iFirstVisibleLine = (int)SendMessage(g_hwndEdit, SCI_GETFIRSTVISIBLELINE, 0, 0); + int iFirstVisibleLine = SciCall_DocLineFromVisible(SciCall_GetFirstVisibleLine()); int iStartLine = max(0, (iFirstVisibleLine - SciCall_LinesOnScreen())); int iEndLine = min((iFirstVisibleLine + (SciCall_LinesOnScreen() << 1)), (SciCall_GetLineCount() - 1)); @@ -2542,7 +2551,7 @@ void __fastcall UpdateVisibleUrlHotspotTimer() if (bHyperlinkHotspot) { // get visible lines for update - int iFirstVisibleLine = SciCall_GetFirstVisibleLine(); + int iFirstVisibleLine = SciCall_DocLineFromVisible(SciCall_GetFirstVisibleLine()); int iStartLine = max(0, (iFirstVisibleLine - SciCall_LinesOnScreen())); int iEndLine = min((iFirstVisibleLine + (SciCall_LinesOnScreen() << 1)), (SciCall_GetLineCount() - 1)); @@ -7126,6 +7135,7 @@ void UpdateEditWndUI() // void MarkAllOccurrences() { + TEST_AND_SET(TIMER_BIT_MARK_OCC); SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); } @@ -7135,6 +7145,7 @@ void MarkAllOccurrences() // void UpdateVisibleUrlHotspot() { + TEST_AND_SET(TIMER_BIT_UPDATE_HYPER); SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 250, NULL); } diff --git a/src/SciCall.h b/src/SciCall.h index b40006688..6b6e8a41d 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -108,6 +108,7 @@ DeclareSciCallR0(GetEndStyled, GETENDSTYLED, int); DeclareSciCallR1(GetColumn, GETCOLUMN, int, Sci_Position, position); DeclareSciCallR0(LinesOnScreen, LINESONSCREEN, int); DeclareSciCallR0(GetFirstVisibleLine, GETFIRSTVISIBLELINE, int); +DeclareSciCallR1(DocLineFromVisible, DOCLINEFROMVISIBLE, int, Sci_Position, line); DeclareSciCallR1(GetCharAt, GETCHARAT, char, Sci_Position, position); From 7c104fac02d52c41364216374e2613a814247dbc Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 4 Jan 2018 15:22:01 +0100 Subject: [PATCH 7/9] + performance: optimizing timer handling to avoid multiple calls of complex methods --- src/Notepad3.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Notepad3.c b/src/Notepad3.c index 431033fa7..c36d2820d 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -1171,15 +1171,15 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) case WM_TIMER: if (LOWORD(wParam) == IDT_TIMER_MAIN_MRKALL) { if (TEST_AND_RESET(TIMER_BIT_MARK_OCC)) { - KillTimer(hwnd, IDT_TIMER_MAIN_MRKALL); PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MAIN_MARKALL_OCC, 1), 0); + KillTimer(hwnd, IDT_TIMER_MAIN_MRKALL); } return TRUE; } else if (LOWORD(wParam) == IDT_TIMER_UPDATE_HOTSPOT) { if (TEST_AND_RESET(TIMER_BIT_UPDATE_HYPER)) { - KillTimer(hwnd, IDT_TIMER_UPDATE_HOTSPOT); PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_CALL_UPDATE_HOTSPOT, 1), 0); + KillTimer(hwnd, IDT_TIMER_UPDATE_HOTSPOT); } return TRUE; } @@ -5787,6 +5787,10 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCN_SAVEPOINTREACHED: bModified = FALSE; UpdateToolbar(); + // just in really rare case of possible deadlock + // (flag set, but no timer event in msg queue to reset) + TEST_AND_RESET(TIMER_BIT_MARK_OCC); + TEST_AND_RESET(TIMER_BIT_UPDATE_HYPER); break; @@ -7135,8 +7139,9 @@ void UpdateEditWndUI() // void MarkAllOccurrences() { - TEST_AND_SET(TIMER_BIT_MARK_OCC); - SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); + if (!TEST_AND_SET(TIMER_BIT_MARK_OCC)) { + SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); + } } //============================================================================= @@ -7145,8 +7150,9 @@ void MarkAllOccurrences() // void UpdateVisibleUrlHotspot() { - TEST_AND_SET(TIMER_BIT_UPDATE_HYPER); - SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 250, NULL); + if (!TEST_AND_SET(TIMER_BIT_UPDATE_HYPER)) { + SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 250, NULL); + } } @@ -7197,6 +7203,7 @@ void UpdateToolbar() EnableTool(IDT_FILE_SAVE, (bModified || Encoding_HasChanged(CPI_GET)) /*&& !bReadOnly*/); CheckTool(IDT_VIEW_WORDWRAP,bWordWrap); + } From 11d877811870755c1fead9de53f5e3358c4b9f4a Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 4 Jan 2018 16:01:29 +0100 Subject: [PATCH 8/9] + fix: use current lexer's default text font size as base font size for relative sizing of other styles --- src/Styles.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Styles.c b/src/Styles.c index 794ca41e2..b3988e68c 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -3256,8 +3256,14 @@ void Style_SetLexer(HWND hwnd, PEDITLEXER pLexNew) { // global define current lexer g_pLexCurrent = pLexNew; - if (g_pLexCurrent != &lexStandard) { - Style_SetStyles(hwnd, STYLE_DEFAULT, g_pLexCurrent->Styles[STY_DEFAULT].szValue); + if (g_pLexCurrent != &lexStandard) + { + WCHAR* wchCurrentLexerStyleStrg = g_pLexCurrent->Styles[STY_DEFAULT].szValue; + // use this font size as new base + Style_StrGetSize(wchCurrentLexerStyleStrg, &iBaseFontSize); + Style_SetBaseFontSize(hwnd, iBaseFontSize); + // merge lexer styles + Style_SetStyles(hwnd, STYLE_DEFAULT, wchCurrentLexerStyleStrg); EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_CURRENTSCHEME, TRUE); } else { From 95a3eb9cc3214b23826425e19bd990e7a68f793b Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 4 Jan 2018 22:43:59 +0100 Subject: [PATCH 9/9] + performance: fixed some issuses, which eat up CPU :-) --- src/Edit.c | 81 +++++------- src/Notepad3.c | 343 +++++++++++++++++++++++++------------------------ src/SciCall.h | 1 + 3 files changed, 210 insertions(+), 215 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index f320e4e7a..5ae05e59e 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -3946,47 +3946,6 @@ void EditSortLines(HWND hwnd, int iSortFlags) } -//============================================================================= -// -// EditJumpTo() -// -void EditJumpTo(HWND hwnd,int iNewLine,int iNewCol) -{ - int iMaxLine = (int)SendMessage(hwnd,SCI_GETLINECOUNT,0,0); - - // Jumpt to end with line set to -1 - if (iNewLine == -1) { - SendMessage(hwnd,SCI_DOCUMENTEND,0,0); - return; - } - - // Line maximum is iMaxLine - iNewLine = min(iNewLine,iMaxLine); - - // Column minimum is 1 - iNewCol = max(iNewCol,1); - - if (iNewLine > 0 && iNewLine <= iMaxLine && iNewCol > 0) - { - int iNewPos = (int)SendMessage(hwnd,SCI_POSITIONFROMLINE,(WPARAM)iNewLine-1,0); - int iLineEndPos = (int)SendMessage(hwnd,SCI_GETLINEENDPOSITION,(WPARAM)iNewLine-1,0); - - while (iNewCol-1 > SendMessage(hwnd,SCI_GETCOLUMN,(WPARAM)iNewPos,0)) - { - if (iNewPos >= iLineEndPos) - break; - - iNewPos = (int)SendMessage(hwnd,SCI_POSITIONAFTER,(WPARAM)iNewPos,0); - } - - iNewPos = min(iNewPos,iLineEndPos); - - EditSelectEx(hwnd,-1,iNewPos); // SCI_GOTOPOS(pos) is equivalent to SCI_SETSEL(-1, pos) - SendMessage(hwnd,SCI_CHOOSECARETX,0,0); - } -} - - //============================================================================= // // EditSelectEx() @@ -4002,11 +3961,41 @@ void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos) if (iAnchorLine != iNewLine) { SciCall_EnsureVisible(iNewLine); } - SendMessage(hwnd,SCI_SETXCARETPOLICY,CARET_SLOP|CARET_STRICT|CARET_EVEN,50); - SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_SLOP|CARET_STRICT|CARET_EVEN,5); - SendMessage(hwnd,SCI_SETSEL,iAnchorPos,iCurrentPos); - SendMessage(hwnd,SCI_SETXCARETPOLICY,CARET_SLOP|CARET_EVEN,50); - SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_EVEN,0); + SendMessage(hwnd, SCI_SETXCARETPOLICY, CARET_SLOP | CARET_STRICT | CARET_EVEN, 50); + SendMessage(hwnd, SCI_SETYCARETPOLICY, CARET_SLOP | CARET_STRICT | CARET_EVEN, 5); + SendMessage(hwnd, SCI_SETSEL, iAnchorPos, iCurrentPos); + SendMessage(hwnd, SCI_SETXCARETPOLICY, CARET_SLOP | CARET_EVEN, 50); + SendMessage(hwnd, SCI_SETYCARETPOLICY, CARET_EVEN, 0); +} + + +//============================================================================= +// +// EditJumpTo() +// +void EditJumpTo(HWND hwnd,int iNewLine,int iNewCol) +{ + // Jumpt to end with line set to -1 + if (iNewLine < 0) { + SendMessage(hwnd, SCI_DOCUMENTEND, 0, 0); + return; + } + + const int iMaxLine = SciCall_GetLineCount(); + + // Line maximum is iMaxLine - 1 (doc line count starts with 0) + iNewLine = (min(iNewLine, iMaxLine) - 1); + const int iLineEndPos = SciCall_GetLineEndPosition(iNewLine); + + // Column minimum is 1 + iNewCol = max(0, min((iNewCol - 1), iLineEndPos)); + + const int iNewPos = (int)SendMessage(hwnd, SCI_FINDCOLUMN, (WPARAM)iNewLine, (LPARAM)iNewCol); + + EditSelectEx(hwnd, -1, iNewPos); // SCI_GOTOPOS(pos) is equivalent to SCI_SETSEL(-1, pos) + + // remember x-pos for moving caret vertivally + SendMessage(hwnd, SCI_CHOOSECARETX, 0, 0); } diff --git a/src/Notepad3.c b/src/Notepad3.c index c36d2820d..6dd3b9e68 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -5574,20 +5574,20 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDC_EDIT: - switch(pnmh->code) + switch (pnmh->code) { case SCN_HOTSPOTCLICK: - { - if (scn->modifiers & SCMOD_CTRL) { - // open in browser - OpenHotSpotURL((int)scn->position, TRUE); - } - if (scn->modifiers & SCMOD_ALT) { - // open in application, if applicable (file://) - OpenHotSpotURL((int)scn->position, FALSE); - } + { + if (scn->modifiers & SCMOD_CTRL) { + // open in browser + OpenHotSpotURL((int)scn->position, TRUE); } - break; + if (scn->modifiers & SCMOD_ALT) { + // open in application, if applicable (file://) + OpenHotSpotURL((int)scn->position, FALSE); + } + } + break; //case SCN_STYLENEEDED: // this event needs SCI_SETLEXER(SCLEX_CONTAINER) @@ -5597,184 +5597,189 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) // } // break; - case SCN_UPDATEUI: - if (scn->updated & ~(SC_UPDATE_V_SCROLL | SC_UPDATE_H_SCROLL)) - { - InvalidateSelections(); - MarkAllOccurrences(); + if (scn->updated & SC_UPDATE_SELECTION) + { + // !!! SC_UPDATE_CONTENT is triggered too often, + // even if nothing relevant has been modified + // relevant modifications are handled in SCN_MODIFIED !!! + + //~InvalidateSelections(); // fixed in SCI ? + + if (iMarkOccurrences) { + MarkAllOccurrences(); + } // Brace Match if (bMatchBraces) { EditMatchBrace(g_hwndEdit); } - UpdateToolbar(); + if (bHyperlinkHotspot) { + UpdateVisibleUrlHotspot(); + } + UpdateStatusbar(); - UpdateVisibleUrlHotspot(); } else if (scn->updated & SC_UPDATE_V_SCROLL) { - MarkAllOccurrences(); - UpdateVisibleUrlHotspot(); + if (iMarkOccurrences) { + MarkAllOccurrences(); + } + if (bHyperlinkHotspot) { + UpdateVisibleUrlHotspot(); + } } break; - + case SCN_MODIFIED: - // check for ADDUNDOACTION step - if (scn->modificationType & SC_MOD_CONTAINER) { - if (scn->modificationType & SC_PERFORMED_UNDO) { - RestoreSelectionAction(scn->token, UNDO); + { + // check for ADDUNDOACTION step + if (scn->modificationType & SC_MOD_CONTAINER) { + if (scn->modificationType & SC_PERFORMED_UNDO) { + RestoreSelectionAction(scn->token, UNDO); + } + else if (scn->modificationType & SC_PERFORMED_REDO) { + RestoreSelectionAction(scn->token, REDO); + } } - else if (scn->modificationType & SC_PERFORMED_REDO) { - RestoreSelectionAction(scn->token, REDO); + else if (scn->modificationType & SC_MOD_CHANGESTYLE) { + EditUpdateUrlHotspots(g_hwndEdit, (int)scn->position, (int)(scn->position + scn->length), bHyperlinkHotspot); } + + if (scn->linesAdded != 0) { + UpdateLineNumberWidth(); + } + + UpdateToolbar(); + UpdateStatusbar(); + + bModified = TRUE; } - else if (scn->modificationType & SC_MOD_CHANGESTYLE) { - EditUpdateUrlHotspots(g_hwndEdit, (int)scn->position, (int)(scn->position + scn->length), bHyperlinkHotspot); - } - if (scn->linesAdded != 0) { - UpdateLineNumberWidth(); - } - bModified = TRUE; break; case SCN_CHARADDED: - // Auto indent - if (bAutoIndent && (scn->ch == '\x0D' || scn->ch == '\x0A')) { - // in CRLF mode handle LF only... - if ((SC_EOL_CRLF == iEOLMode && scn->ch != '\x0A') || SC_EOL_CRLF != iEOLMode) + char chLineBuffer[FNDRPL_BUFFER] = { '\0' }; + + // Auto indent + if (bAutoIndent && (scn->ch == '\x0D' || scn->ch == '\x0A')) { - int iCurPos = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); - //int iAnchorPos = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0); - int iCurLine = (int)SendMessage(g_hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iCurPos,0); - //int iLineLength = (int)SendMessage(g_hwndEdit,SCI_LINELENGTH,iCurLine,0); - //int iIndentBefore = (int)SendMessage(g_hwndEdit,SCI_GETLINEINDENTATION,(WPARAM)iCurLine-1,0); - - // Move bookmark along with line if inserting lines (pressing return at beginning of line) because Scintilla does not do this for us - if( iCurLine > 0 ) + // in CRLF mode handle LF only... + if ((SC_EOL_CRLF == iEOLMode && scn->ch != '\x0A') || SC_EOL_CRLF != iEOLMode) { - int iPrevLineLength = (int)SendMessage(g_hwndEdit,SCI_GETLINEENDPOSITION,iCurLine-1,0) - (int)SendMessage(g_hwndEdit,SCI_POSITIONFROMLINE,iCurLine-1,0) ; - if( iPrevLineLength == 0 ) - { - int bitmask = (int)SendMessage( g_hwndEdit , SCI_MARKERGET , iCurLine-1 , 0 ); - if( bitmask & (1 << MARKER_NP3_BOOKMARK)) - { - SendMessage( g_hwndEdit , SCI_MARKERDELETE , iCurLine-1 , MARKER_NP3_BOOKMARK); - SendMessage( g_hwndEdit , SCI_MARKERADD , iCurLine , MARKER_NP3_BOOKMARK); - } - } - } + int iCurPos = SciCall_GetCurrentPos(); + int iCurLine = SciCall_LineFromPosition(iCurPos); - if (iCurLine > 0/* && iLineLength <= 2*/) - { - int iPrevLineLength = (int)SendMessage(g_hwndEdit,SCI_LINELENGTH,iCurLine-1,0); - char* pLineBuf = GlobalAlloc(GPTR, iPrevLineLength + 1); - if (pLineBuf) + // Move bookmark along with line if inserting lines (pressing return at beginning of line) because Scintilla does not do this for us + if (iCurLine > 0) { - SendMessage(g_hwndEdit,SCI_GETLINE,iCurLine-1,(LPARAM)pLineBuf); - *(pLineBuf+iPrevLineLength) = '\0'; - for (char* pPos = pLineBuf; *pPos; pPos++) { - if (*pPos != ' ' && *pPos != '\t') - *pPos = '\0'; - } - if (*pLineBuf) { - //int iPrevLineStartPos; - //int iPrevLineEndPos; - //int iPrevLineIndentPos; - - SendMessage(g_hwndEdit,SCI_BEGINUNDOACTION,0,0); - SendMessage(g_hwndEdit,SCI_ADDTEXT,lstrlenA(pLineBuf),(LPARAM)pLineBuf); - SendMessage(g_hwndEdit,SCI_ENDUNDOACTION,0,0); - - //iPrevLineStartPos = (int)SendMessage(g_hwndEdit,SCI_POSITIONFROMLINE,(WPARAM)iCurLine-1,0); - //iPrevLineEndPos = (int)SendMessage(g_hwndEdit,SCI_GETLINEENDPOSITION,(WPARAM)iCurLine-1,0); - //iPrevLineIndentPos = (int)SendMessage(g_hwndEdit,SCI_GETLINEINDENTPOSITION,(WPARAM)iCurLine-1,0); - - //if (iPrevLineEndPos == iPrevLineIndentPos) { - // SendMessage(g_hwndEdit,SCI_BEGINUNDOACTION,0,0); - // SendMessage(g_hwndEdit,SCI_SETTARGETSTART,(WPARAM)iPrevLineStartPos,0); - // SendMessage(g_hwndEdit,SCI_SETTARGETEND,(WPARAM)iPrevLineEndPos,0); - // SendMessage(g_hwndEdit,SCI_REPLACETARGET,0,(LPARAM)""); - // SendMessage(g_hwndEdit,SCI_ENDUNDOACTION,0,0); - //} - } - GlobalFree(pLineBuf); - //int iIndent = (int)SendMessage(g_hwndEdit,SCI_GETLINEINDENTATION,(WPARAM)iCurLine,0); - //SendMessage(g_hwndEdit,SCI_SETLINEINDENTATION,(WPARAM)iCurLine,(LPARAM)iIndentBefore); - //iIndentLen = /*- iIndent +*/ SendMessage(g_hwndEdit,SCI_GETLINEINDENTATION,(WPARAM)iCurLine,0); - //if (iIndentLen > 0) - // SendMessage(g_hwndEdit,SCI_SETSEL,(WPARAM)iAnchorPos+iIndentLen,(LPARAM)iCurPos+iIndentLen); - } - } - } - } - // Auto close tags - else if (bAutoCloseTags && scn->ch == '>') - { - //int iLexer = (int)SendMessage(g_hwndEdit,SCI_GETLEXER,0,0); - if (/*iLexer == SCLEX_HTML || iLexer == SCLEX_XML*/ 1) - { - char tchBuf[512] = { '\0' }; - int iCurPos = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); - int iHelper = iCurPos - (COUNTOF(tchBuf) - 1); - int iStartPos = max(0,iHelper); - int iSize = iCurPos - iStartPos; - - if (iSize >= 3) { - - struct Sci_TextRange tr; - tr.chrg.cpMin = iStartPos; tr.chrg.cpMax = iCurPos; tr.lpstrText = tchBuf; - - SendMessage(g_hwndEdit,SCI_GETTEXTRANGE,0,(LPARAM)&tr); - - if (tchBuf[iSize - 2] != '/') { - - const char* pBegin = &tchBuf[0]; - const char* pCur = &tchBuf[iSize - 2]; - - while (pCur > pBegin && *pCur != '<' && *pCur != '>') - --pCur; - - int cchIns = 2; - char tchIns[516] = "'; - tchIns[cchIns] = 0; - - if (cchIns > 3 && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"
",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1) && - StringCchCompareINA(tchIns,COUNTOF(tchIns),"",-1)) + if (iCurLine > 0/* && iLineLength <= 2*/) + { + const int iPrevLineLength = SciCall_LineLength(iCurLine - 1); + char* pLineBuf = NULL; + if (iPrevLineLength < FNDRPL_BUFFER) { + pLineBuf = chLineBuffer; + } + else { + pLineBuf = GlobalAlloc(GPTR, iPrevLineLength + 1); + } + if (pLineBuf) { - int token = BeginSelUndoAction(); - SendMessage(g_hwndEdit,SCI_REPLACESEL,0,(LPARAM)tchIns); - SendMessage(g_hwndEdit,SCI_SETSEL,iCurPos,iCurPos); - EndSelUndoAction(token); + SendMessage(g_hwndEdit, SCI_GETLINE, iCurLine - 1, (LPARAM)pLineBuf); + *(pLineBuf + iPrevLineLength) = '\0'; + for (char* pPos = pLineBuf; *pPos; pPos++) { + if (*pPos != ' ' && *pPos != '\t') + *pPos = '\0'; + } + if (*pLineBuf) { + SendMessage(g_hwndEdit, SCI_BEGINUNDOACTION, 0, 0); + SendMessage(g_hwndEdit, SCI_ADDTEXT, lstrlenA(pLineBuf), (LPARAM)pLineBuf); + SendMessage(g_hwndEdit, SCI_ENDUNDOACTION, 0, 0); + } + if (iPrevLineLength >= FNDRPL_BUFFER) { GlobalFree(pLineBuf); } } } } } - } - else if (bAutoCompleteWords && !SendMessage(g_hwndEdit, SCI_AUTOCACTIVE, 0, 0)) { - EditCompleteWord(g_hwndEdit, FALSE); + // Auto close tags + else if (bAutoCloseTags && scn->ch == '>') + { + //int iLexer = (int)SendMessage(g_hwndEdit,SCI_GETLEXER,0,0); + //if (iLexer == SCLEX_HTML || iLexer == SCLEX_XML) + { + char tchBuf[512] = { '\0' }; + int iCurPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); + int iHelper = iCurPos - (COUNTOF(tchBuf) - 1); + int iStartPos = max(0, iHelper); + int iSize = iCurPos - iStartPos; + + if (iSize >= 3) { + + struct Sci_TextRange tr; + tr.chrg.cpMin = iStartPos; tr.chrg.cpMax = iCurPos; tr.lpstrText = tchBuf; + + SendMessage(g_hwndEdit, SCI_GETTEXTRANGE, 0, (LPARAM)&tr); + + if (tchBuf[iSize - 2] != '/') { + + const char* pBegin = &tchBuf[0]; + const char* pCur = &tchBuf[iSize - 2]; + + while (pCur > pBegin && *pCur != '<' && *pCur != '>') + --pCur; + + int cchIns = 2; + char tchIns[516] = "'; + tchIns[cchIns] = 0; + + if (cchIns > 3 && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "
", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && + StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1)) + { + int token = BeginSelUndoAction(); + SendMessage(g_hwndEdit, SCI_REPLACESEL, 0, (LPARAM)tchIns); + SendMessage(g_hwndEdit, SCI_SETSEL, iCurPos, iCurPos); + EndSelUndoAction(token); + } + } + } + } + } + else if (bAutoCompleteWords && !SendMessage(g_hwndEdit, SCI_AUTOCACTIVE, 0, 0)) { + EditCompleteWord(g_hwndEdit, FALSE); + } } break; @@ -5787,10 +5792,6 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCN_SAVEPOINTREACHED: bModified = FALSE; UpdateToolbar(); - // just in really rare case of possible deadlock - // (flag set, but no timer event in msg queue to reset) - TEST_AND_RESET(TIMER_BIT_MARK_OCC); - TEST_AND_RESET(TIMER_BIT_UPDATE_HYPER); break; @@ -5810,22 +5811,24 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) bModified = TRUE; UpdateToolbar(); break; + + default: + return FALSE; } - break; + return TRUE; case IDC_TOOLBAR: switch(pnmh->code) { - case TBN_ENDADJUST: UpdateToolbar(); break; case TBN_QUERYDELETE: case TBN_QUERYINSERT: - return TRUE; + break; case TBN_GETBUTTONINFO: { @@ -5848,9 +5851,12 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) SendMessage(hwndToolbar,TB_ADDBUTTONS,NUMINITIALTOOLS,(LPARAM)tbbMainWnd); return(0); } + break; + default: + return FALSE; } - break; + return TRUE; case IDC_STATUSBAR: @@ -5913,7 +5919,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) break; } - break; + return TRUE; default: @@ -5938,7 +5944,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) UNUSED(wParam); - return(0); + return FALSE; } @@ -7139,9 +7145,8 @@ void UpdateEditWndUI() // void MarkAllOccurrences() { - if (!TEST_AND_SET(TIMER_BIT_MARK_OCC)) { - SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); - } + SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL); + TEST_AND_SET(TIMER_BIT_MARK_OCC); } //============================================================================= @@ -7150,9 +7155,9 @@ void MarkAllOccurrences() // void UpdateVisibleUrlHotspot() { - if (!TEST_AND_SET(TIMER_BIT_UPDATE_HYPER)) { - SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 250, NULL); - } + SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 100, NULL); + TEST_AND_SET(TIMER_BIT_UPDATE_HYPER); + } diff --git a/src/SciCall.h b/src/SciCall.h index 6b6e8a41d..5e45a0546 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -101,6 +101,7 @@ DeclareSciCallR1(PositionAfter, POSITIONAFTER, int, Sci_Position, position); DeclareSciCallR0(GetLineCount, GETLINECOUNT, int); DeclareSciCallR0(GetTextLength, GETTEXTLENGTH, int); +DeclareSciCallR1(LineLength, LINELENGTH, int, Sci_Position, line); DeclareSciCallR1(LineFromPosition, LINEFROMPOSITION, int, Sci_Position, position); DeclareSciCallR1(PositionFromLine, POSITIONFROMLINE, int, Sci_Position, line); DeclareSciCallR1(GetLineEndPosition, GETLINEENDPOSITION, int, Sci_Position, line);