From 1682b9b79e27f1123a39faf4a4587f8a1b0d59f7 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 16 Mar 2016 12:27:07 +0300 Subject: [PATCH] fix scrolling to caret at the end of soft wrapped line --- .../editor/impl/ScrollingModelImpl.java | 27 ++++++++++++++----- .../openapi/editor/impl/EditorImplTest.java | 10 +++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ScrollingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ScrollingModelImpl.java index 651ff1c40ee4..e0de68cfdb2c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ScrollingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ScrollingModelImpl.java @@ -30,6 +30,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.VisibleAreaEvent; @@ -135,9 +136,23 @@ public class ScrollingModelImpl implements ScrollingModelEx { @Override public void scrollToCaret(@NotNull ScrollType scrollType) { assertIsDispatchThread(); - LogicalPosition caretPosition = myEditor.getCaretModel().getLogicalPosition(); myEditor.validateSize(); - scrollTo(caretPosition, scrollType); + if (myEditor.myUseNewRendering) { + VisualPosition caretPosition = myEditor.getCaretModel().getVisualPosition(); + scrollTo(caretPosition, scrollType); + } + else { + LogicalPosition caretPosition = myEditor.getCaretModel().getLogicalPosition(); + scrollTo(caretPosition, scrollType); + } + } + + private void scrollTo(@NotNull VisualPosition pos, @NotNull ScrollType scrollType) { + AnimatedScrollingRunnable canceledThread = cancelAnimatedScrolling(false); + Rectangle viewRect = canceledThread != null ? canceledThread.getTargetVisibleArea() : getVisibleArea(); + Point targetLocation = myEditor.visualPositionToXY(pos); + Point p = calcOffsetsToScroll(targetLocation, scrollType, viewRect); + scrollToOffsets(p.x, p.y); } @Override @@ -146,8 +161,8 @@ public class ScrollingModelImpl implements ScrollingModelEx { AnimatedScrollingRunnable canceledThread = cancelAnimatedScrolling(false); Rectangle viewRect = canceledThread != null ? canceledThread.getTargetVisibleArea() : getVisibleArea(); - - Point p = calcOffsetsToScroll(pos, scrollType, viewRect); + Point targetLocation = myEditor.logicalPositionToXY(pos); + Point p = calcOffsetsToScroll(targetLocation, scrollType, viewRect); scrollToOffsets(p.x, p.y); } @@ -177,9 +192,7 @@ public class ScrollingModelImpl implements ScrollingModelEx { myAnimationDisabled = false; } - private Point calcOffsetsToScroll(LogicalPosition pos, ScrollType scrollType, Rectangle viewRect) { - Point targetLocation = myEditor.logicalPositionToXY(pos); - + private Point calcOffsetsToScroll(Point targetLocation, ScrollType scrollType, Rectangle viewRect) { if (myEditor.getSettings().isRefrainFromScrolling() && viewRect.contains(targetLocation)) { if (scrollType == ScrollType.CENTER || scrollType == ScrollType.CENTER_DOWN || diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java index 441bc2de6908..00c755610175 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java @@ -319,4 +319,14 @@ public class EditorImplTest extends AbstractEditorTest { up(); checkResultByText("abc\ndef\nghi"); } + + public void testScrollingToCaretAtSoftWrap() throws Exception { + initText("looooooooooooooooong wooooooooooooooooords"); + configureSoftWraps(10); + end(); + VisualPosition caretPosition = myEditor.getCaretModel().getCurrentCaret().getVisualPosition(); + Point caretPoint = myEditor.visualPositionToXY(caretPosition); + Rectangle visibleArea = myEditor.getScrollingModel().getVisibleArea(); + assertTrue(visibleArea.contains(caretPoint)); + } }