- fixing issue #92: Undo/Redo of virtual space selection rectangle not correct

This commit is contained in:
Rainer Kottenhoff 2017-09-25 16:08:52 +02:00
parent 8cceac6cda
commit c3949edf22
2 changed files with 27 additions and 9 deletions

View File

@ -7182,7 +7182,7 @@ void InvalidateSelections()
int BeginSelUndoAction()
{
int token = -1;
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0 };
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 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) {
@ -7190,8 +7190,12 @@ int BeginSelUndoAction()
sel.currPos_undo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0);
}
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);
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);
}
}
else
{
@ -7216,7 +7220,7 @@ int BeginSelUndoAction()
void EndSelUndoAction(int token)
{
if (token >= 0) {
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0 };
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 };
if (UndoRedoSelectionMap(token,&sel) >= 0) {
// mode and type should not have changed
if (sel.selMode == SC_SEL_LINES) {
@ -7224,8 +7228,12 @@ void EndSelUndoAction(int token)
sel.currPos_redo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0);
}
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);
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);
}
}
else {
sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
@ -7245,7 +7253,7 @@ void EndSelUndoAction(int token)
//
void RestoreSelectionAction(int token, DoAction doAct)
{
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0 };
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 };
if (UndoRedoSelectionMap(token,&sel) >= 0) {
// we are inside undo/redo transaction, so do delayed PostMessage() instead of SendMessage()
int anchorPos = (doAct == UNDO ? sel.anchorPos_undo : sel.anchorPos_redo);
@ -7258,8 +7266,14 @@ void RestoreSelectionAction(int token, DoAction doAct)
PostMessage(hwndEdit,SCI_SETSELECTIONEND,(WPARAM)currPos,0);
}
else if (sel.selMode == SC_SEL_RECTANGLE) {
PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONANCHOR,(WPARAM)anchorPos,0);
PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONCARET,(WPARAM)currPos,0);
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);
}
}
else {
PostMessage(hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos);

View File

@ -49,6 +49,10 @@ typedef struct _undoSel
int anchorPos_redo;
int currPos_redo;
int rectSelVS;
int anchorVS_undo;
int currVS_undo;
int anchorVS_redo;
int currVS_redo;
}
UndoRedoSelection_t;