From ba352e9fe7850008ae2a2374ebc8282d79d13a64 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Tue, 1 Feb 2011 16:59:36 +0300 Subject: [PATCH] IDEA-64710 Tab switching loses scrolling position when virtual space is within the view area Remembering virtual page height in order to keep viewport position on editor tabs switch --- .../openapi/editor/impl/EditorImpl.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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 d2fd544fa3ad..817d9c403aad 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 @@ -222,6 +222,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi private boolean myIsColumnMode = false; private Color myForcedBackground = null; private Dimension myPreferredSize; + private int myVirtualPageHeight; private Runnable myGutterSizeUpdater = null; private boolean myGutterNeedsUpdate = false; private Alarm myAppleRepaintAlarm; @@ -2903,7 +2904,24 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (isOneLineMode()) return new Dimension(size.width, getLineHeight()); if (mySettings.isAdditionalPageAtBottom()) { int lineHeight = getLineHeight(); - return new Dimension(size.width, size.height + Math.max(getScrollingModel().getVisibleArea().height - 2 * lineHeight, lineHeight)); + int visibleAreaHeight = getScrollingModel().getVisibleArea().height; + int virtualPageHeight; + // There is a possible case that user with 'show additional page at bottom' scrolls to that virtual page; switched to another + // editor (another tab); and then returns to the previously used editor (the one scrolled to virtual page). We want to preserve + // correct view size then because viewport position is set to the end of the original text otherwise. + if (visibleAreaHeight <= 0 && myVirtualPageHeight > 0) { + virtualPageHeight = myVirtualPageHeight; + } + else { + myVirtualPageHeight = virtualPageHeight = Math.max(visibleAreaHeight - 2 * lineHeight, lineHeight); + } + + if (myVirtualPageHeight > 0) { + return new Dimension(size.width, size.height + virtualPageHeight); + } + else { + return size; + } } return getContentSize();