From edd72f64a3eb2206358f26c1d10b154a5125c749 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 6 Apr 2015 19:55:44 +0300 Subject: [PATCH] diff: extract common focus tracking logic --- .../diff/tools/binary/BinaryDiffViewer.java | 79 ++------ .../diff/tools/util/FocusTrackerSupport.java | 188 ++++++++++++++++++ .../threeside/ThreesideTextDiffViewer.java | 55 ++--- .../util/twoside/TwosideTextDiffViewer.java | 63 ++---- 4 files changed, 234 insertions(+), 151 deletions(-) create mode 100644 platform/diff-impl/src/com/intellij/diff/tools/util/FocusTrackerSupport.java diff --git a/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java index 5b6fec5aaec2..eea633f3c40e 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java @@ -24,10 +24,10 @@ import com.intellij.diff.contents.FileContent; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.tools.util.DiffNotifications; +import com.intellij.diff.tools.util.FocusTrackerSupport; import com.intellij.diff.tools.util.SimpleDiffPanel; import com.intellij.diff.tools.util.StatusPanel; import com.intellij.diff.tools.util.base.ListenerDiffViewerBase; -import com.intellij.diff.util.DiffUserDataKeys; import com.intellij.diff.util.DiffUtil; import com.intellij.diff.util.Side; import com.intellij.openapi.Disposable; @@ -61,8 +61,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -79,10 +77,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { @Nullable private final FileEditorProvider myEditorProvider1; @Nullable private final FileEditorProvider myEditorProvider2; - @Nullable private final MyEditorFocusListener myEditorFocusListener1; - @Nullable private final MyEditorFocusListener myEditorFocusListener2; - - @NotNull private Side myCurrentSide = Side.LEFT; + @NotNull private final FocusTrackerSupport.TwosideFocusTrackerSupport myFocusTrackerSupport; public BinaryDiffViewer(@NotNull DiffContext context, @NotNull DiffRequest request) { super(context, (ContentDiffRequest)request); @@ -96,16 +91,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { myEditorProvider2 = editors.second.second; assert myEditor1 != null || myEditor2 != null; - if (myEditor1 != null && myEditor2 != null) { - myEditorFocusListener1 = new MyEditorFocusListener(Side.LEFT); - myEditorFocusListener2 = new MyEditorFocusListener(Side.RIGHT); - } - else { - myEditorFocusListener1 = null; - myEditorFocusListener2 = null; - } - - + myFocusTrackerSupport = new FocusTrackerSupport.TwosideFocusTrackerSupport(myEditor1, myEditor2); myContentPanel = new BinaryContentPanel(titlePanel, myEditor1, myEditor2); myPanel = new SimpleDiffPanel(myContentPanel, this, context); @@ -113,15 +99,10 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { myStatusPanel = new MyStatusPanel(); new MyFocusOppositePaneAction().setupAction(myPanel); - - - installEditorListeners(); } - @Override @CalledInAwt public void onDispose() { - destroyEditorListeners(); destroyEditors(); super.onDispose(); } @@ -130,25 +111,14 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { @CalledInAwt protected void processContextHints() { super.processContextHints(); - if (myEditor1 == null) { - myCurrentSide = Side.RIGHT; - } - else if (myEditor2 == null) { - myCurrentSide = Side.LEFT; - } - else { - Side side = myContext.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE); - if (side != null) myCurrentSide = side; - } + myFocusTrackerSupport.processContextHints(myRequest, myContext); } @Override @CalledInAwt protected void updateContextHints() { super.updateContextHints(); - if (myEditor1 != null && myEditor2 != null) { - myContext.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE, myCurrentSide); - } + myFocusTrackerSupport.updateContextHints(myRequest, myContext); } // @@ -222,20 +192,6 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { } } - private void installEditorListeners() { - if (myEditor1 != null && myEditor2 != null) { - myEditor1.getComponent().addFocusListener(myEditorFocusListener1); - myEditor2.getComponent().addFocusListener(myEditorFocusListener2); - } - } - - private void destroyEditorListeners() { - if (myEditor1 != null && myEditor2 != null) { - myEditor1.getComponent().removeFocusListener(myEditorFocusListener1); - myEditor2.getComponent().removeFocusListener(myEditorFocusListener2); - } - } - // // Diff // @@ -364,8 +320,12 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { } @NotNull - Side getCurrentSide() { - return myCurrentSide; + public Side getCurrentSide() { + return myFocusTrackerSupport.getCurrentSide(); + } + + public void setCurrentSide(@NotNull Side side) { + myFocusTrackerSupport.setCurrentSide(side); } @Nullable @@ -447,7 +407,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { @Override public void actionPerformed(@NotNull AnActionEvent e) { assert myEditor1 != null && myEditor2 != null; - myCurrentSide = myCurrentSide.other(); + setCurrentSide(getCurrentSide().other()); myPanel.requestFocus(); } @@ -465,7 +425,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { @Override public Object getData(@NonNls String dataId) { if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { - return DiffUtil.getVirtualFile(myRequest, myCurrentSide); + return DiffUtil.getVirtualFile(myRequest, getCurrentSide()); } return super.getData(dataId); } @@ -476,17 +436,4 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { return -1; } } - - private class MyEditorFocusListener extends FocusAdapter { - @NotNull private final Side mySide; - - private MyEditorFocusListener(@NotNull Side side) { - mySide = side; - } - - public void focusGained(FocusEvent e) { - if (myEditor1 == null || myEditor2 == null) return; - myCurrentSide = mySide; - } - } } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/FocusTrackerSupport.java b/platform/diff-impl/src/com/intellij/diff/tools/util/FocusTrackerSupport.java new file mode 100644 index 000000000000..49030bed6851 --- /dev/null +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/FocusTrackerSupport.java @@ -0,0 +1,188 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.diff.tools.util; + +import com.intellij.diff.DiffContext; +import com.intellij.diff.requests.DiffRequest; +import com.intellij.diff.util.DiffUserDataKeys; +import com.intellij.diff.util.Side; +import com.intellij.diff.util.ThreeSide; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileEditor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.util.List; + +public class FocusTrackerSupport { + public static class TwosideFocusTrackerSupport { + @NotNull private Side myCurrentSide; + + private final boolean myDumbMode; + @Nullable private final MyFocusListener myListener1; + @Nullable private final MyFocusListener myListener2; + + public TwosideFocusTrackerSupport(@Nullable Editor editor1, @Nullable Editor editor2) { + this(getComponent(editor1), getComponent(editor2)); + } + + public TwosideFocusTrackerSupport(@Nullable FileEditor editor1, @Nullable FileEditor editor2) { + this(getComponent(editor1), getComponent(editor2)); + } + + public TwosideFocusTrackerSupport(@Nullable JComponent component1, @Nullable JComponent component2) { + assert component1 != null || component2 != null; + myCurrentSide = component2 != null ? Side.RIGHT : Side.LEFT; + + myDumbMode = component1 == null || component2 == null; + if (!myDumbMode) { + myListener1 = new MyFocusListener(Side.LEFT); + component1.addFocusListener(myListener1); + + myListener2 = new MyFocusListener(Side.RIGHT); + component2.addFocusListener(myListener2); + } + else { + myListener1 = null; + myListener2 = null; + } + } + + @NotNull + public Side getCurrentSide() { + return myCurrentSide; + } + + public void setCurrentSide(@NotNull Side side) { + if (myDumbMode) return; + myCurrentSide = side; + } + + public void processContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) { + Side side = context.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE); + if (side != null) setCurrentSide(side); + } + + public void updateContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) { + if (myDumbMode) return; + context.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE, myCurrentSide); + } + + private class MyFocusListener extends FocusAdapter { + @NotNull private final Side mySide; + + private MyFocusListener(@NotNull Side side) { + mySide = side; + } + + public void focusGained(FocusEvent e) { + myCurrentSide = mySide; + } + } + } + + public static class ThreesideFocusTrackerSupport { + @NotNull private ThreeSide myCurrentSide; + + private final boolean myDumbMode; + @Nullable private final MyFocusListener myListener1; + @Nullable private final MyFocusListener myListener2; + @Nullable private final MyFocusListener myListener3; + + public ThreesideFocusTrackerSupport(@NotNull List editors) { + this(editors.get(0), editors.get(1), editors.get(2)); + } + + public ThreesideFocusTrackerSupport(@Nullable Editor editor1, @Nullable Editor editor2, @Nullable Editor editor3) { + this(getComponent(editor1), getComponent(editor2), getComponent(editor3)); + } + + public ThreesideFocusTrackerSupport(@Nullable FileEditor editor1, @Nullable FileEditor editor2, @Nullable FileEditor editor3) { + this(getComponent(editor1), getComponent(editor2), getComponent(editor3)); + } + + public ThreesideFocusTrackerSupport(@Nullable JComponent component1, @Nullable JComponent component2, @Nullable JComponent component3) { + assert component1 != null || component2 != null || component3 != null; + myCurrentSide = component2 != null ? ThreeSide.BASE : component1 != null ? ThreeSide.LEFT : ThreeSide.RIGHT; + + boolean c1 = component1 != null; + boolean c2 = component2 != null; + boolean c3 = component3 != null; + myDumbMode = (!c1 && !c2) || (!c1 && !c3) || (!c2 && !c3); // only one not-null element + + if (!myDumbMode) { + myListener1 = component1 != null ? new MyFocusListener(ThreeSide.LEFT) : null; + if (component1 != null) component1.addFocusListener(myListener1); + + myListener2 = component2 != null ? new MyFocusListener(ThreeSide.BASE) : null; + if (component2 != null) component2.addFocusListener(myListener2); + + myListener3 = component3 != null ? new MyFocusListener(ThreeSide.RIGHT) : null; + if (component3 != null) component3.addFocusListener(myListener3); + } + else { + myListener1 = null; + myListener2 = null; + myListener3 = null; + } + } + + @NotNull + public ThreeSide getCurrentSide() { + return myCurrentSide; + } + + public void setCurrentSide(@NotNull ThreeSide side) { + if (myDumbMode || side.select(myListener1, myListener2, myListener3) == null) return; + myCurrentSide = side; + } + + public void processContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) { + ThreeSide side = context.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE); + if (side != null) setCurrentSide(side); + } + + public void updateContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) { + if (myDumbMode) return; + context.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE, myCurrentSide); + } + + private class MyFocusListener extends FocusAdapter { + @NotNull private final ThreeSide mySide; + + private MyFocusListener(@NotNull ThreeSide side) { + mySide = side; + } + + public void focusGained(FocusEvent e) { + myCurrentSide = mySide; + } + } + } + + @Nullable + private static JComponent getComponent(@Nullable Editor editor) { + return editor != null ? editor.getContentComponent() : null; + } + + @Nullable + private static JComponent getComponent(@Nullable FileEditor editor) { + return editor != null ? editor.getComponent() : null; + } +} diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java index 86eb56b42e7c..7c87c653daf8 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java @@ -24,12 +24,12 @@ import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.requests.SimpleDiffRequest; import com.intellij.diff.tools.util.DiffDataKeys; +import com.intellij.diff.tools.util.FocusTrackerSupport.ThreesideFocusTrackerSupport; import com.intellij.diff.tools.util.SimpleDiffPanel; import com.intellij.diff.tools.util.SyncScrollSupport; import com.intellij.diff.tools.util.SyncScrollSupport.ThreesideSyncScrollSupport; import com.intellij.diff.tools.util.base.InitialScrollPositionSupport; import com.intellij.diff.tools.util.base.TextDiffViewerBase; -import com.intellij.diff.util.DiffUserDataKeys; import com.intellij.diff.util.DiffUtil; import com.intellij.diff.util.Side; import com.intellij.diff.util.ThreeSide; @@ -55,8 +55,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; import java.util.ArrayList; import java.util.List; @@ -72,18 +70,14 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { @NotNull protected final List myActualContents; - @NotNull private final List myEditorFocusListeners = - ContainerUtil.newArrayList(new MyEditorFocusListener(ThreeSide.LEFT), - new MyEditorFocusListener(ThreeSide.BASE), - new MyEditorFocusListener(ThreeSide.RIGHT)); @NotNull private final MyVisibleAreaListener myVisibleAreaListener1 = new MyVisibleAreaListener(Side.LEFT); @NotNull private final MyVisibleAreaListener myVisibleAreaListener2 = new MyVisibleAreaListener(Side.RIGHT); @NotNull protected final MySetEditorSettingsAction myEditorSettingsAction; - @Nullable private ThreesideSyncScrollSupport mySyncScrollListener; + @NotNull private final ThreesideFocusTrackerSupport myFocusTrackerSupport; - @NotNull private ThreeSide myCurrentSide; + @Nullable private ThreesideSyncScrollSupport mySyncScrollListener; public ThreesideTextDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request) { super(context, request); @@ -97,8 +91,7 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { myEditors = createEditors(); List titlePanel = DiffUtil.createTextTitles(myRequest, myEditors); - myCurrentSide = ThreeSide.BASE; - + myFocusTrackerSupport = new ThreesideFocusTrackerSupport(myEditors); myContentPanel = new ThreesideTextContentPanel(myEditors, titlePanel); myPanel = new SimpleDiffPanel(myContentPanel, this, context); @@ -121,15 +114,14 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { @CalledInAwt protected void processContextHints() { super.processContextHints(); - ThreeSide side = myContext.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE); - if (side != null) myCurrentSide = side; + myFocusTrackerSupport.processContextHints(myRequest, myContext); } @Override @CalledInAwt protected void updateContextHints() { super.updateContextHints(); - myContext.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE, myCurrentSide); + myFocusTrackerSupport.updateContextHints(myRequest, myContext); } @NotNull @@ -168,9 +160,6 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { @Override protected void installEditorListeners() { super.installEditorListeners(); - for (int i = 0; i < 3; i++) { - myEditors.get(i).getContentComponent().addFocusListener(myEditorFocusListeners.get(i)); - } myEditors.get(0).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener1); myEditors.get(1).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener1); @@ -190,10 +179,6 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { public void destroyEditorListeners() { super.destroyEditorListeners(); - for (int i = 0; i < 3; i++) { - myEditors.get(i).getContentComponent().removeFocusListener(myEditorFocusListeners.get(i)); - } - myEditors.get(0).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener1); myEditors.get(1).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener1); @@ -238,12 +223,12 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { @NotNull public EditorEx getCurrentEditor() { - return myCurrentSide.select(myEditors); + return getCurrentSide().select(myEditors); } @NotNull public DocumentContent getCurrentContent() { - return myCurrentSide.select(myActualContents); + return getCurrentSide().select(myActualContents); } @NotNull @@ -254,7 +239,11 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { @NotNull public ThreeSide getCurrentSide() { - return myCurrentSide; + return myFocusTrackerSupport.getCurrentSide(); + } + + public void setCurrentSide(@NotNull ThreeSide side) { + myFocusTrackerSupport.setCurrentSide(side); } // @@ -265,7 +254,7 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { protected void scrollToLine(@NotNull ThreeSide side, int line) { Editor editor = side.select(myEditors); DiffUtil.scrollEditor(editor, line, false); - myCurrentSide = side; + setCurrentSide(side); } @Nullable @@ -365,26 +354,14 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { return getCurrentEditor(); } else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { - return DiffUtil.getVirtualFile(myRequest, myCurrentSide); + return DiffUtil.getVirtualFile(myRequest, getCurrentSide()); } else if (DiffDataKeys.CURRENT_CONTENT.is(dataId)) { return getCurrentContent(); } return super.getData(dataId); } - - private class MyEditorFocusListener extends FocusAdapter { - @NotNull private final ThreeSide mySide; - - private MyEditorFocusListener(@NotNull ThreeSide side) { - mySide = side; - } - - public void focusGained(FocusEvent e) { - myCurrentSide = mySide; - } - } - + private class MyVisibleAreaListener implements VisibleAreaListener { @NotNull Side mySide; diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java index c7109814f010..2c0058b9975f 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java @@ -24,12 +24,12 @@ import com.intellij.diff.contents.EmptyContent; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.tools.util.DiffDataKeys; +import com.intellij.diff.tools.util.FocusTrackerSupport.TwosideFocusTrackerSupport; import com.intellij.diff.tools.util.SimpleDiffPanel; import com.intellij.diff.tools.util.SyncScrollSupport; import com.intellij.diff.tools.util.SyncScrollSupport.TwosideSyncScrollSupport; import com.intellij.diff.tools.util.base.InitialScrollPositionSupport; import com.intellij.diff.tools.util.base.TextDiffViewerBase; -import com.intellij.diff.util.DiffUserDataKeys; import com.intellij.diff.util.DiffUtil; import com.intellij.diff.util.Side; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -52,8 +52,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; import java.util.Collections; import java.util.List; @@ -73,13 +71,11 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { @NotNull protected final MySetEditorSettingsAction myEditorSettingsAction; - @NotNull private final MyEditorFocusListener myEditorFocusListener1 = new MyEditorFocusListener(Side.LEFT); - @NotNull private final MyEditorFocusListener myEditorFocusListener2 = new MyEditorFocusListener(Side.RIGHT); @NotNull private final MyVisibleAreaListener myVisibleAreaListener = new MyVisibleAreaListener(); - @Nullable protected TwosideSyncScrollSupport mySyncScrollSupport; + @NotNull private final TwosideFocusTrackerSupport myFocusTrackerSupport; - @NotNull private Side myCurrentSide; + @Nullable protected TwosideSyncScrollSupport mySyncScrollSupport; public TwosideTextDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request) { super(context, request); @@ -97,8 +93,7 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { myEditor2 = editors.get(1); assert myEditor1 != null || myEditor2 != null; - myCurrentSide = myEditor1 == null ? Side.RIGHT : Side.LEFT; - + myFocusTrackerSupport = new TwosideFocusTrackerSupport(myEditor1, myEditor2); myContentPanel = new TwosideTextContentPanel(titlePanel, myEditor1, myEditor2); myPanel = new SimpleDiffPanel(myContentPanel, this, context); @@ -124,25 +119,14 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { @CalledInAwt protected void processContextHints() { super.processContextHints(); - if (myEditor1 == null) { - myCurrentSide = Side.RIGHT; - } - else if (myEditor2 == null) { - myCurrentSide = Side.LEFT; - } - else { - Side side = myContext.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE); - if (side != null) myCurrentSide = side; - } + myFocusTrackerSupport.processContextHints(myRequest, myContext); } @Override @CalledInAwt protected void updateContextHints() { super.updateContextHints(); - if (myEditor1 != null && myEditor2 != null) { - myContext.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE, myCurrentSide); - } + myFocusTrackerSupport.updateContextHints(myRequest, myContext); } @NotNull @@ -195,11 +179,9 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { protected void installEditorListeners() { super.installEditorListeners(); if (myEditor1 != null) { - myEditor1.getContentComponent().addFocusListener(myEditorFocusListener1); myEditor1.getScrollingModel().addVisibleAreaListener(myVisibleAreaListener); } if (myEditor2 != null) { - myEditor2.getContentComponent().addFocusListener(myEditorFocusListener2); myEditor2.getScrollingModel().addVisibleAreaListener(myVisibleAreaListener); } if (myEditor1 != null && myEditor2 != null) { @@ -215,11 +197,9 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { protected void destroyEditorListeners() { super.destroyEditorListeners(); if (myEditor1 != null) { - myEditor1.getContentComponent().removeFocusListener(myEditorFocusListener1); myEditor1.getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener); } if (myEditor2 != null) { - myEditor2.getContentComponent().removeFocusListener(myEditorFocusListener2); myEditor2.getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener); } mySyncScrollSupport = null; @@ -264,7 +244,11 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { @NotNull public Side getCurrentSide() { - return myCurrentSide; + return myFocusTrackerSupport.getCurrentSide(); + } + + public void setCurrentSide(@NotNull Side side) { + myFocusTrackerSupport.setCurrentSide(side); } @NotNull @@ -306,7 +290,7 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { Editor editor = side.select(myEditor1, myEditor2); if (editor == null) return; DiffUtil.scrollEditor(editor, line, false); - myCurrentSide = side; + setCurrentSide(side); } @Nullable @@ -365,13 +349,13 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { if (myEditor1 == null || myEditor2 == null) return; if (myScrollToPosition) { - EditorEx currentEditor = myCurrentSide.select(myEditor1, myEditor2); - EditorEx targetEditor = myCurrentSide.other().select(myEditor1, myEditor2); - LogicalPosition position = transferPosition(myCurrentSide, currentEditor.getCaretModel().getLogicalPosition()); + EditorEx currentEditor = getCurrentSide().select(myEditor1, myEditor2); + EditorEx targetEditor = getCurrentSide().other().select(myEditor1, myEditor2); + LogicalPosition position = transferPosition(getCurrentSide(), currentEditor.getCaretModel().getLogicalPosition()); targetEditor.getCaretModel().moveToLogicalPosition(position); } - myCurrentSide = myCurrentSide.other(); + setCurrentSide(getCurrentSide().other()); myPanel.requestFocus(); getCurrentEditor().getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); } @@ -406,25 +390,12 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { return getCurrentContent(); } else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { - return DiffUtil.getVirtualFile(myRequest, myCurrentSide); + return DiffUtil.getVirtualFile(myRequest, getCurrentSide()); } return super.getData(dataId); } - private class MyEditorFocusListener extends FocusAdapter { - @NotNull private final Side mySide; - - private MyEditorFocusListener(@NotNull Side side) { - mySide = side; - } - - public void focusGained(FocusEvent e) { - if (myEditor1 == null || myEditor2 == null) return; - myCurrentSide = mySide; - } - } - private class MyVisibleAreaListener implements VisibleAreaListener { @Override public void visibleAreaChanged(VisibleAreaEvent e) {