From 83cfe4dddee287c81dec8a226c5c8de63e447700 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 8 Nov 2016 12:16:13 +0300 Subject: [PATCH] avoid caret visual position changes on parameter hints adding (IDEA-115424) fix side effect of horizontal scrolling not working correctly for Home/End on a long line --- .../com/intellij/openapi/editor/ScrollingModel.java | 1 + .../editor/ex/util/CaretVisualPositionKeeper.java | 5 +++-- .../intellij/openapi/editor/impl/EditorImpl.java | 2 +- .../openapi/editor/impl/ScrollingModelImpl.java | 13 +++++++------ .../textarea/TextComponentScrollingModel.java | 5 +++++ 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/ScrollingModel.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/ScrollingModel.java index 460633ce5b11..d3792632359f 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/ScrollingModel.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/ScrollingModel.java @@ -43,6 +43,7 @@ public interface ScrollingModel { void scrollVertically(int scrollOffset); void scrollHorizontally(int scrollOffset); + void scroll(int horizontalOffset, int verticalOffset); void addVisibleAreaListener(@NotNull VisibleAreaListener listener); void removeVisibleAreaListener(@NotNull VisibleAreaListener listener); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java index 785ecb72550a..2bde57616bf2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java @@ -56,10 +56,11 @@ public class CaretVisualPositionKeeper { Point caretLocation = editor.visualPositionToXY(editor.getCaretModel().getVisualPosition()); int scrollOffset = caretLocation.y - relativePosition; ScrollingModel scrollingModel = editor.getScrollingModel(); + Rectangle targetArea = scrollingModel.getVisibleAreaOnScrollingFinished(); // when animated scrolling is in progress, we'll not stop it immediately - boolean useAnimation = !scrollingModel.getVisibleAreaOnScrollingFinished().equals(scrollingModel.getVisibleArea()); + boolean useAnimation = !targetArea.equals(scrollingModel.getVisibleArea()); if (!useAnimation) scrollingModel.disableAnimation(); - scrollingModel.scrollVertically(scrollOffset); + scrollingModel.scroll(targetArea.x, scrollOffset); if (!useAnimation) scrollingModel.enableAnimation(); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index da4d524f0e16..a34fbdaf1532 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -1155,7 +1155,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi Point shiftedZoomCenterAbsolute = logicalPositionToXY(zoomCenterLogical); myScrollingModel.disableAnimation(); try { - myScrollingModel.scrollToOffsets(visibleArea.x == 0 ? 0 : shiftedZoomCenterAbsolute.x - zoomCenterRelative.x, // stick to left border if it's visible + myScrollingModel.scroll(visibleArea.x == 0 ? 0 : shiftedZoomCenterAbsolute.x - zoomCenterRelative.x, // stick to left border if it's visible shiftedZoomCenterAbsolute.y - zoomCenterRelative.y + (intraLineOffset * getLineHeight() + oldLineHeight / 2) / oldLineHeight); } finally { myScrollingModel.enableAnimation(); 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 d1844ce3432a..1839a335462d 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 @@ -114,7 +114,7 @@ public class ScrollingModelImpl implements ScrollingModelEx { final int currentOffset = getVerticalScrollOffset(); int offsetToUse = Math.min(minPreferredY, currentOffset); if (offsetToUse != currentOffset) { - scrollToOffsets(getHorizontalScrollOffset(), offsetToUse); + scroll(getHorizontalScrollOffset(), offsetToUse); return true; } return false; @@ -159,7 +159,7 @@ public class ScrollingModelImpl implements ScrollingModelEx { AnimatedScrollingRunnable canceledThread = cancelAnimatedScrolling(false); Rectangle viewRect = canceledThread != null ? canceledThread.getTargetVisibleArea() : getVisibleArea(); Point p = calcOffsetsToScroll(targetLocation, scrollType, viewRect); - scrollToOffsets(p.x, p.y); + scroll(p.x, p.y); } @Override @@ -305,7 +305,7 @@ public class ScrollingModelImpl implements ScrollingModelEx { @Override public void scrollVertically(int scrollOffset) { - scrollToOffsets(getHorizontalScrollOffset(), scrollOffset); + scroll(getHorizontalScrollOffset(), scrollOffset); } private void _scrollVertically(int scrollOffset) { @@ -319,7 +319,7 @@ public class ScrollingModelImpl implements ScrollingModelEx { @Override public void scrollHorizontally(int scrollOffset) { - scrollToOffsets(scrollOffset, getVerticalScrollOffset()); + scroll(scrollOffset, getVerticalScrollOffset()); } private void _scrollHorizontally(int scrollOffset) { @@ -330,7 +330,8 @@ public class ScrollingModelImpl implements ScrollingModelEx { scrollbar.setValue(scrollOffset); } - void scrollToOffsets(int hOffset, int vOffset) { + @Override + public void scroll(int hOffset, int vOffset) { if (myAccumulateViewportChanges) { myAccumulatedXOffset = hOffset; myAccumulatedYOffset = vOffset; @@ -431,7 +432,7 @@ public class ScrollingModelImpl implements ScrollingModelEx { public void flushViewportChanges() { myAccumulateViewportChanges = false; if (myAccumulatedXOffset >= 0 && myAccumulatedYOffset >= 0) { - scrollToOffsets(myAccumulatedXOffset, myAccumulatedYOffset); + scroll(myAccumulatedXOffset, myAccumulatedYOffset); myAccumulatedXOffset = myAccumulatedYOffset = -1; cancelAnimatedScrolling(true); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentScrollingModel.java b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentScrollingModel.java index e68f4d8e2b3d..f04394abe9dd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentScrollingModel.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentScrollingModel.java @@ -97,6 +97,11 @@ public class TextComponentScrollingModel implements ScrollingModel { throw new UnsupportedOperationException("Not implemented"); } + @Override + public void scroll(int horizontalOffset, int verticalOffset) { + throw new UnsupportedOperationException("Not implemented"); + } + @Override public void addVisibleAreaListener(@NotNull final VisibleAreaListener listener) { throw new UnsupportedOperationException("Not implemented");