aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <unknown>2001-08-08 12:38:52 +0000
committernyamatongwe <unknown>2001-08-08 12:38:52 +0000
commitd5a2e3789a7a165ae42989cba593061031e44550 (patch)
treeea681b2e2f1f417f13ca45f417f455959de50f08 /src
parent9f4411a033f2513b91f7f50e3c1e77c570426132 (diff)
downloadscintilla-mirror-d5a2e3789a7a165ae42989cba593061031e44550.tar.gz
Patch from Philippe to make the display jump more when the caret reaches
a margin. This is chosen with the CARET_XJUMPS flag.
Diffstat (limited to 'src')
-rw-r--r--src/Editor.cxx24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 1416fad8f..b4e192558 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -588,15 +588,22 @@ void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) {
int lineCaret = cs.DisplayFromDoc(pdoc->LineFromPosition(posCaret));
ptBottomCaret.y += vs.lineHeight - 1;
- // Ensure the caret is reasonably visible in context.
+ // Ensure the caret is reasonably visible in context:
+ // xMargin must equal to xCaretMargin, with a minimum of 2 and a maximum of
+ // slightly less than half the width of the text area.
int xMargin = Platform::Clamp(xCaretMargin, 2, Platform::Maximum(rcClient.Width() - 10, 4) / 2);
if (!useMargin)
xMargin = 2;
- // Ensure certain amount of text visible on both sides of caret
- // So move if caret just on edge
- rcClient.left = rcClient.left + xMargin;
- rcClient.right = rcClient.right - xMargin;
+ // If we scroll the display, we use a minimum amount of xMargin.
+ int offsetLeft = rcClient.left + xMargin;
+ int offsetRight = rcClient.right - xMargin;
+ // If we are in XJUMPS mode, then when the margin is reached, the
+ // offset jumps so that it won't need to move agin for a while.
+ if (!(caretPolicy & CARET_XJUMPS)) {
+ rcClient.left = offsetLeft;
+ rcClient.right = offsetRight;
+ }
// Vertical positioning
if (vert && (!rcClient.Contains(pt) || !rcClient.Contains(ptBottomCaret) || (caretPolicy & CARET_STRICT))) {
@@ -627,10 +634,10 @@ void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) {
if (horiz) {
int xOffsetNew = xOffset;
if (pt.x < rcClient.left) {
- xOffsetNew = xOffset - (rcClient.left - pt.x);
+ xOffsetNew = xOffset - (offsetLeft - pt.x);
} else if (((caretPolicy & CARET_XEVEN) && ((xOffset > 0) && useMargin)) || pt.x >= rcClient.right) {
- xOffsetNew = xOffset + (pt.x - rcClient.right);
- int xOffsetEOL = xOffset + (ptEOL.x - rcClient.right) - xMargin + 2;
+ xOffsetNew = xOffset + (pt.x - offsetRight);
+ int xOffsetEOL = xOffset + (ptEOL.x - offsetRight) - xMargin + 2;
//Platform::DebugPrintf("Margin %d %d\n", xOffsetNew, xOffsetEOL);
// Ensure don't scroll out into empty space
if (xOffsetNew > xOffsetEOL)
@@ -2035,7 +2042,6 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
}
}
if (mh.linesAdded != 0) {
-
// Update contraction state for inserted and removed lines
// lineOfPos should be calculated in context of state before modification, shouldn't it
int lineOfPos = pdoc->LineFromPosition(mh.position);