diff --git a/src/Edit.c b/src/Edit.c index 61756b984..30f764889 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -77,7 +77,6 @@ extern BOOL bLoadASCIIasUTF8; extern BOOL bLoadNFOasOEM; extern BOOL bAccelWordNavigation; -extern BOOL bVirtualSpaceInRectSelection; extern int iMarkOccurrences; extern int iMarkOccurrencesCount; @@ -158,12 +157,11 @@ HWND EditCreate(HWND hwndParent) SendMessage(hwnd,SCI_SETMOUSESELECTIONRECTANGULARSWITCH,TRUE,0); SendMessage(hwnd,SCI_SETMULTIPLESELECTION,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALSELECTIONTYPING,FALSE,0); - SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS, - (bVirtualSpaceInRectSelection ? (SCVS_RECTANGULARSELECTION | SCVS_USERACCESSIBLE | SCVS_NOWRAPLINESTART) : SCVS_NONE),0); SendMessage(hwnd,SCI_SETADDITIONALCARETSBLINK,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALCARETSVISIBLE,FALSE,0); SendMessage(hwnd,SCI_SETMOUSEWHEELCAPTURES,FALSE,0); - + SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS,SCVS_NONE,0); + SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_NEXT + (SCMOD_CTRL << 16)),SCI_PARADOWN); SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_PRIOR + (SCMOD_CTRL << 16)),SCI_PARAUP); SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_NEXT + ((SCMOD_CTRL | SCMOD_SHIFT) << 16)),SCI_PARADOWNEXTEND); diff --git a/src/Notepad3.c b/src/Notepad3.c index 413f0d4df..79b4c8e43 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -67,6 +67,8 @@ HWND hDlgFindReplace = NULL; #define NUMINITIALTOOLS 24 #define MARGIN_FOLD_INDEX 2 +#define SCVS_NP3_SPACE_OPT (SCVS_RECTANGULARSELECTION | SCVS_USERACCESSIBLE | SCVS_NOWRAPLINESTART) + TBBUTTON tbbMainWnd[] = { {0,IDT_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0}, {1,IDT_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0}, {2,IDT_FILE_BROWSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0}, @@ -155,7 +157,7 @@ BOOL bMarkOccurrencesMatchWords; BOOL bUseOldStyleBraceMatching; BOOL bAutoCompleteWords; BOOL bAccelWordNavigation; -BOOL bVirtualSpaceInRectSelection; +BOOL bOldStyleRectSelection; BOOL bShowCodeFolding; BOOL bViewWhiteSpace; BOOL bViewEOLs; @@ -307,6 +309,7 @@ WCHAR g_wchWorkingDirectory[MAX_PATH+2] = { L'\0' }; // undo / redo selections +static BOOL bInUndoRedoAction = FALSE; static UT_icd UndoRedoSelection_icd = { sizeof(UndoRedoSelection_t), NULL, NULL, NULL }; static UT_array* UndoRedoSelectionUTArray = NULL; @@ -1146,11 +1149,29 @@ WININFO GetMyWindowPlacement(HWND hwnd,MONITORINFO* hMonitorInfo) // LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) { + if (!bOldStyleRectSelection && !bInUndoRedoAction) + { + BOOL bIsVSpaceAccessActive = (SendMessage(hwndEdit, SCI_GETVIRTUALSPACEOPTIONS, 0, 0) != SCVS_NONE); + if (GetAsyncKeyState(VK_MENU) & SHRT_MIN) // ALT DOWN + { + if (!bIsVSpaceAccessActive) { + //SendMessage(hwndEdit,SCI_CLEARSELECTIONS,0,0); + SendMessage(hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, SCVS_NP3_SPACE_OPT, 0); + } + } + else { + if (bIsVSpaceAccessActive) { + SendMessage(hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, SCVS_NONE, 0); + } + } + } + switch(umsg) { // Quickly handle painting and sizing messages, found in ScintillaWin.cxx // Cool idea, don't know if this has any effect... ;-) case WM_MOVE: + case WM_MOUSEWHEEL: case WM_MOUSEACTIVATE: case WM_NCHITTEST: case WM_NCCALCSIZE: @@ -1166,7 +1187,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) case WM_CREATE: return MsgCreate(hwnd,wParam,lParam); - case WM_DESTROY: case WM_ENDSESSION: MsgEndSession(hwnd,umsg); @@ -1177,14 +1197,12 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) DestroyWindow(hwnd); break; - case WM_QUERYENDSESSION: if (FileSave(FALSE,TRUE,FALSE,FALSE)) return TRUE; else return FALSE; - // Reinitialize theme-dependent values and resize windows case WM_THEMECHANGED: MsgThemeChanged(hwnd,wParam,lParam); @@ -1199,16 +1217,13 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) return DefWindowProc(hwnd,umsg,wParam,lParam); } - //case WM_TIMER: // break; - case WM_SIZE: MsgSize(hwnd,wParam,lParam); break; - case WM_SETFOCUS: SetFocus(hwndEdit); @@ -1219,7 +1234,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) // PostMessage(hwnd,WM_CHANGENOTIFY,0,0); break; - case WM_DROPFILES: MsgDropFiles(hwnd, wParam, lParam); break; @@ -1235,13 +1249,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) MsgInitMenu(hwnd,wParam,lParam); break; - case WM_MOUSEWHEEL: - return DefWindowProc(hwnd,umsg,wParam,lParam); - case WM_NOTIFY: return MsgNotify(hwnd,wParam,lParam); - //case WM_PARENTNOTIFY: // if (LOWORD(wParam) & WM_DESTROY) { // if (IsWindow(hDlgFindReplace) && (hDlgFindReplace == (HWND)lParam)) { @@ -1250,7 +1260,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) // } // break; - case WM_COMMAND: return MsgCommand(hwnd,wParam,lParam); @@ -1261,13 +1270,11 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) MsgChangeNotify(hwnd, wParam, lParam); break; - //// This message is posted before Notepad3 reactivates itself //case WM_CHANGENOTIFYCLEAR: // bPendingChangeNotify = FALSE; // break; - case WM_DRAWCLIPBOARD: if (!bLastCopyFromMe) dwLastCopyTime = GetTickCount(); @@ -1278,7 +1285,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) SendMessage(hwndNextCBChain,WM_DRAWCLIPBOARD,wParam,lParam); break; - case WM_CHANGECBCHAIN: if ((HWND)wParam == hwndNextCBChain) hwndNextCBChain = (HWND)lParam; @@ -1286,11 +1292,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) SendMessage(hwndNextCBChain,WM_CHANGECBCHAIN,lParam,wParam); break; - case WM_TRAYMESSAGE: return MsgTrayMessage(hwnd, wParam, lParam); - default: if (umsg == msgTaskbarCreated) { if (!IsWindowVisible(hwnd)) @@ -1299,8 +1303,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) } return DefWindowProc(hwnd, umsg, wParam, lParam); } - - return 0; + return 0; // swallow message } @@ -2373,7 +2376,6 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam) EnableCmd(hmenu,IDM_EDIT_COMPLETEWORD,i); CheckCmd(hmenu,IDM_VIEW_AUTOCOMPLETEWORDS,bAutoCompleteWords); CheckCmd(hmenu,IDM_VIEW_ACCELWORDNAV,bAccelWordNavigation); - CheckCmd(hmenu,IDM_VIEW_VIRTSPACERECTSEL,bVirtualSpaceInRectSelection); switch (iMarkOccurrences) { @@ -4226,13 +4228,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) EditMarkAll(hwndEdit, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords); break; - case IDM_VIEW_VIRTSPACERECTSEL: - bVirtualSpaceInRectSelection = (bVirtualSpaceInRectSelection) ? FALSE : TRUE; // toggle - //SendMessage(hwndEdit,SCI_CLEARSELECTIONS,0,0); - SendMessage(hwndEdit,SCI_SETVIRTUALSPACEOPTIONS, - (bVirtualSpaceInRectSelection ? (SCVS_RECTANGULARSELECTION | SCVS_USERACCESSIBLE | SCVS_NOWRAPLINESTART) : SCVS_NONE),0); - break; - case IDM_VIEW_MARKOCCURRENCES_OFF: iMarkOccurrences = 0; // clear all marks @@ -5808,8 +5803,6 @@ void LoadSettings() bAccelWordNavigation = IniSectionGetBool(pIniSection, L"AccelWordNavigation", FALSE); - bVirtualSpaceInRectSelection = IniSectionGetBool(pIniSection,L"VirtualSpaceInRectSelection",FALSE); - bShowIndentGuides = IniSectionGetBool(pIniSection,L"ShowIndentGuides",FALSE); bTabsAsSpaces = IniSectionGetBool(pIniSection,L"TabsAsSpaces",TRUE); @@ -5985,6 +5978,7 @@ void LoadSettings() iMarkOccurrencesMaxCount = IniSectionGetInt(pIniSection,L"MarkOccurrencesMaxCount",2000); iMarkOccurrencesMaxCount = max(min(iMarkOccurrencesMaxCount,100000),2); + bOldStyleRectSelection = IniSectionGetBool(pIniSection, L"OldStyleRectSelection", FALSE); bUseOldStyleBraceMatching = IniSectionGetBool(pIniSection, L"UseOldStyleBraceMatching", FALSE); LoadIniSection(L"Toolbar Images",pIniSection,cchIniSection); @@ -6124,7 +6118,6 @@ void SaveSettings(BOOL bSaveSettingsNow) { IniSectionSetInt(pIniSection, L"AutoIndent", bAutoIndent); IniSectionSetInt(pIniSection, L"AutoCompleteWords", bAutoCompleteWords); IniSectionSetInt(pIniSection, L"AccelWordNavigation", bAccelWordNavigation); - IniSectionSetInt(pIniSection, L"VirtualSpaceInRectSelection",bVirtualSpaceInRectSelection); IniSectionSetInt(pIniSection, L"ShowIndentGuides", bShowIndentGuides); IniSectionSetInt(pIniSection, L"TabsAsSpaces", bTabsAsSpacesG); IniSectionSetInt(pIniSection, L"TabIndents", bTabIndentsG); @@ -7126,10 +7119,11 @@ void InvalidateSelections() // int BeginSelUndoAction() { + bInUndoRedoAction = TRUE; int token = -1; - UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; + UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0 }; + SendMessage(hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, SCVS_NP3_SPACE_OPT, 0); sel.selMode = (int)SendMessage(hwndEdit,SCI_GETSELECTIONMODE,0,0); - sel.rectSelVS = (int)SendMessage(hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0); if (sel.selMode == SC_SEL_LINES) { sel.anchorPos_undo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0); sel.currPos_undo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0); @@ -7137,10 +7131,8 @@ int BeginSelUndoAction() else if (sel.selMode == SC_SEL_RECTANGLE) { sel.anchorPos_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); sel.currPos_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); - if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { - sel.anchorVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); - sel.currVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); - } + sel.anchorVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); + sel.currVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); } else { @@ -7165,7 +7157,8 @@ int BeginSelUndoAction() void EndSelUndoAction(int token) { if (token >= 0) { - UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; + UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0 }; + SendMessage(hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, SCVS_NP3_SPACE_OPT, 0); if (UndoRedoSelectionMap(token,&sel) >= 0) { // mode and type should not have changed if (sel.selMode == SC_SEL_LINES) { @@ -7175,10 +7168,8 @@ void EndSelUndoAction(int token) else if (sel.selMode == SC_SEL_RECTANGLE) { sel.anchorPos_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); sel.currPos_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); - if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { - sel.anchorVS_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); - sel.currVS_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); - } + sel.anchorVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); + sel.currVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); } else { sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0); @@ -7187,6 +7178,7 @@ void EndSelUndoAction(int token) } UndoRedoSelectionMap(token,&sel); // set with redo action filled SendMessage(hwndEdit, SCI_ENDUNDOACTION, 0, 0); + bInUndoRedoAction = FALSE; } } @@ -7198,14 +7190,14 @@ void EndSelUndoAction(int token) // void RestoreSelectionAction(int token, DoAction doAct) { - UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; + bInUndoRedoAction = TRUE; + UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0 }; if (UndoRedoSelectionMap(token,&sel) >= 0) { + PostMessage(hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, SCVS_NP3_SPACE_OPT, 0); // we are inside undo/redo transaction, so do delayed PostMessage() instead of SendMessage() int anchorPos = (doAct == UNDO ? sel.anchorPos_undo : sel.anchorPos_redo); int currPos = (doAct == UNDO ? sel.currPos_undo : sel.currPos_redo); - int currRectType = (int)SendMessage(hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0); PostMessage(hwndEdit,SCI_SETSELECTIONMODE,(WPARAM)sel.selMode,0); - PostMessage(hwndEdit,SCI_SETVIRTUALSPACEOPTIONS,(WPARAM)sel.rectSelVS,0); if (sel.selMode == SC_SEL_LINES) { PostMessage(hwndEdit,SCI_SETSELECTIONSTART,(WPARAM)anchorPos,0); PostMessage(hwndEdit,SCI_SETSELECTIONEND,(WPARAM)currPos,0); @@ -7213,19 +7205,17 @@ void RestoreSelectionAction(int token, DoAction doAct) else if (sel.selMode == SC_SEL_RECTANGLE) { PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONANCHOR, (WPARAM)anchorPos, 0); PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONCARET, (WPARAM)currPos, 0); - if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { - int anchorVS = (doAct == UNDO ? sel.anchorVS_undo : sel.anchorVS_redo); - int currVS = (doAct == UNDO ? sel.currVS_undo : sel.currVS_redo); - PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0); - PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)currVS, 0); - } + int anchorVS = (doAct == UNDO ? sel.anchorVS_undo : sel.anchorVS_redo); + int currVS = (doAct == UNDO ? sel.currVS_undo : sel.currVS_redo); + PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0); + PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)currVS, 0); } else { PostMessage(hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos); } - PostMessage(hwndEdit,SCI_SETVIRTUALSPACEOPTIONS,(WPARAM)currRectType,0); - PostMessage(hwndEdit,SCI_CANCEL,0,0); + PostMessage(hwndEdit, SCI_CANCEL, 0, 0); } + bInUndoRedoAction = FALSE; } diff --git a/src/Notepad3.h b/src/Notepad3.h index 08929339d..130a95571 100644 --- a/src/Notepad3.h +++ b/src/Notepad3.h @@ -48,7 +48,6 @@ typedef struct _undoSel int currPos_undo; int anchorPos_redo; int currPos_redo; - int rectSelVS; int anchorVS_undo; int currVS_undo; int anchorVS_redo; diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 197c62e5c..1584eae48 100644 Binary files a/src/Notepad3.rc and b/src/Notepad3.rc differ diff --git a/src/resource.h b/src/resource.h index 26c243f63..b8f6cc227 100644 --- a/src/resource.h +++ b/src/resource.h @@ -382,8 +382,7 @@ #define IDM_VIEW_MARKOCCURRENCES_WORD 40452 #define IDM_VIEW_AUTOCOMPLETEWORDS 40453 #define IDM_VIEW_ACCELWORDNAV 40454 -#define IDM_VIEW_VIRTSPACERECTSEL 40455 -#define IDM_VIEW_NOPRESERVECARET 40456 +#define IDM_VIEW_NOPRESERVECARET 40455 #define IDM_HELP_ABOUT 40500 #define IDM_HELP_CMD 40501 #define IDM_TRAY_RESTORE 40600