diff --git a/Build/Notepad3.ini b/Build/Notepad3.ini index 56ef81cf2..a7bcb4053 100644 Binary files a/Build/Notepad3.ini and b/Build/Notepad3.ini differ diff --git a/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini b/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini index 66b8a508b..a7bcb4053 100644 Binary files a/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini and b/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini differ diff --git a/np3portableapp/Notepad3Portable/Data/settings/Notepad3.ini b/np3portableapp/Notepad3Portable/Data/settings/Notepad3.ini deleted file mode 100644 index ea9752cf9..000000000 Binary files a/np3portableapp/Notepad3Portable/Data/settings/Notepad3.ini and /dev/null differ diff --git a/src/Edit.c b/src/Edit.c index 0b6a8d1fd..3c56d58eb 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -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; diff --git a/src/Edit.h b/src/Edit.h index c7710e290..6874f5c36 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -133,7 +133,7 @@ void EditApplyLexerStyle(HWND, int, int); void EditFinalizeStyling(HWND,int); void EditMarkAllOccurrences(); -void EditUpdateVisibleUrlHotspot(); +void EditUpdateVisibleUrlHotspot(BOOL); void EditEnterTargetTransaction(); void EditLeaveTargetTransaction(); diff --git a/src/Notepad3.c b/src/Notepad3.c index 5a10289a5..d5474bb50 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -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) { diff --git a/src/Notepad3.vcxproj b/src/Notepad3.vcxproj index 1735a0f83..a5edf2131 100644 --- a/src/Notepad3.vcxproj +++ b/src/Notepad3.vcxproj @@ -327,6 +327,7 @@ + diff --git a/src/Notepad3.vcxproj.filters b/src/Notepad3.vcxproj.filters index 330b76499..76ae07fab 100644 --- a/src/Notepad3.vcxproj.filters +++ b/src/Notepad3.vcxproj.filters @@ -136,6 +136,9 @@ templates + + Resource Files + diff --git a/src/SciCall.h b/src/SciCall.h index 38042fef6..0352af5bc 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -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);