+ first draft of "Alt-Key-Down Virtual Space Access" rectangular selection only

(redo/undo action does not work properly yet?)
This commit is contained in:
Rainer Kottenhoff 2017-10-20 14:40:13 +02:00
parent cdecfb5756
commit 8bfa35c4ab
5 changed files with 46 additions and 60 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

Binary file not shown.

View File

@ -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