diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 0b25315bb..85c4380ef 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -1178,7 +1178,7 @@ void LoadSettings() Settings2.CurrentLineHorizontalSlop = clampi(IniSectionGetInt(IniSecSettings2, L"CurrentLineHorizontalSlop", Defaults2.CurrentLineHorizontalSlop), 0, 240); Defaults2.CurrentLineVerticalSlop = 5; - Settings2.CurrentLineVerticalSlop = clampi(IniSectionGetInt(IniSecSettings2, L"CurrentLineVerticalSlop", Defaults2.CurrentLineVerticalSlop), 0, 25); + Settings2.CurrentLineVerticalSlop = clampi(IniSectionGetInt(IniSecSettings2, L"CurrentLineVerticalSlop", Defaults2.CurrentLineVerticalSlop), 0, 100); Defaults2.NoCopyLineOnEmptySelection = false; Settings2.NoCopyLineOnEmptySelection = IniSectionGetBool(IniSecSettings2, L"NoCopyLineOnEmptySelection", Defaults2.NoCopyLineOnEmptySelection); diff --git a/src/Edit.c b/src/Edit.c index f5916854c..401173e40 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -2193,6 +2193,7 @@ void EditFindMatchingBrace() if (iMatchingBracePos != (DocPos)-1) { iMatchingBracePos = bIsAfter ? iMatchingBracePos : SciCall_PositionAfter(iMatchingBracePos); Sci_GotoPosChooseCaret(iMatchingBracePos); + EditEnsureSelectionVisible(); } } @@ -3100,6 +3101,7 @@ void EditIndentBlock(HWND hwnd, int cmd, bool bFormatIndentation, bool bForceAll } } else { Sci_GotoPosChooseCaret(iInitialPos); + EditEnsureSelectionVisible(); } _END_UNDO_ACTION_; @@ -5091,6 +5093,38 @@ void EditSortLines(HWND hwnd, int iSortFlags) } + +//============================================================================= +// +// _EnsureRangeVisible() +// +static void _EnsureRangeVisible(const DocPos iAnchorPos, const DocPos iCurrentPos) { + + DocLn const iAnchorLine = SciCall_LineFromPosition(iAnchorPos); + DocLn const iCurrentLine = SciCall_LineFromPosition(iCurrentPos); + if (iAnchorLine != iCurrentLine) { + if (!SciCall_GetLineVisible(iAnchorLine)) { + SciCall_EnsureVisible(iAnchorLine); + } + } + if (!SciCall_GetLineVisible(iCurrentLine)) { + SciCall_EnsureVisibleEnforcePolicy(iCurrentLine); + } +} + + +//============================================================================= +// +// EditEnsureSelectionVisible() +// +void EditEnsureSelectionVisible() { + DocPos const iAnchorPos = SciCall_GetAnchor(); + DocPos const iCurrentPos = SciCall_GetCurrentPos(); + _EnsureRangeVisible(iAnchorPos, iCurrentPos); + SciCall_ScrollRange(iAnchorPos, iCurrentPos); +} + + //============================================================================= // // EditSetSelectionEx() @@ -5109,19 +5143,9 @@ void EditSetSelectionEx(DocPos iAnchorPos, DocPos iCurrentPos, DocPos vSpcAnchor iCurrentPos = Sci_GetDocEndPosition(); } - DocLn const iCurrentLine = SciCall_LineFromPosition(iCurrentPos); - DocLn const iAnchorLine = SciCall_LineFromPosition(iAnchorPos); - // Ensure that the first and last lines of a selection are always unfolded // This needs to be done *before* the SCI_SETSEL message - if (iAnchorLine != iCurrentLine) { - if (!SciCall_GetLineVisible(iAnchorLine)) { - SciCall_EnsureVisible(iAnchorLine); - } - } - if (!SciCall_GetLineVisible(iCurrentLine)) { - SciCall_EnsureVisibleEnforcePolicy(iCurrentLine); - } + _EnsureRangeVisible(iAnchorPos, iCurrentPos); if ((vSpcAnchor >= 0) && (vSpcCurrent >= 0)) { SciCall_SetRectangularSelectionAnchor(iAnchorPos); @@ -5132,7 +5156,7 @@ void EditSetSelectionEx(DocPos iAnchorPos, DocPos iCurrentPos, DocPos vSpcAnchor if (vSpcCurrent > 0) { SciCall_SetRectangularSelectionCaretVirtualSpace(vSpcCurrent); } - SciCall_ScrollCaret(); + SciCall_ScrollRange(iAnchorPos, iCurrentPos); } else { SciCall_SetSel(iAnchorPos, iCurrentPos); // scrolls into view } @@ -5154,29 +5178,6 @@ void EditEnsureConsistentLineEndings(HWND hwnd) } -//============================================================================= -// -// EditEnsureSelectionVisible() -// -void EditEnsureSelectionVisible() -{ - DocPos const iCurrentPos = SciCall_GetCurrentPos(); - DocPos const iAnchorPos = SciCall_GetAnchor(); - // Ensure that the first and last lines of a selection are always unfolded - DocLn const iCurrentLine = SciCall_LineFromPosition(iCurrentPos); - DocLn const iAnchorLine = SciCall_LineFromPosition(iAnchorPos); - if (iAnchorLine != iCurrentLine) { - if (!SciCall_GetLineVisible(iAnchorLine)) { - SciCall_EnsureVisible(iAnchorLine); - } - } - if (!SciCall_GetLineVisible(iCurrentLine)) { - SciCall_EnsureVisibleEnforcePolicy(iCurrentLine); - } - SciCall_ScrollRange(iAnchorPos, iCurrentPos); -} - - //============================================================================= // // EditJumpTo() @@ -5201,9 +5202,8 @@ void EditJumpTo(DocLn iNewLine, DocPos iNewCol) // Column minimum is 1 DocPos const colOffset = Globals.bZeroBasedColumnIndex ? 0 : 1; iNewCol = clampp((iNewCol - colOffset), 0, iLineEndPos); - const DocPos iNewPos = SciCall_FindColumn(iNewLine, iNewCol); - Sci_GotoPosChooseCaret(iNewPos); + Sci_GotoPosChooseCaret(SciCall_FindColumn(iNewLine, iNewCol)); } diff --git a/src/Notepad3.c b/src/Notepad3.c index 3fbdf6475..d16205894 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -567,6 +567,7 @@ static bool s_flagQuietCreate = false; static bool s_flagLexerSpecified = false; static bool s_flagAppIsClosing = false; static bool s_flagDisplayHelp = false; +static int s_iCaretPolicyV = CARET_EVEN; //============================================================================== @@ -1384,6 +1385,7 @@ HWND InitInstance(const HINSTANCE hInstance, LPCWSTR pszCmdLine, int nCmdShow) // Pathname parameter if (s_IsThisAnElevatedRelaunch || (StrIsNotEmpty(s_lpFileArg) /*&& !g_flagNewFromClipboard*/)) { + bool bOpened = false; // Open from Directory @@ -1430,7 +1432,9 @@ HWND InitInstance(const HINSTANCE hInstance, LPCWSTR pszCmdLine, int nCmdShow) } } if (s_flagJumpTo) { // Jump to position - EditJumpTo(s_iInitialLine,s_iInitialColumn); + SciCall_SetYCaretPolicy(s_iCaretPolicyV | CARET_JUMPS, Settings2.CurrentLineVerticalSlop); + EditJumpTo(s_iInitialLine, s_iInitialColumn); + SciCall_SetYCaretPolicy(s_iCaretPolicyV, Settings2.CurrentLineVerticalSlop); } } } @@ -1456,7 +1460,9 @@ HWND InitInstance(const HINSTANCE hInstance, LPCWSTR pszCmdLine, int nCmdShow) FileWatching.FileWatchingMode = FWM_DONT_CARE; break; } - InstallFileWatching(FileWatching.FileWatchingMode != FWM_DONT_CARE); + if (!s_IsThisAnElevatedRelaunch) { + InstallFileWatching(true); + } } } else { cpi_enc_t const forcedEncoding = Encoding_Forced(CPI_GET); @@ -1494,7 +1500,9 @@ HWND InitInstance(const HINSTANCE hInstance, LPCWSTR pszCmdLine, int nCmdShow) _END_UNDO_ACTION_; Settings.AutoIndent = bAutoIndent2; if (s_flagJumpTo) { + SciCall_SetYCaretPolicy(s_iCaretPolicyV | CARET_JUMPS, Settings2.CurrentLineVerticalSlop); EditJumpTo(s_iInitialLine, s_iInitialColumn); + SciCall_SetYCaretPolicy(s_iCaretPolicyV, Settings2.CurrentLineVerticalSlop); } else { EditEnsureSelectionVisible(); } @@ -2017,24 +2025,13 @@ static void _InitializeSciEditCtrl(HWND hwndEditCtrl) SciCall_SetMouseDWellTime(SC_TIME_FOREVER); // default } - - #define _CARET_SYMETRY CARET_EVEN /// CARET_EVEN or 0 - #define _CARET_ENFORCE CARET_STRICT /// CARET_STRICT or 0 - - if (Settings2.CurrentLineHorizontalSlop > 0) { - SciCall_SetXCaretPolicy(CARET_SLOP | _CARET_SYMETRY | _CARET_ENFORCE, Settings2.CurrentLineHorizontalSlop); - } else { - SciCall_SetXCaretPolicy(CARET_SLOP | _CARET_SYMETRY | _CARET_ENFORCE, 0); - } - - if (Settings2.CurrentLineVerticalSlop > 0) { - SciCall_SetYCaretPolicy(CARET_SLOP | _CARET_SYMETRY | _CARET_ENFORCE, Settings2.CurrentLineVerticalSlop); - } else { - SciCall_SetYCaretPolicy(_CARET_SYMETRY, 0); - } + int const iCaretPolicy = CARET_SLOP | CARET_EVEN | CARET_STRICT; + s_iCaretPolicyV = (Settings2.CurrentLineVerticalSlop > 0) ? iCaretPolicy : CARET_EVEN; + SciCall_SetXCaretPolicy(iCaretPolicy, Settings2.CurrentLineHorizontalSlop); + SciCall_SetYCaretPolicy(s_iCaretPolicyV, Settings2.CurrentLineVerticalSlop); + SciCall_SetVisiblePolicy(s_iCaretPolicyV, Settings2.CurrentLineVerticalSlop); SciCall_SetEndAtLastLine(!Settings.ScrollPastEOF); - // Tabs SciCall_SetUseTabs(!Globals.fvCurFile.bTabsAsSpaces); SciCall_SetTabIndents(Globals.fvCurFile.bTabIndents); @@ -3173,7 +3170,9 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam) if (params->flagJumpTo) { s_flagJumpTo = true; + SciCall_SetYCaretPolicy(s_iCaretPolicyV | CARET_JUMPS, Settings2.CurrentLineVerticalSlop); EditJumpTo(params->iInitialLine, params->iInitialColumn); + SciCall_SetYCaretPolicy(s_iCaretPolicyV, Settings2.CurrentLineVerticalSlop); } if (params->flagMatchText) { @@ -3325,8 +3324,11 @@ LRESULT MsgChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam); + InstallFileWatching(false); // terminate + DocPos const iCurPos = SciCall_GetCurrentPos(); + if ((FileWatching.FileWatchingMode == FWM_MSGBOX) || GetDocModified()) { SetForegroundWindow(hwnd); } @@ -3344,14 +3346,10 @@ LRESULT MsgChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) FileRevert(Paths.CurrentFile, /*Encoding_Changed(CPI_GET)*/false); if (FileWatching.MonitoringLog) { SciCall_SetReadOnly(FileWatching.MonitoringLog); - EditEnsureSelectionVisible(); } else { Sci_GotoPosChooseCaret(iCurPos); } - } - - if (!isFileChangeNotifyAllowed()) { - InstallFileWatching(true); + EditEnsureSelectionVisible(); } } else { @@ -3359,12 +3357,15 @@ LRESULT MsgChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) WORD const answer = INFOBOX_ANSW(InfoBoxLng(MB_YESNO | MB_ICONWARNING, NULL, IDS_MUI_FILECHANGENOTIFY2)); if ((IDOK == answer) || (IDYES == answer)) { FileSave(true, false, false, false, Flags.bPreserveFileModTime); - InstallFileWatching(true); } else { - InstallFileWatching(false); // terminate SetSaveNeeded(); } } + + if (PathIsExistingFile(Paths.CurrentFile)) { + InstallFileWatching(true); + } + return TRUE; } @@ -5997,6 +5998,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) if ((!SciCall_IsSelectionEmpty() || Sci_IsMultiOrRectangleSelection()) && (skipLevel == Settings2.ExitOnESCSkipLevel)) { Sci_GotoPosChooseCaret(iCurPos); + EditEnsureSelectionVisible(); skipLevel -= Defaults2.ExitOnESCSkipLevel; } @@ -6012,6 +6014,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) default: Sci_GotoPosChooseCaret(iCurPos); + EditEnsureSelectionVisible(); break; } } @@ -10111,9 +10114,9 @@ bool FileRevert(LPCWSTR szFileName, bool bIgnoreCmdLnEnc) WCHAR tchFileName2[MAX_PATH] = { L'\0' }; StringCchCopyW(tchFileName2, COUNTOF(tchFileName2), szFileName); - InstallFileWatching(false); + //InstallFileWatching(false); bool const result = FileLoad(tchFileName2, true, false, true, Settings.SkipUnicodeDetection, Settings.SkipANSICodePageDetection, false); - InstallFileWatching(true); + //InstallFileWatching(true); if (!result) { return false; @@ -10143,7 +10146,9 @@ bool FileRevert(LPCWSTR szFileName, bool bIgnoreCmdLnEnc) UpdateStatusbar(true); if (bPreserveView) { + SciCall_SetYCaretPolicy(s_iCaretPolicyV | CARET_JUMPS, Settings2.CurrentLineVerticalSlop); EditJumpTo(curLineNum + 1, 0); + SciCall_SetYCaretPolicy(s_iCaretPolicyV, Settings2.CurrentLineVerticalSlop); } return true; @@ -11375,7 +11380,7 @@ void InstallFileWatching(const bool bInstall) { // need to chose another mode FILE_WATCHING_MODE const fwm = Settings.FileWatchingMode; FileWatching.FileWatchingMode = (fwm != FWM_EXCLUSIVELOCK) ? fwm : FWM_MSGBOX; - InstallFileWatching(bInstall); + InstallFileWatching(true); } } diff --git a/src/SciCall.h b/src/SciCall.h index 7d897190a..df8098e14 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -437,7 +437,9 @@ DeclareSciCallV1(SetXOffset, SETXOFFSET, int, offset); DeclareSciCallV2(SetVisiblePolicy, SETVISIBLEPOLICY, int, flags, DocLn, lines); DeclareSciCallV0(MoveCaretInsideView, MOVECARETINSIDEVIEW); +DeclareSciCallV2(ShowLines, SHOWLINES, DocLn, lnStart, DocLn, lnEnd); DeclareSciCallR0(LinesOnScreen, LINESONSCREEN, DocLn); +DeclareSciCallR1(GetLineVisible, GETLINEVISIBLE, bool, DocLn, line); DeclareSciCallR0(GetFirstVisibleLine, GETFIRSTVISIBLELINE, DocLn); DeclareSciCallV1(SetFirstVisibleLine, SETFIRSTVISIBLELINE, DocLn, line); DeclareSciCallR1(VisibleFromDocLine, VISIBLEFROMDOCLINE, DocLn, DocLn, line); @@ -447,6 +449,23 @@ DeclareSciCallV1(SetHScrollbar, SETHSCROLLBAR, bool, visible); DeclareSciCallV1(SetVScrollbar, SETVSCROLLBAR, bool, visible); +//============================================================================= +// +// Folding +// +DeclareSciCallV2(SetFoldLevel, SETFOLDLEVEL, DocLn, line, int, level); +DeclareSciCallR1(GetFoldLevel, GETFOLDLEVEL, int, DocLn, line); +DeclareSciCallV1(SetFoldFlags, SETFOLDFLAGS, int, flags); +DeclareSciCallV1(FoldDisplayTextSetStyle, FOLDDISPLAYTEXTSETSTYLE, int, flags); +DeclareSciCallR1(GetFoldParent, GETFOLDPARENT, DocLn, DocLn, line); +DeclareSciCallR2(GetLastChild, GETLASTCHILD, DocLn, DocLn, line, int, level); +DeclareSciCallR1(GetFoldExpanded, GETFOLDEXPANDED, bool, DocLn, line); +DeclareSciCallV1(ToggleFold, TOGGLEFOLD, DocLn, line); +DeclareSciCallV1(FoldAll, FOLDALL, int, flags); +DeclareSciCallV1(EnsureVisible, ENSUREVISIBLE, DocLn, line); +DeclareSciCallV1(EnsureVisibleEnforcePolicy, ENSUREVISIBLEENFORCEPOLICY, DocLn, line); + + //============================================================================= // // Line State (parser internals) @@ -497,11 +516,13 @@ DeclareSciCallV2(StyleSetFont, STYLESETFONT, int, style, const char *, fontname) // Indentation Guides and Wraping // DeclareSciCallV1(SetWrapMode, SETWRAPMODE, int, mode); -DeclareSciCallR0(GetWrapIndentMode, GETWRAPINDENTMODE, int); +DeclareSciCallR0(GetWrapMode, GETWRAPMODE, int); DeclareSciCallV1(SetWrapIndentMode, SETWRAPINDENTMODE, int, mode); +DeclareSciCallR0(GetWrapIndentMode, GETWRAPINDENTMODE, int); DeclareSciCallV1(SetWrapStartIndent, SETWRAPSTARTINDENT, int, mode); DeclareSciCallV1(SetWrapVisualFlags, SETWRAPVISUALFLAGS, int, opts); DeclareSciCallV1(SetWrapVisualFlagsLocation, SETWRAPVISUALFLAGSLOCATION, int, opts); +DeclareSciCallR1(WrapCount, WRAPCOUNT, DocLn, DocLn, line); DeclareSciCallV1(SetEdgeMode, SETEDGEMODE, int, mode); DeclareSciCallR0(GetEdgeMode, GETEDGEMODE, int); @@ -603,24 +624,6 @@ DeclareSciCallR2(IndicatorValueAt, INDICATORVALUEAT, int, int, indicID, DocPos, DeclareSciCallR2(IndicatorStart, INDICATORSTART, int, int, indicID, DocPos, position); DeclareSciCallR2(IndicatorEnd, INDICATOREND, int, int, indicID, DocPos, position); -//============================================================================= -// -// Folding -// -// -DeclareSciCallR1(GetLineVisible, GETLINEVISIBLE, bool, DocLn, line); -DeclareSciCallV2(SetFoldLevel, SETFOLDLEVEL, DocLn, line, int, level); -DeclareSciCallR1(GetFoldLevel, GETFOLDLEVEL, int, DocLn, line); -DeclareSciCallV1(SetFoldFlags, SETFOLDFLAGS, int, flags); -DeclareSciCallV1(FoldDisplayTextSetStyle, FOLDDISPLAYTEXTSETSTYLE, int, flags); -DeclareSciCallR1(GetFoldParent, GETFOLDPARENT, DocLn, DocLn, line); -DeclareSciCallR2(GetLastChild, GETLASTCHILD, DocLn, DocLn, line, int, level); -DeclareSciCallR1(GetFoldExpanded, GETFOLDEXPANDED, bool, DocLn, line); -DeclareSciCallV1(ToggleFold, TOGGLEFOLD, DocLn, line); -DeclareSciCallV1(FoldAll, FOLDALL, int, flags); -DeclareSciCallV1(EnsureVisible, ENSUREVISIBLE, DocLn, line); -DeclareSciCallV1(EnsureVisibleEnforcePolicy, ENSUREVISIBLEENFORCEPOLICY, DocLn, line); - //============================================================================= //