+ fix: redo/undo and jump-to behavior having an active selection

This commit is contained in:
Rainer Kottenhoff 2018-01-24 17:54:32 +01:00
parent a06c14b299
commit 556c50bb1b
9 changed files with 119 additions and 98 deletions

Binary file not shown.

View File

@ -85,8 +85,6 @@ extern BOOL bLoadASCIIasUTF8;
extern BOOL bLoadNFOasOEM;
extern BOOL bAccelWordNavigation;
extern BOOL bDenyVirtualSpaceAccess;
extern BOOL bHyperlinkHotspot;
extern int iMarkOccurrences;
extern int iMarkOccurrencesCount;
@ -196,13 +194,13 @@ HWND EditCreate(HWND hwndParent)
SendMessage(hwnd,SCI_SETCARETSTICKY,SC_CARETSTICKY_OFF,0);
//SendMessage(hwnd,SCI_SETCARETSTICKY,SC_CARETSTICKY_WHITESPACE,0);
SendMessage(hwnd,SCI_SETXCARETPOLICY,CARET_SLOP|CARET_EVEN,50);
SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_EVEN,0);
SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_SLOP|CARET_EVEN,0);
SendMessage(hwnd,SCI_SETMOUSESELECTIONRECTANGULARSWITCH,TRUE,0);
SendMessage(hwnd,SCI_SETMULTIPLESELECTION,FALSE,0);
SendMessage(hwnd,SCI_SETADDITIONALSELECTIONTYPING,FALSE,0);
SendMessage(hwnd,SCI_SETADDITIONALCARETSBLINK,FALSE,0);
SendMessage(hwnd,SCI_SETADDITIONALCARETSVISIBLE,FALSE,0);
SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS, (bDenyVirtualSpaceAccess ? SCVS_NONE : SCVS_RECTANGULARSELECTION), 0);
SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS, SCVS_NONE, 0);
SendMessage(hwnd,SCI_SETLAYOUTCACHE,SC_CACHE_PAGE,0);
@ -3969,7 +3967,7 @@ void EditSortLines(HWND hwnd, int iSortFlags)
SendMessage(hwnd, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)iCurPosVS, 0);
}
else {
SendMessage(hwnd, SCI_SETSEL, (WPARAM)iAnchorPos, (LPARAM)iCurPos);
EditSelectEx(hwnd, iAnchorPos, iCurPos);
}
}
@ -3981,6 +3979,13 @@ void EditSortLines(HWND hwnd, int iSortFlags)
//
void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos)
{
if (iAnchorPos < 0) {
iAnchorPos = ((iCurrentPos >= 0) ? iCurrentPos : 0);
}
if (iCurrentPos < 0) {
iCurrentPos = ((iAnchorPos >= 0) ? iAnchorPos : 0);
}
int iNewLine = SciCall_LineFromPosition(iCurrentPos);
int iAnchorLine = SciCall_LineFromPosition(iAnchorPos);
@ -3990,11 +3995,14 @@ void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos)
if (iAnchorLine != iNewLine) {
SciCall_EnsureVisible(iNewLine);
}
SendMessage(hwnd, SCI_SETXCARETPOLICY, CARET_SLOP | CARET_STRICT | CARET_EVEN, 50);
SendMessage(hwnd, SCI_SETYCARETPOLICY, CARET_SLOP | CARET_STRICT | CARET_EVEN, 5);
SendMessage(hwnd, SCI_SETSEL, iAnchorPos, iCurrentPos);
SendMessage(hwnd, SCI_SETXCARETPOLICY, CARET_SLOP | CARET_EVEN, 50);
SendMessage(hwnd, SCI_SETYCARETPOLICY, CARET_EVEN, 0);
SciCall_SetSel(iAnchorPos, iCurrentPos);
SciCall_ScrollRange(iAnchorPos, iCurrentPos);
// remember x-pos for moving caret vertically
SendMessage(hwnd, SCI_CHOOSECARETX, 0, 0);
UpdateStatusbar();
}
@ -4004,7 +4012,7 @@ void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos)
//
void EditJumpTo(HWND hwnd,int iNewLine,int iNewCol)
{
// Jumpt to end with line set to -1
// jump to end with line set to -1
if (iNewLine < 0) {
SendMessage(hwnd, SCI_DOCUMENTEND, 0, 0);
return;
@ -4021,10 +4029,8 @@ void EditJumpTo(HWND hwnd,int iNewLine,int iNewCol)
const int iNewPos = (int)SendMessage(hwnd, SCI_FINDCOLUMN, (WPARAM)iNewLine, (LPARAM)iNewCol);
EditSelectEx(hwnd, -1, iNewPos); // SCI_GOTOPOS(pos) is equivalent to SCI_SETSEL(-1, pos)
EditSelectEx(hwnd, iNewPos, iNewPos); // <= SCI_GOTOPOS(pos)
// remember x-pos for moving caret vertivally
SendMessage(hwnd, SCI_CHOOSECARETX, 0, 0);
}
@ -4043,7 +4049,7 @@ void EditFixPositions(HWND hwnd)
int iNewPos = SciCall_PositionAfter( SciCall_PositionBefore(iCurrentPos) );
if (iNewPos != iCurrentPos) {
SendMessage(hwnd,SCI_SETCURRENTPOS,(WPARAM)iNewPos,0);
SciCall_SetCurrentPos(iNewPos);
iCurrentPos = iNewPos;
}
}
@ -4051,10 +4057,11 @@ void EditFixPositions(HWND hwnd)
if ((iAnchorPos != iCurrentPos) && (iAnchorPos > 0) && (iAnchorPos < iMaxPos))
{
int iNewPos = SciCall_PositionAfter(SciCall_PositionBefore(iAnchorPos));
if (iNewPos != iAnchorPos)
SendMessage(hwnd,SCI_SETANCHOR,(WPARAM)iNewPos,0);
if (iNewPos != iAnchorPos) {
SciCall_SetAnchor(iNewPos);
}
}
UNUSED(hwnd);
}
@ -4064,15 +4071,10 @@ void EditFixPositions(HWND hwnd)
//
void EditEnsureSelectionVisible(HWND hwnd)
{
int iAnchorPos = (int)SendMessage(hwnd,SCI_GETANCHOR,0,0);
int iCurrentPos = (int)SendMessage(hwnd,SCI_GETCURRENTPOS,0,0);
SendMessage(hwnd,SCI_ENSUREVISIBLE,
(WPARAM)SendMessage(hwnd,SCI_LINEFROMPOSITION,(WPARAM)iAnchorPos,0),0);
if (iAnchorPos != iCurrentPos) {
SendMessage(hwnd,SCI_ENSUREVISIBLE,
(WPARAM)SendMessage(hwnd,SCI_LINEFROMPOSITION,(WPARAM)iCurrentPos,0),0);
}
EditSelectEx(hwnd,iAnchorPos,iCurrentPos);
int iAnchorPos = SciCall_GetAnchor();
int iCurrentPos = SciCall_GetCurrentPos();
EditSelectEx(hwnd, iAnchorPos, iCurrentPos);
UNUSED(hwnd);
}
@ -5205,8 +5207,8 @@ BOOL EditFindNext(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bExtendSelection) {
}
if (bExtendSelection) {
int iSelPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0);
int iSelAnchor = (int)SendMessage(hwnd, SCI_GETANCHOR, 0, 0);
int iSelPos = SciCall_GetCurrentPos();
int iSelAnchor = SciCall_GetAnchor();
EditSelectEx(hwnd, min(iSelAnchor, iSelPos), end);
}
else {
@ -5273,8 +5275,8 @@ BOOL EditFindPrev(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bExtendSelection) {
}
if (bExtendSelection) {
int iSelPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0);
int iSelAnchor = (int)SendMessage(hwnd, SCI_GETANCHOR, 0, 0);
int iSelPos = SciCall_GetCurrentPos();
int iSelAnchor = SciCall_GetAnchor();
EditSelectEx(hwnd, max(iSelPos, iSelAnchor), start);
}
else {
@ -5322,11 +5324,11 @@ void EditMarkAllOccurrences()
//=============================================================================
//
// EditUpdateVisibleUrlHotspotr()
// EditUpdateVisibleUrlHotspot()
//
void EditUpdateVisibleUrlHotspot()
void EditUpdateVisibleUrlHotspot(BOOL bEnabled)
{
if (bHyperlinkHotspot)
if (bEnabled)
{
if (EditIsInTargetTransaction()) { return; } // do not block, next event occurs for sure
@ -5339,7 +5341,7 @@ void EditUpdateVisibleUrlHotspot()
int iPosStart = SciCall_PositionFromLine(iStartLine);
int iPosEnd = SciCall_GetLineEndPosition(iEndLine);
EditUpdateUrlHotspots(g_hwndEdit, iPosStart, iPosEnd, bHyperlinkHotspot);
EditUpdateUrlHotspots(g_hwndEdit, iPosStart, iPosEnd, bEnabled);
EditLeaveTargetTransaction();
}
@ -5996,16 +5998,14 @@ INT_PTR CALLBACK EditLinenumDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPa
case WM_INITDIALOG:
{
int iCurLine = (int)SendMessage(g_hwndEdit,SCI_LINEFROMPOSITION,
SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0),0)+1;
int iCurLine = SciCall_LineFromPosition(SciCall_GetCurrentPos())+1;
int iCurColumn = SciCall_GetColumn(SciCall_GetCurrentPos()) + 1;
SetDlgItemInt(hwnd,IDC_LINENUM,iCurLine,FALSE);
SetDlgItemInt(hwnd, IDC_COLNUM, iCurColumn, FALSE);
SendDlgItemMessage(hwnd,IDC_LINENUM,EM_LIMITTEXT,15,0);
SendDlgItemMessage(hwnd,IDC_COLNUM,EM_LIMITTEXT,15,0);
CenterDlgInParent(hwnd);
}
return TRUE;
@ -6038,14 +6038,13 @@ INT_PTR CALLBACK EditLinenumDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPa
return TRUE;
}
if (iNewLine > 0 && iNewLine <= iMaxLine && iNewCol > 0)
if ((iNewLine > 0) && (iNewLine <= iMaxLine) && (iNewCol > 0))
{
EditJumpTo(g_hwndEdit,iNewLine,iNewCol);
EndDialog(hwnd,IDOK);
}
else
PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,(!(iNewLine > 0 && iNewLine <= iMaxLine)) ? IDC_LINENUM : IDC_COLNUM)),1);
PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,(!((iNewLine > 0) && (iNewLine <= iMaxLine))) ? IDC_LINENUM : IDC_COLNUM)),1);
}
break;

