From 352bca00db74cbe6304ccf708daf1364bfaf6d35 Mon Sep 17 00:00:00 2001 From: RaiKoHoff Date: Wed, 12 Feb 2020 18:49:05 +0100 Subject: [PATCH] + add: multiple selection on end-of-lines from rectangular selection --- Versions/build.txt | 2 +- res/Notepad3.exe.manifest.conf | 2 +- src/Edit.c | 34 +++++++++++++------ src/Edit.h | 4 +-- src/Notepad3.c | 60 ++++++++++++++++++---------------- src/SciCall.h | 6 ++++ src/TypeDefs.h | 3 ++ src/VersionEx.h | 2 +- 8 files changed, 70 insertions(+), 43 deletions(-) diff --git a/Versions/build.txt b/Versions/build.txt index 0cfbf0888..00750edc0 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -2 +3 diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index 0a1fd2a89..b562aa944 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 RC1 diff --git a/src/Edit.c b/src/Edit.c index abd2158b2..95f8b10e2 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -2415,28 +2415,40 @@ void EditMoveDown(HWND hwnd) // // EditSetCaretToSelectionStart() // -DocPos EditSetCaretToSelectionStart() +bool EditSetCaretToSelectionStart() { - if (!Sci_IsMultiSelection()) { - if (SciCall_GetCurrentPos() != SciCall_GetSelectionStart()) { + size_t const m = SciCall_GetMainSelection(); + DocPos const c = SciCall_GetSelectionNCaret(m) + SciCall_GetSelectionNCaretVirtualSpace(m); + DocPos const s = SciCall_GetSelectionNStart(m) + SciCall_GetSelectionNStartVirtualSpace(m); + bool const bSwap = (c != s); + if (bSwap) { + size_t const n = SciCall_GetSelections(); + for (size_t i = 0; i < n; ++i) { SciCall_SwapMainAnchorCaret(); + SciCall_RotateSelection(); } } - return SciCall_GetSelectionStart(); + return bSwap; } //============================================================================= // // EditSetCaretToSelectionEnd() // -DocPos EditSetCaretToSelectionEnd() +bool EditSetCaretToSelectionEnd() { - if (!Sci_IsMultiSelection()) { - if (SciCall_GetCurrentPos() != SciCall_GetSelectionEnd()) { + size_t const m = SciCall_GetMainSelection(); + DocPos const c = SciCall_GetSelectionNCaret(m) + SciCall_GetSelectionNCaretVirtualSpace(m); + DocPos const e = SciCall_GetSelectionNEnd(m) + SciCall_GetSelectionNEndVirtualSpace(m); + bool const bSwap = (c != e); + if (bSwap) { + size_t const n = SciCall_GetSelections(); + for (size_t i = 0; i < n; ++i) { SciCall_SwapMainAnchorCaret(); + SciCall_RotateSelection(); } } - return SciCall_GetSelectionEnd(); + return bSwap; } @@ -6344,7 +6356,8 @@ bool EditFindNext(HWND hwnd, LPCEDITFINDREPLACE lpefr, bool bExtendSelection, bo SetFocus(hwnd); } DocPos const iDocEndPos = Sci_GetDocEndPosition(); - DocPos start = EditSetCaretToSelectionEnd(); + EditSetCaretToSelectionEnd(); + DocPos start = SciCall_GetSelectionEnd(); DocPos end = iDocEndPos; if (start >= end) { @@ -6426,7 +6439,8 @@ bool EditFindPrev(HWND hwnd, LPCEDITFINDREPLACE lpefr, bool bExtendSelection, bo int const sFlags = (int)(lpefr->fuFlags); DocPos const iDocEndPos = Sci_GetDocEndPosition(); - DocPos start = EditSetCaretToSelectionStart(); + EditSetCaretToSelectionStart(); + DocPos start = SciCall_GetSelectionStart(); DocPos end = 0; if (start <= end) { diff --git a/src/Edit.h b/src/Edit.h index a880d53e5..82426a567 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -59,8 +59,8 @@ void EditSpacesToTabs(HWND hwnd,int nTabWidth,bool); void EditMoveUp(HWND hwnd); void EditMoveDown(HWND hwnd); -DocPos EditSetCaretToSelectionStart(); -DocPos EditSetCaretToSelectionEnd(); +bool EditSetCaretToSelectionStart(); +bool EditSetCaretToSelectionEnd(); void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend); void EditIndentBlock(HWND hwnd,int cmd, bool bFormatIndentation, bool bForceAll); void EditAlignText(HWND hwnd,int nMode); diff --git a/src/Notepad3.c b/src/Notepad3.c index 7ca2ec01f..9b3f94fd6 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -400,9 +400,6 @@ static void _SplitUndoTransaction(const int iModType); static void _DelayClearZoomCallTip(int delay); static void _DelaySplitUndoTransaction(int delay, int iModType); -//#define NP3_VIRTUAL_SPACE_ACCESS_OPTIONS (SCVS_RECTANGULARSELECTION | SCVS_NOWRAPLINESTART | SCVS_USERACCESSIBLE) -#define NP3_VIRTUAL_SPACE_ACCESS_OPTIONS (SCVS_RECTANGULARSELECTION) - //============================================================================= // // IgnoreNotifyChangeEvent(), ObserveNotifyChangeEvent(), CheckNotifyChangeEvent() @@ -1364,16 +1361,16 @@ HWND InitInstance(HINSTANCE hInstance,LPCWSTR pszCmdLine,int nCmdShow) // Check for /c [if no file is specified] -- even if a file is specified /*else */if (s_flagNewFromClipboard) { - if (SendMessage(Globals.hwndEdit, SCI_CANPASTE, 0, 0)) { + if (SciCall_CanPaste()) { bool bAutoIndent2 = Settings.AutoIndent; Settings.AutoIndent = 0; EditJumpTo(Globals.hwndEdit, -1, 0); _BEGIN_UNDO_ACTION_ - if (SendMessage(Globals.hwndEdit, SCI_GETLENGTH, 0, 0) > 0) { - SendMessage(Globals.hwndEdit, SCI_NEWLINE, 0, 0); + if (!Sci_IsDocEmpty()) { + SciCall_NewLine(); } - SendMessage(Globals.hwndEdit, SCI_PASTE, 0, 0); - SendMessage(Globals.hwndEdit, SCI_NEWLINE, 0, 0); + SciCall_Paste(); + SciCall_NewLine(); _END_UNDO_ACTION_ Settings.AutoIndent = bAutoIndent2; if (s_flagJumpTo) @@ -1799,8 +1796,7 @@ static void _InitializeSciEditCtrl(HWND hwndEditCtrl) SendMessage(hwndEditCtrl, SCI_AUTOCSETMULTI, SC_MULTIAUTOC_EACH, 0); // paste into rectangular selection SendMessage(hwndEditCtrl, SCI_SETMOUSESELECTIONRECTANGULARSWITCH, true, 0); - int const vspaceOpt = Settings2.DenyVirtualSpaceAccess ? SCVS_NONE : NP3_VIRTUAL_SPACE_ACCESS_OPTIONS; - SendMessage(hwndEditCtrl, SCI_SETVIRTUALSPACEOPTIONS, vspaceOpt, 0); + SendMessage(hwndEditCtrl, SCI_SETVIRTUALSPACEOPTIONS, NP3_VIRTUAL_SPACE_ACCESS_OPTIONS, 0); SendMessage(hwndEditCtrl, SCI_SETADDITIONALCARETSBLINK, true, 0); SendMessage(hwndEditCtrl, SCI_SETADDITIONALCARETSVISIBLE, true, 0); @@ -1902,7 +1898,6 @@ static void _InitializeSciEditCtrl(HWND hwndEditCtrl) else { SendMessage(hwndEditCtrl, SCI_SETYCARETPOLICY, (WPARAM)(_CARET_SYMETRY), 0); } - SendMessage(hwndEditCtrl, SCI_SETVIRTUALSPACEOPTIONS, (WPARAM)(Settings2.DenyVirtualSpaceAccess ? SCVS_NONE : NP3_VIRTUAL_SPACE_ACCESS_OPTIONS), 0); SendMessage(hwndEditCtrl, SCI_SETENDATLASTLINE, (WPARAM)((Settings.ScrollPastEOF) ? 0 : 1), 0); // Tabs @@ -2524,7 +2519,7 @@ LRESULT MsgDPIChanged(HWND hwnd, WPARAM wParam, LPARAM lParam) #if 0 char buf[128]; sprintf(buf, "WM_DPICHANGED: dpi=%u,%u ppi=%u,%u\n", Globals.CurrentDPI.x, Globals.CurrentDPI.y, Globals.CurrentPPI.x, Globals.CurrentPPI.y); - SendMessage(Globals.hwndEdit, SCI_INSERTTEXT, 0, (LPARAM)buf); + SciCall_InsertText(0, buf); #endif Style_ResetCurrentLexer(Globals.hwndEdit); @@ -4140,7 +4135,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) case IDM_EDIT_SELECTALL: - SendMessage(Globals.hwndEdit,SCI_SELECTALL,0,0); + SciCall_SelectAll(); UpdateToolbar(); UpdateStatusbar(false); break; @@ -4284,7 +4279,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) // break; case CMD_VK_INSERT: - SendMessage(Globals.hwndEdit, SCI_EDITTOGGLEOVERTYPE, 0, 0); + SciCall_EditToggleOverType(); UpdateStatusbar(false); break; @@ -6019,10 +6014,12 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) WideCharToMultiByteEx(Encoding_SciCP, 0, wchFind, -1, efrTS.szFind,COUNTOF(efrTS.szFind),NULL,NULL); WideCharToMultiByteEx(Encoding_SciCP, 0, wchReplace, -1, efrTS.szReplace, COUNTOF(efrTS.szReplace), NULL, NULL); - if (!SendMessage(Globals.hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) + if (!SciCall_IsSelectionEmpty()) { EditReplaceAllInSelection(Globals.hwndEdit, &efrTS, true); - else - EditReplaceAll(Globals.hwndEdit,&efrTS,true); + } + else { + EditReplaceAll(Globals.hwndEdit, &efrTS, true); + } } break; @@ -6179,7 +6176,17 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) break; case CMD_JUMP2SELEND: - EditSetCaretToSelectionEnd(); + if (!EditSetCaretToSelectionEnd() && Sci_IsMultiOrRectangleSelection()) { + size_t const n = SciCall_GetSelections(); + DocLn const lineStart = SciCall_LineFromPosition(SciCall_GetSelectionStart()); + SciCall_ClearSelections(); + DocPos const beg = SciCall_GetLineEndPosition(lineStart); + SciCall_SetSelection(beg, beg); + for (size_t i = 1; i < n; ++i) { + DocPos const pos = SciCall_GetLineEndPosition(lineStart + i); + SciCall_AddSelection(pos, pos); + } + } SciCall_ChooseCaretX(); break; @@ -7348,10 +7355,8 @@ static LRESULT _MsgNotifyFromEdit(HWND hwnd, const LPNMHDR pnmh, const SCNotific } break; - - case SCN_MARGINRIGHTCLICK: - break; - + //case SCN_MARGINRIGHTCLICK: + // break; // ~~~ Not used in Windows ~~~ // see: CMD_ALTUP / CMD_ALTDOWN @@ -10937,17 +10942,16 @@ void CALLBACK PasteBoardTimer(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { if ((s_dwLastCopyTime > 0) && ((GetTickCount() - s_dwLastCopyTime) > 200)) { - if (SendMessage(Globals.hwndEdit,SCI_CANPASTE,0,0)) { - + if (SciCall_CanPaste()) { bool bAutoIndent2 = Settings.AutoIndent; Settings.AutoIndent = 0; EditJumpTo(Globals.hwndEdit,-1,0); _BEGIN_UNDO_ACTION_ - if (SendMessage(Globals.hwndEdit, SCI_GETLENGTH, 0, 0) > 0) { - SendMessage(Globals.hwndEdit, SCI_NEWLINE, 0, 0); + if (!Sci_IsDocEmpty()) { + SciCall_NewLine(); } - SendMessage(Globals.hwndEdit,SCI_PASTE,0,0); - SendMessage(Globals.hwndEdit,SCI_NEWLINE,0,0); + SciCall_Paste(); + SciCall_NewLine(); _END_UNDO_ACTION_ EditEnsureSelectionVisible(); Settings.AutoIndent = bAutoIndent2; diff --git a/src/SciCall.h b/src/SciCall.h index c23d7cfc0..abb571467 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -181,6 +181,9 @@ DeclareSciCallV2(SetSelectionNCaretVirtualSpace, SETSELECTIONNCARETVIRTUALSPACE, DeclareSciCallV2(SetSelectionNAnchorVirtualSpace, SETSELECTIONNANCHORVIRTUALSPACE, DocPosU, selnum, DocPos, position) DeclareSciCallR1(GetSelectionNStart, GETSELECTIONNSTART, DocPos, DocPosU, selnum) DeclareSciCallR1(GetSelectionNEnd, GETSELECTIONNEND, DocPos, DocPosU, selnum) +DeclareSciCallR1(GetSelectionNStartVirtualSpace, GETSELECTIONNSTARTVIRTUALSPACE, DocPos, DocPosU, selnum) +DeclareSciCallR1(GetSelectionNEndVirtualSpace, GETSELECTIONNENDVIRTUALSPACE, DocPos, DocPosU, selnum) + DeclareSciCallV0(SwapMainAnchorCaret, SWAPMAINANCHORCARET) DeclareSciCallV0(MultipleSelectAddEach, MULTIPLESELECTADDEACH) DeclareSciCallV0(RotateSelection, ROTATESELECTION) @@ -212,6 +215,7 @@ DeclareSciCallV0(DelLineRight, DELLINERIGHT) DeclareSciCallV0(LineDelete, LINEDELETE) DeclareSciCallV1(LinesSplit, LINESSPLIT, int, pix) DeclareSciCallV0(LinesJoin, LINESJOIN) +DeclareSciCallV0(EditToggleOverType, EDITTOGGLEOVERTYPE) // Commands DeclareSciCallV0(LineDuplicate, LINEDUPLICATE) @@ -541,6 +545,8 @@ DeclareSciCallR0(IsIMEModeCJK, ISIMEMODECJK, bool) DeclareSciCallR0(IsSelectionEmpty, GETSELECTIONEMPTY, bool) DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, bool) +#define Sci_IsDocEmpty() (SciCall_GetTextLength() <= 0LL) + #define Sci_IsThinSelection() (SciCall_GetSelectionMode() == SC_SEL_THIN) #define Sci_IsMultiSelection() ((SciCall_GetSelections() > 1) && !SciCall_IsSelectionRectangle()) #define Sci_IsMultiOrRectangleSelection() ((SciCall_GetSelections() > 1) || SciCall_IsSelectionRectangle()) diff --git a/src/TypeDefs.h b/src/TypeDefs.h index a49ca1274..98c0db42e 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -655,6 +655,9 @@ typedef struct _themeFiles #define NOTEPAD3_MODULE_DIR_ENV_VAR L"NOTEPAD3MODULEDIR" +//#define NP3_VIRTUAL_SPACE_ACCESS_OPTIONS (Settings2.DenyVirtualSpaceAccess ? SCVS_NONE : (SCVS_RECTANGULARSELECTION | SCVS_NOWRAPLINESTART | SCVS_USERACCESSIBLE)) +#define NP3_VIRTUAL_SPACE_ACCESS_OPTIONS (Settings2.DenyVirtualSpaceAccess ? SCVS_NONE : (SCVS_RECTANGULARSELECTION | SCVS_NOWRAPLINESTART)) + // from #define INTERNET_MAX_PATH_LENGTH 2048 #define INTERNET_MAX_SCHEME_LENGTH 32 // longest protocol name length diff --git a/src/VersionEx.h b/src/VersionEx.h index 6c0b5280f..83c15146f 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -9,7 +9,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 20 #define VERSION_REV 212 -#define VERSION_BUILD 2 +#define VERSION_BUILD 3 #define SCINTILLA_VER 430 #define ONIGURUMA_REGEX_VER 6.9.4 #define UCHARDET_VER 2018.09.27