mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
diff: extract common focus tracking logic
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<T> {
|
||||
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<? extends Editor> 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;
|
||||
}
|
||||
}
|
||||
+16
-39
@@ -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<DocumentContent> myActualContents;
|
||||
|
||||
@NotNull private final List<MyEditorFocusListener> 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<JComponent> 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;
|
||||
|
||||
|
||||
+17
-46
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user