summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java66
1 files changed, 38 insertions, 28 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java
index f6cd904c9503..3bc3e90b81b3 100644
--- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java
+++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java
@@ -136,16 +136,13 @@ public class SyncScrollSupport implements Disposable {
Editor slaveEditor = sidesContainer.getEditor(masterSide.otherSide());
if (slaveEditor == null) return;
- ScrollingModel scrollingModel = slaveEditor.getScrollingModel();
- scrollingModel.disableAnimation();
- scrollingModel.scrollHorizontally(newScrollOffset);
- scrollingModel.enableAnimation();
+ doScrollHorizontally(slaveEditor.getScrollingModel(), newScrollOffset);
}
private static void syncVerticalScroll(@NotNull ScrollingContext context,
@NotNull Rectangle newRectangle,
@NotNull Rectangle oldRectangle) {
- if (newRectangle.y == oldRectangle.y && newRectangle.height == oldRectangle.height) return;
+ if (newRectangle.y == oldRectangle.y) return;
EditingSides sidesContainer = context.getSidesContainer();
FragmentSide masterSide = context.getMasterSide();
FragmentSide masterDiffSide = context.getMasterDiffSide();
@@ -155,42 +152,55 @@ public class SyncScrollSupport implements Disposable {
if (master == null || slave == null) return;
+ int masterVerticalScrollOffset = master.getScrollingModel().getVerticalScrollOffset();
+ int slaveVerticalScrollOffset = slave.getScrollingModel().getVerticalScrollOffset();
+
Rectangle viewRect = master.getScrollingModel().getVisibleArea();
int middleY = viewRect.height / 3;
- int masterVerticalScrollOffset = getScrollOffset(master);
- int slaveVerticalScrollOffset = getScrollOffset(slave);
+ if (master.getDocument().getTextLength() == 0) return;
LogicalPosition masterPos = master.xyToLogicalPosition(new Point(viewRect.x, masterVerticalScrollOffset + middleY));
int masterCenterLine = masterPos.line;
- if (masterCenterLine > master.getDocument().getLineCount()) {
- masterCenterLine = master.getDocument().getLineCount();
+ int scrollToLine = sidesContainer.getLineBlocks().transform(masterDiffSide, masterCenterLine);
+
+ int offset;
+ if (scrollToLine < 0) {
+ offset = slaveVerticalScrollOffset + newRectangle.y - oldRectangle.y;
}
- int scrollToLine = sidesContainer.getLineBlocks().transform(masterDiffSide, masterCenterLine) + 1;
- int actualLine = scrollToLine - 1;
+ else {
+ int correction = (masterVerticalScrollOffset + middleY) % master.getLineHeight();
+ Point point = slave.logicalPositionToXY(new LogicalPosition(scrollToLine, masterPos.column));
+ offset = point.y - middleY + correction;
+ }
+
+ int deltaHeaderOffset = getHeaderOffset(slave) - getHeaderOffset(master);
+ doScrollVertically(slave.getScrollingModel(), offset + deltaHeaderOffset);
+ }
+ private static int getHeaderOffset(@NotNull final Editor editor) {
+ final JComponent header = editor.getHeaderComponent();
+ return header == null ? 0 : header.getHeight();
+ }
- slave.getScrollingModel().disableAnimation();
+ private static void doScrollVertically(@NotNull ScrollingModel model, int offset) {
+ model.disableAnimation();
try {
- if (scrollToLine <= 0) {
- int offset = newRectangle.y - oldRectangle.y;
- slave.getScrollingModel().scrollVertically(slaveVerticalScrollOffset + offset);
- }
- else {
- int correction = (masterVerticalScrollOffset + middleY) % master.getLineHeight();
- Point point = slave.logicalPositionToXY(new LogicalPosition(actualLine, masterPos.column));
- slave.getScrollingModel().scrollVertically(point.y - middleY + correction);
- }
- } finally {
- slave.getScrollingModel().enableAnimation();
+ model.scrollVertically(offset);
+ }
+ finally {
+ model.enableAnimation();
}
}
- private static int getScrollOffset(@NotNull final Editor editor) {
- final JComponent header = editor.getHeaderComponent();
- int headerOffset = header == null ? 0 : header.getHeight();
-
- return editor.getScrollingModel().getVerticalScrollOffset() - headerOffset;
+ private static void doScrollHorizontally(@NotNull ScrollingModel model, int offset) {
+ model.disableAnimation();
+ try {
+ model.scrollHorizontally(offset);
+ }
+ finally {
+ model.enableAnimation();
+ }
}
public static void scrollEditor(@NotNull Editor editor, int logicalLine) {