From c72e17ab2d9c10d2a139fcd1e506aa8fb48e96cf Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 30 May 2019 09:54:28 +0200 Subject: [PATCH] + enh: some multi-selection enhancements --- Versions/build.txt | 2 +- res/Notepad3.exe.manifest.conf | 2 +- src/Edit.c | 53 ++++++++++++++----- src/Edit.h | 1 + src/Helpers.c | 2 +- src/Notepad3.c | 97 ++++++++++++++++++++++------------ src/Notepad3.rc | 6 +-- src/SciCall.h | 1 + src/VersionEx.h | 4 +- 9 files changed, 114 insertions(+), 54 deletions(-) diff --git a/Versions/build.txt b/Versions/build.txt index 0e4a28666..c50ceaf74 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -2235 +2236 diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index a5db745f9..c6f99e1d3 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 ONIGURUMA diff --git a/src/Edit.c b/src/Edit.c index e271525df..5c71d68e0 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -6177,7 +6177,7 @@ void EditMarkAllOccurrences(HWND hwnd, bool bForceClear) void EditSelectionMultiSelectAll() { DocPos const iSelSize = SciCall_GetSelText(NULL); - if (iSelSize > 1) + if ((iSelSize > 1)) { char* pszText = AllocMem(iSelSize, HEAP_ZERO_MEMORY); if (NULL == pszText) { @@ -6531,6 +6531,28 @@ void EditToggleView(HWND hwnd) } +//============================================================================= +// +// EditSelectWordAtPos() +// +void EditSelectWordAtPos(const DocPos iPos, const bool bForceWord) +{ + DocPos iWordStart = SciCall_WordStartPosition(iPos, true); + DocPos iWordEnd = SciCall_WordEndPosition(iPos, true); + + if ((iWordStart == iWordEnd) && bForceWord) // we are in whitespace salad... + { + iWordStart = SciCall_WordEndPosition(iPos, false); + iWordEnd = SciCall_WordEndPosition(iWordStart, true); + if (iWordStart != iWordEnd) { + SciCall_SetSelection(iWordEnd, iWordStart); + } + } + else { + SciCall_SetSelection(iWordEnd, iWordStart); + } +} + //============================================================================= // @@ -6563,19 +6585,26 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, DocPos rangeStart, DocPos { if (SciCall_IsSelectionEmpty()) { // nothing selected, get word under caret if flagged - if (Settings.MarkOccurrencesCurrentWord && (flags & SCFIND_WHOLEWORD)) { - DocPos const iCurrPos = SciCall_GetCurrentPos(); - DocPos const iWordStart = SciCall_WordStartPosition(iCurrPos, true); - DocPos const iWordEnd = SciCall_WordEndPosition(iCurrPos, true); - iFindLength = (iWordEnd - iWordStart); - StringCchCopyNA(txtBuffer, COUNTOF(txtBuffer), SciCall_GetRangePointer(iWordStart, iFindLength), iFindLength); + if (Settings.MarkOccurrencesCurrentWord && (flags & SCFIND_WHOLEWORD)) + { + DocPos const iCurPos = SciCall_GetCurrentPos(); + EditSelectWordAtPos(iCurPos, false); + size_t const len = SciCall_GetSelText(NULL); + if ((len > 1) && (len < COUNTOF(txtBuffer))) { + SciCall_GetSelText(txtBuffer); + SciCall_SetSelection(iCurPos, iCurPos); + iFindLength = len - 1; + } + else { + return; // selected word empty or too big + } } else { return; // no pattern, no selection and no word mark chosen } } - else { // we have a selection - + else // we have a selection + { // get current selection DocPos const iSelStart = SciCall_GetSelectionStart(); DocPos const iSelEnd = SciCall_GetSelectionEnd(); @@ -6585,7 +6614,7 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, DocPos rangeStart, DocPos if ((SciCall_LineFromPosition(iSelStart) != SciCall_LineFromPosition(iSelEnd)) || (iSelCount >= COUNTOF(txtBuffer))) { return; } - + iFindLength = SciCall_GetSelText(pszText) - 1; // exit if selection is not a word and Match whole words only is enabled @@ -6619,9 +6648,9 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, DocPos rangeStart, DocPos iPos = _FindInTarget(hwnd, pszText, iFindLength, flags, &start, &end, (start == iPos), FRMOD_IGNORE); - if (iPos < 0) + if (iPos < 0) { break; // not found - + } // mark this match if not done before SciCall_SetIndicatorCurrent(INDIC_NP3_MARK_OCCURANCE); SciCall_IndicatorFillRange(iPos, (end - start)); diff --git a/src/Edit.h b/src/Edit.h index a502ac266..ad9e42ecf 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -103,6 +103,7 @@ void EditPrintInit(); void EditMatchBrace(HWND hwnd); void EditClearAllOccurrenceMarkers(HWND hwnd); void EditToggleView(HWND hwnd); +void EditSelectWordAtPos(const DocPos iPos, const bool bForceWord); int EditAddSearchFlags(int flags, bool bRegEx, bool bWordStart, bool bMatchCase, bool bMatchWords, bool bDotMatchAll); void EditMarkAll(HWND hwnd, char* pszFind, int flags, DocPos rangeStart, DocPos rangeEnd); void EditFinalizeStyling(HWND hwnd, DocPos iEndPos); diff --git a/src/Helpers.c b/src/Helpers.c index 8c018f459..b604aacc6 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -1496,7 +1496,7 @@ int MRU_Compare(LPMRULIST pmru,LPCWSTR psz1,LPCWSTR psz2) return(StringCchCompareX(psz1,psz2)); } -bool MRU_Add(LPMRULIST pmru,LPCWSTR pszNew, cpi_enc_t iEnc, DocPos iPos, LPCWSTR pszBookMarks) +bool MRU_Add(LPMRULIST pmru, LPCWSTR pszNew, cpi_enc_t iEnc, DocPos iPos, LPCWSTR pszBookMarks) { int i; for (i = 0; i < pmru->iSize; i++) { diff --git a/src/Notepad3.c b/src/Notepad3.c index ae3ac0e0a..c623caf93 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -3882,24 +3882,9 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) case IDM_EDIT_SELECTWORD: { - DocPos const iPos = SciCall_GetCurrentPos(); - if (SciCall_IsSelectionEmpty()) { - DocPos iWordStart = SciCall_WordStartPosition(iPos, true); - DocPos iWordEnd = SciCall_WordEndPosition(iPos, true); - - if (iWordStart == iWordEnd) // we are in whitespace salad... - { - iWordStart = SciCall_WordEndPosition(iPos, false); - iWordEnd = SciCall_WordEndPosition(iWordStart, true); - if (iWordStart != iWordEnd) { - SciCall_SetSelection(iWordEnd, iWordStart); - } - } - else { - SciCall_SetSelection(iWordEnd, iWordStart); - } + EditSelectWordAtPos(SciCall_GetCurrentPos(), false); if (!SciCall_IsSelectionEmpty()) { SciCall_ChooseCaretX(); @@ -3923,8 +3908,15 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) case IDM_EDIT_SELECTALLMATCHES: { - EditSelectionMultiSelectAll(); - UpdateStatusbar(false); + if (!Sci_IsMultiOrRectangleSelection()) { + if (SciCall_IsSelectionEmpty()) { + if (!IsMarkOccurrencesEnabled() || Settings.MarkOccurrencesCurrentWord) { + EditSelectWordAtPos(SciCall_GetCurrentPos(), false); + } + } + EditSelectionMultiSelectAll(); + UpdateStatusbar(false); + } } break; @@ -4819,6 +4811,35 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) if (SciCall_GetTextLength() == 0) { break; } + if (Sci_IsMultiSelection()) { + switch (iLoWParam) { + case IDM_EDIT_SELTONEXT: + { + SciCall_RotateSelection(); + DocPosU const iMain = SciCall_GetMainSelection(); + SciCall_ScrollRange(SciCall_GetSelectionNAnchor(iMain), SciCall_GetSelectionNCaret(iMain)); + } + break; + + case IDM_EDIT_SELTOPREV: + { + DocPosU const iMain = SciCall_GetMainSelection(); + if (iMain > 0) { + SciCall_SetMainSelection(iMain - 1); + SciCall_ScrollRange(SciCall_GetSelectionNAnchor(iMain - 1), SciCall_GetSelectionNCaret(iMain - 1)); + } else { + DocPosU const iNewMain = SciCall_GetSelections() - 1; + SciCall_SetMainSelection(iNewMain); + SciCall_ScrollRange(SciCall_GetSelectionNAnchor(iNewMain), SciCall_GetSelectionNCaret(iNewMain)); + } + } + break; + + default: break; + } + break; // done + } + if (IsFindPatternEmpty() && !StringCchLenA(Settings.EFR_Data.szFind, COUNTOF(Settings.EFR_Data.szFind))) { if (iLoWParam != IDM_EDIT_REPLACENEXT) { @@ -4877,34 +4898,39 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) case CMD_FINDPREVSEL: case IDM_EDIT_SAVEFIND: { - DocPos cchSelection = SciCall_GetSelText(NULL); - - if (1 >= cchSelection) - { - SendWMCommand(hwnd, IDM_EDIT_SELECTWORD); - cchSelection = SciCall_GetSelText(NULL); + if (SciCall_IsSelectionEmpty()) { + EditSelectWordAtPos(SciCall_GetCurrentPos(), true); } - if ((1 < cchSelection) && (cchSelection < FNDRPL_BUFFER)) + size_t const cchSelection = SciCall_GetSelText(NULL); + + if (1 < cchSelection) { - char mszSelection[FNDRPL_BUFFER]; - SciCall_GetSelText(mszSelection); + char* szSelection = AllocMem(cchSelection, HEAP_ZERO_MEMORY); + if (NULL == szSelection) { + break; + } + SciCall_GetSelText(szSelection); // Check lpszSelection and truncate newlines - char *lpsz = StrChrA(mszSelection, '\n'); + char *lpsz = StrChrA(szSelection, '\n'); if (lpsz) *lpsz = '\0'; - lpsz = StrChrA(mszSelection, '\r'); + lpsz = StrChrA(szSelection, '\r'); if (lpsz) *lpsz = '\0'; - StringCchCopyA(Settings.EFR_Data.szFind, COUNTOF(Settings.EFR_Data.szFind), mszSelection); + StringCchCopyA(Settings.EFR_Data.szFind, COUNTOF(Settings.EFR_Data.szFind), szSelection); Settings.EFR_Data.fuFlags &= (~(SCFIND_REGEXP | SCFIND_POSIX)); Settings.EFR_Data.bTransformBS = false; - WCHAR wszBuf[FNDRPL_BUFFER]; - MultiByteToWideChar(Encoding_SciCP, 0, mszSelection, -1, wszBuf, FNDRPL_BUFFER); - MRU_Add(Globals.pMRUfind, wszBuf, 0, 0, NULL); - SetFindPattern(wszBuf); + LPWSTR pszTextW = AllocMem(cchSelection * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pszTextW == NULL) { + FreeMem(szSelection); + break; + } + MultiByteToWideChar(Encoding_SciCP, 0, szSelection, -1, pszTextW, (MBWC_DocPos_Cast)cchSelection); + MRU_Add(Globals.pMRUfind, pszTextW, 0, 0, NULL); + SetFindPattern(pszTextW); switch (iLoWParam) { @@ -4925,6 +4951,9 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) EditFindPrev(Globals.hwndEdit, &Settings.EFR_Data, false, false); break; } + + FreeMem(szSelection); + FreeMem(pszTextW); } } break; diff --git a/src/Notepad3.rc b/src/Notepad3.rc index abc95f918..8355e1658 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -223,7 +223,7 @@ BEGIN VK_F12, IDM_VIEW_SCHEMECONFIG, VIRTKEY, CONTROL, NOINVERT VK_F12, IDM_VIEW_FONT, VIRTKEY, ALT, NOINVERT VK_F12, IDM_VIEW_USE2NDDEFAULT, VIRTKEY, SHIFT, NOINVERT - VK_F12, IDM_VIEW_CURRENTSCHEME, VIRTKEY, CONTROL, ALT + VK_F12, IDM_VIEW_CURRENTSCHEME, VIRTKEY, CONTROL, ALT, NOINVERT VK_F2, IDM_EDIT_SELTONEXT, VIRTKEY, CONTROL, ALT, NOINVERT VK_F2, IDM_EDIT_SELTOPREV, VIRTKEY, SHIFT, CONTROL, ALT, NOINVERT VK_F2, BME_EDIT_BOOKMARKNEXT, VIRTKEY, NOINVERT @@ -292,8 +292,8 @@ BEGIN "H", IDACC_REPLACE, VIRTKEY, CONTROL, NOINVERT "S", IDACC_SAVEPOS, VIRTKEY, CONTROL, NOINVERT "R", IDACC_RESETPOS, VIRTKEY, CONTROL, NOINVERT - VK_F2, IDACC_SELTONEXT, VIRTKEY, CONTROL, ALT, NOINVERT - VK_F2, IDACC_SELTOPREV, VIRTKEY, SHIFT, CONTROL, ALT, NOINVERT + //VK_F2, IDACC_SELTONEXT, VIRTKEY, CONTROL, ALT, NOINVERT + //VK_F2, IDACC_SELTOPREV, VIRTKEY, SHIFT, CONTROL, ALT, NOINVERT VK_F3, IDACC_FINDNEXT, VIRTKEY, NOINVERT VK_F3, IDACC_SAVEFIND, VIRTKEY, ALT, NOINVERT VK_F3, IDACC_FINDPREV, VIRTKEY, SHIFT, NOINVERT diff --git a/src/SciCall.h b/src/SciCall.h index 4e3d3acd6..02b8eeb69 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -197,6 +197,7 @@ DeclareSciCallR1(GetSelectionNStart, GETSELECTIONNSTART, DocPos, DocPosU, selnum DeclareSciCallR1(GetSelectionNEnd, GETSELECTIONNEND, DocPos, DocPosU, selnum) DeclareSciCallV0(SwapMainAnchorCaret, SWAPMAINANCHORCARET) DeclareSciCallV0(MultipleSelectAddEach, MULTIPLESELECTADDEACH) +DeclareSciCallV0(RotateSelection, ROTATESELECTION) // Zoom DeclareSciCallR0(GetZoom, GETZOOM, int) diff --git a/src/VersionEx.h b/src/VersionEx.h index 49f0fa74f..53a5d52f6 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -7,8 +7,8 @@ #define SAPPNAME "Notepad3" #define VERSION_MAJOR 5 #define VERSION_MINOR 19 -#define VERSION_REV 529 -#define VERSION_BUILD 2235 +#define VERSION_REV 530 +#define VERSION_BUILD 2236 #define SCINTILLA_VER 415+ #define ONIGURUMA_REGEX_VER 6.9.2 #define VERSION_PATCH ONIGURUMA