Merge pull request #3306 from RaiKoHoff/Dev_Sci501

Small fixes on file change notification and visibility of caret after jumps
This commit is contained in:
Rainer Kottenhoff 2021-04-12 18:57:23 +02:00 committed by GitHub
commit 6f3a80bca1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 93 additions and 85 deletions

View File

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

View File

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

View File

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

View File

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