View File

@ -133,7 +133,7 @@ void EditApplyLexerStyle(HWND, int, int);
void EditFinalizeStyling(HWND,int);
void EditMarkAllOccurrences();
void EditUpdateVisibleUrlHotspot();
void EditUpdateVisibleUrlHotspot(BOOL);
void EditEnterTargetTransaction();
void EditLeaveTargetTransaction();

View File

@ -190,6 +190,7 @@ int iSciFontQuality;
int iHighDpiToolBar;
int iUpdateDelayHyperlinkStyling;
int iUpdateDelayMarkAllCoccurrences;
int iCurrentLineVerticalSlop = 5;
const int DirectWriteTechnology[4] = {
SC_TECHNOLOGY_DEFAULT
@ -948,7 +949,6 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
}
if (flagJumpTo) { // Jump to position
EditJumpTo(g_hwndEdit,iInitialLine,iInitialColumn);
EditEnsureSelectionVisible(g_hwndEdit);
}
}
}
@ -1003,10 +1003,10 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
SendMessage(g_hwndEdit, SCI_NEWLINE, 0, 0);
SendMessage(g_hwndEdit, SCI_ENDUNDOACTION, 0, 0);
bAutoIndent = bAutoIndent2;
if (flagJumpTo) {
if (flagJumpTo)
EditJumpTo(g_hwndEdit, iInitialLine, iInitialColumn);
}
EditEnsureSelectionVisible(g_hwndEdit);
else
EditEnsureSelectionVisible(g_hwndEdit);
}
}
@ -1040,19 +1040,17 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
cpLastFind = cp;
if (flagMatchText & 4)
g_efrData.fuFlags |= SCFIND_REGEXP | SCFIND_POSIX;
g_efrData.fuFlags |= (SCFIND_REGEXP | SCFIND_POSIX);
else if (flagMatchText & 8)
g_efrData.bTransformBS = TRUE;
if (flagMatchText & 2) {
if (!flagJumpTo)
EditJumpTo(g_hwndEdit,-1,0);
if (!flagJumpTo) { SendMessage(g_hwndEdit, SCI_DOCUMENTEND, 0, 0); }
EditFindPrev(g_hwndEdit,&g_efrData,FALSE);
EditEnsureSelectionVisible(g_hwndEdit);
}
else {
if (!flagJumpTo)
SendMessage(g_hwndEdit,SCI_DOCUMENTSTART,0,0);
if (!flagJumpTo) { SendMessage(g_hwndEdit, SCI_DOCUMENTSTART, 0, 0); }
EditFindNext(g_hwndEdit,&g_efrData,FALSE);
EditEnsureSelectionVisible(g_hwndEdit);
}
@ -1334,6 +1332,10 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam)
g_hwndEdit = EditCreate(hwnd);
InitScintillaHandle(g_hwndEdit);
// Properties
SendMessage(g_hwndEdit, SCI_SETYCARETPOLICY, CARET_SLOP | CARET_EVEN | CARET_STRICT, iCurrentLineVerticalSlop);
SendMessage(g_hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, (bDenyVirtualSpaceAccess ? SCVS_NONE : SCVS_RECTANGULARSELECTION), 0);
// Tabs
SendMessage(g_hwndEdit,SCI_SETUSETABS,!bTabsAsSpaces,0);
SendMessage(g_hwndEdit,SCI_SETTABINDENTS,bTabIndents,0);
@ -2092,7 +2094,6 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam)
if (params->iInitialLine == 0)
params->iInitialLine = 1;
EditJumpTo(g_hwndEdit, params->iInitialLine, params->iInitialColumn);
EditEnsureSelectionVisible(g_hwndEdit);
}
flagLexerSpecified = 0;
@ -2141,7 +2142,7 @@ LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
ptc.x = pt.x; ptc.y = pt.y;
ScreenToClient(g_hwndEdit, &ptc);
iNewPos = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMPOINT, (WPARAM)ptc.x, (LPARAM)ptc.y);
SendMessage(g_hwndEdit, SCI_GOTOPOS, (WPARAM)iNewPos, 0);
EditSelectEx(g_hwndEdit, iNewPos, iNewPos);
}
if (pt.x == -1 && pt.y == -1) {
@ -2600,7 +2601,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
break;
case IDC_CALL_UPDATE_HOTSPOT:
EditUpdateVisibleUrlHotspot();
EditUpdateVisibleUrlHotspot(bHyperlinkHotspot);
break;
case IDM_FILE_NEW:
@ -4780,7 +4781,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
SendMessage(g_hwndEdit, SCI_CLEAR, 0, 0);
// possible unexpected behavior on Virtual Space Access, so:
const int iPos = SciCall_GetCurrentPos();
SendMessage(g_hwndEdit, SCI_SETSELECTION, iPos, iPos);
SendMessage(g_hwndEdit, SCI_SETSEL, iPos, iPos);
EndUndoAction(token);
}
}
@ -6304,6 +6305,8 @@ void LoadSettings()
bDenyVirtualSpaceAccess = IniSectionGetBool(pIniSection, L"DenyVirtualSpaceAccess", FALSE);
bUseOldStyleBraceMatching = IniSectionGetBool(pIniSection, L"UseOldStyleBraceMatching", FALSE);
iCurrentLineVerticalSlop = IniSectionGetInt(pIniSection, L"CurrentLineVerticalSlop", 5);
iCurrentLineVerticalSlop = max(min(iCurrentLineVerticalSlop, 80), 0);
LoadIniSection(L"Toolbar Images",pIniSection,cchIniSection);
@ -7234,7 +7237,7 @@ void MarkAllOccurrences(int delay)
void UpdateVisibleUrlHotspot(int delay)
{
if (delay < USER_TIMER_MINIMUM) {
EditUpdateVisibleUrlHotspot();
EditUpdateVisibleUrlHotspot(bHyperlinkHotspot);
return;
}
TEST_AND_SET(TIMER_BIT_UPDATE_HYPER);
@ -7513,7 +7516,7 @@ void InvalidateSelections()
int iCurPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0);
SendMessage(g_hwndEdit, WM_CANCELMODE, 0, 0);
SendMessage(g_hwndEdit, SCI_CLEARSELECTIONS, 0, 0);
SendMessage(g_hwndEdit, SCI_SETSELECTION, (WPARAM)iCurPos, (LPARAM)iCurPos);
SendMessage(g_hwndEdit, SCI_SETSEL, iCurPos, iCurPos);
}
}
@ -7529,22 +7532,23 @@ int BeginUndoAction()
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 };
sel.selMode = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONMODE,0,0);
sel.rectSelVS = (int)SendMessage(g_hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0);
if (sel.selMode == SC_SEL_LINES) {
sel.anchorPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONSTART,0,0);
sel.currPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONEND,0,0);
}
else if (sel.selMode == SC_SEL_RECTANGLE) {
sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0);
sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0);
if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) {
sel.anchorVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0);
sel.currVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0);
sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETANCHOR, 0, 0);
sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0);
if (!(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) {
if (sel.selMode == SC_SEL_LINES) {
sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0);
sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0);
}
else if (sel.selMode == SC_SEL_RECTANGLE) {
sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0);
sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0);
if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) {
sel.anchorVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0);
sel.currVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0);
}
}
}
else
{
sel.anchorPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0);
sel.currPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0);
}
token = UndoRedoActionMap(-1, &sel);
if (token >= 0) {
@ -7567,21 +7571,23 @@ void EndUndoAction(int token)
UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 };
if (UndoRedoActionMap(token,&sel) >= 0) {
// mode and type should not have changed
if (sel.selMode == SC_SEL_LINES) {
sel.anchorPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONSTART,0,0);
sel.currPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONEND,0,0);
}
else if (sel.selMode == SC_SEL_RECTANGLE) {
sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0);
sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0);
if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) {
sel.anchorVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0);
sel.currVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0);
sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETANCHOR, 0, 0);
sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0);
if (!(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) {
if (sel.selMode == SC_SEL_LINES) {
sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0);
sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0);
}
else if (sel.selMode == SC_SEL_RECTANGLE) {
sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0);
sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0);
if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) {
sel.anchorVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0);
sel.currVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0);
}
}
}
else {
sel.anchorPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0);
sel.currPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0);
}
}
UndoRedoActionMap(token,&sel); // set with redo action filled
@ -7602,6 +7608,14 @@ void RestoreAction(int token, DoAction doAct)
// 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 anchorPosLine = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, anchorPos, 0);
int currPosLine = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, currPos, 0);
// Ensure that the first and last lines of a selection are always unfolded
// This needs to be done _before_ the SCI_SETSEL message
SendMessage(g_hwndEdit, SCI_ENSUREVISIBLE, anchorPosLine, 0);
if (anchorPosLine != currPosLine) {
SendMessage(g_hwndEdit, SCI_ENSUREVISIBLE, currPosLine, 0);
}
int currRectType = (int)SendMessage(g_hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0);
PostMessage(g_hwndEdit,SCI_SETSELECTIONMODE,(WPARAM)sel.selMode,0);
PostMessage(g_hwndEdit,SCI_SETVIRTUALSPACEOPTIONS,(WPARAM)sel.rectSelVS,0);
@ -7613,14 +7627,15 @@ void RestoreAction(int token, DoAction doAct)
PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONANCHOR, (WPARAM)anchorPos, 0);
PostMessage(g_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(g_hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0);
PostMessage(g_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(g_hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0);
PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)currVS, 0);
}
}
else {
PostMessage(g_hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos);
PostMessage(g_hwndEdit, SCI_SETSEL, (LPARAM)anchorPos, (WPARAM)currPos);
PostMessage(g_hwndEdit, SCI_SCROLLRANGE, (LPARAM)anchorPos, (WPARAM)currPos);
}
PostMessage(g_hwndEdit,SCI_SETVIRTUALSPACEOPTIONS,(WPARAM)currRectType,0);
PostMessage(g_hwndEdit, SCI_CANCEL, 0, 0);
@ -7904,7 +7919,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
EditJumpTo(g_hwndEdit,-1,0);
SendMessage(g_hwndEdit,SCI_NEWLINE,0,0);
SendMessage(g_hwndEdit,SCI_ENDUNDOACTION,0,0);
EditJumpTo(g_hwndEdit,-1,0);
SendMessage(g_hwndEdit, SCI_DOCUMENTEND, 0, 0);
EditEnsureSelectionVisible(g_hwndEdit);
}
// set historic caret pos
@ -7968,7 +7983,7 @@ BOOL FileRevert(LPCWSTR szFileName)
if (FileLoad(TRUE,FALSE,TRUE,FALSE,tchFileName2))
{
if (bIsTail && iFileWatchingMode == 2) {
EditJumpTo(g_hwndEdit, -1, 0);
SendMessage(g_hwndEdit, SCI_DOCUMENTEND, 0, 0);
EditEnsureSelectionVisible(g_hwndEdit);
}
else if (SendMessage(g_hwndEdit,SCI_GETLENGTH,0,0) >= 4) {

View File

@ -327,6 +327,7 @@
<ClInclude Include="VersionEx.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\Build\Notepad3.ini" />
<None Include="..\res\Copy.cur" />
<None Include="..\res\Encoding.bmp" />
<None Include="..\res\Next.bmp" />

View File

@ -136,6 +136,9 @@
<None Include="..\Versions\VersionEx.h.tpl">
<Filter>templates</Filter>
</None>
<None Include="..\Build\Notepad3.ini">
<Filter>Resource Files</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Image Include="..\res\Notepad3.ico">

View File

@ -93,13 +93,16 @@ DeclareSciCallR0(GetSelectionEnd, GETSELECTIONEND, int);
DeclareSciCallR1(GetLineSelStartPosition, GETLINESELSTARTPOSITION, int, Sci_Position, line);
DeclareSciCallR1(GetLineSelEndPosition, GETLINESELENDPOSITION, int, Sci_Position, line);
DeclareSciCallV2(SetSel, SETSEL, int, anchorPos, int, currentPos);
DeclareSciCallV2(SetSel, SETSEL, Sci_Position, anchorPos, Sci_Position, currentPos);
DeclareSciCallV2(ScrollRange, SCROLLRANGE, Sci_Position, secondaryPos, Sci_Position, primaryPos);
DeclareSciCallV0(Clear, CLEAR);
DeclareSciCallV2(SetTargetRange, SETTARGETRANGE, int, start, int, end);
DeclareSciCallV0(TargetFromSelection, TARGETFROMSELECTION);
DeclareSciCallV1(GotoPos, GOTOPOS, int, position);
DeclareSciCallV1(GotoLine, GOTOLINE, int, line);
DeclareSciCallV1(SetAnchor, SETANCHOR, Sci_Position, position);
DeclareSciCallV1(SetCurrentPos, SETCURRENTPOS, Sci_Position, position);
DeclareSciCallV1(GotoPos, GOTOPOS, Sci_Position, position);
DeclareSciCallV1(GotoLine, GOTOLINE, Sci_Position, line);
DeclareSciCallR1(PositionBefore, POSITIONBEFORE, int, Sci_Position, position);
DeclareSciCallR1(PositionAfter, POSITIONAFTER, int, Sci_Position, position);
DeclareSciCallR1(GetCharAt, GETCHARAT, char, Sci_Position, position);