diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/FocusOppositePaneAction.java b/platform/diff-impl/src/com/intellij/diff/actions/impl/FocusOppositePaneAction.java
index 84e99cc783b9..3415e681255f 100644
--- a/platform/diff-impl/src/com/intellij/diff/actions/impl/FocusOppositePaneAction.java
+++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/FocusOppositePaneAction.java
@@ -15,18 +15,23 @@
*/
package com.intellij.diff.actions.impl;
-import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.actionSystem.CustomShortcutSet;
-import com.intellij.openapi.actionSystem.ShortcutSet;
+import com.intellij.openapi.actionSystem.EmptyAction;
import com.intellij.openapi.project.DumbAware;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
public class FocusOppositePaneAction extends AnAction implements DumbAware {
+ protected final boolean myScrollToPosition;
+
public FocusOppositePaneAction() {
+ this(false);
+ }
+
+ public FocusOppositePaneAction(boolean scrollToPosition) {
+ myScrollToPosition = scrollToPosition;
setEnabledInModalContext(true);
}
@@ -35,8 +40,8 @@ public class FocusOppositePaneAction extends AnAction implements DumbAware {
throw new UnsupportedOperationException();
}
- public void setupAction(@NotNull JComponent component, @NotNull Disposable disposable) {
- ShortcutSet shortcutSet = CustomShortcutSet.fromString("control TAB"); // TODO: allow to change shortcut
- registerCustomShortcutSet(shortcutSet, component, disposable);
+ public void setupAction(@NotNull JComponent component) {
+ String action = myScrollToPosition ? "Diff.FocusOppositePaneAndScroll" : "Diff.FocusOppositePane";
+ EmptyAction.setupAction(this, action, component);
}
}
\ No newline at end of file
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 51fc0d7f4da7..f682a5ed86a6 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
@@ -108,7 +108,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
myStatusPanel = new MyStatusPanel();
- new MyFocusOppositePaneAction().setupAction(myPanel, this);
+ new MyFocusOppositePaneAction().setupAction(myPanel);
installEditorListeners();
diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java
index 57774f6f6d99..97b302c7ad69 100644
--- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java
+++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java
@@ -819,12 +819,12 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
return getTextSettings().isEnableSyncScroll();
}
- public int transfer(@NotNull Side side, int line) {
+ public int transfer(@NotNull Side baseSide, int line) {
if (myDiffChanges.isEmpty()) {
return line;
}
- return super.transfer(side, line);
+ return super.transfer(baseSide, line);
}
@Override
diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/BaseSyncScrollable.java b/platform/diff-impl/src/com/intellij/diff/tools/util/BaseSyncScrollable.java
index f02380b50839..e546c5f298e0 100644
--- a/platform/diff-impl/src/com/intellij/diff/tools/util/BaseSyncScrollable.java
+++ b/platform/diff-impl/src/com/intellij/diff/tools/util/BaseSyncScrollable.java
@@ -29,8 +29,8 @@ public abstract class BaseSyncScrollable implements SyncScrollSupport.SyncScroll
*/
protected abstract void processHelper(@NotNull ScrollHelper helper);
- public int transfer(@NotNull Side side, int line) {
- ScrollHelper helper = new ScrollHelper(side, line);
+ public int transfer(@NotNull Side baseSide, int line) {
+ ScrollHelper helper = new ScrollHelper(baseSide, line);
processHelper(helper);
int master1 = helper.getMaster1();
diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java b/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java
index dbaffab0a4eb..68788e3b9030 100644
--- a/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java
+++ b/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java
@@ -35,7 +35,7 @@ public class SyncScrollSupport {
boolean isSyncScrollEnabled();
@CalledInAwt
- int transfer(@NotNull Side side, int line);
+ int transfer(@NotNull Side baseSide, int line);
}
public static class TwosideSyncScrollSupport {
@@ -73,6 +73,15 @@ public class SyncScrollSupport {
myDuringSyncScroll = false;
}
}
+
+ @NotNull
+ public SyncScrollable getScrollable() {
+ return myScrollable;
+ }
+
+ public boolean isDuringSyncScroll() {
+ return myDuringSyncScroll;
+ }
}
public static class ThreesideSyncScrollSupport {
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 96689115da21..0e37c71bbb47 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
@@ -109,7 +109,8 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
myPanel = new TwosideTextDiffPanel(this, myContentPanel, this, context);
- new MyFocusOppositePaneAction().setupAction(myPanel, this);
+ new MyFocusOppositePaneAction(true).setupAction(myPanel);
+ new MyFocusOppositePaneAction(false).setupAction(myPanel);
myEditorSettingsAction = new MySetEditorSettingsAction();
myEditorSettingsAction.applyDefaults();
@@ -315,6 +316,14 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
// Abstract
//
+ @CalledInAwt
+ @NotNull
+ protected LogicalPosition transferPosition(@NotNull Side baseSide, @NotNull LogicalPosition position) {
+ if (mySyncScrollListener == null) return position;
+ int line = mySyncScrollListener.getScrollable().transfer(baseSide, position.line);
+ return new LogicalPosition(line, position.column);
+ }
+
@CalledInAwt
protected void scrollToLine(@NotNull Side side, int line) {
Editor editor = side.select(myEditor1, myEditor2);
@@ -388,10 +397,21 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
//
private class MyFocusOppositePaneAction extends FocusOppositePaneAction {
+ public MyFocusOppositePaneAction(boolean scrollToPosition) {
+ super(scrollToPosition);
+ }
+
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
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());
+ targetEditor.getCaretModel().moveToLogicalPosition(position);
+ }
+
myCurrentSide = myCurrentSide.other();
myPanel.requestFocus();
getCurrentEditor().getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
diff --git a/platform/platform-resources-en/src/messages/ActionsBundle.properties b/platform/platform-resources-en/src/messages/ActionsBundle.properties
index 090327bf29ee..ba924d074f3c 100644
--- a/platform/platform-resources-en/src/messages/ActionsBundle.properties
+++ b/platform/platform-resources-en/src/messages/ActionsBundle.properties
@@ -1221,7 +1221,10 @@ action.VcsHistory.ShowAllAffected.description=Show all changes made in the chose
action.AddFrameworkSupport.text=Add Framework Support...
-action.Diff.FocusOppositePane.text=Select opposite pane in diff view
+action.Diff.FocusOppositePane.text=Select Opposite Diff Pane
+action.Diff.FocusOppositePane.description=Select opposite pane in diff view
+action.Diff.FocusOppositePaneAndScroll.text=Select Position In Opposite Diff Pane
+action.Diff.FocusOppositePaneAndScroll.description=Select the same position in opposite pane in diff view
action.Diff.PrevChange.text=Compare Previous File
action.Diff.NextChange.text=Compare Next File
action.Diff.SelectedChange.text=Choose File To Compare
diff --git a/platform/platform-resources/src/idea/Keymap_Default.xml b/platform/platform-resources/src/idea/Keymap_Default.xml
index 5ce4479f0491..1e5154284f9e 100644
--- a/platform/platform-resources/src/idea/Keymap_Default.xml
+++ b/platform/platform-resources/src/idea/Keymap_Default.xml
@@ -547,6 +547,12 @@
+
+
+
+
+
+
diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml
index 30ed1acea257..339d402bca62 100644
--- a/platform/platform-resources/src/idea/PlatformActions.xml
+++ b/platform/platform-resources/src/idea/PlatformActions.xml
@@ -162,7 +162,9 @@
-
+
+
+
diff --git a/platform/testFramework/testSrc/com/intellij/openapi/keymap/KeymapsTestCase.java b/platform/testFramework/testSrc/com/intellij/openapi/keymap/KeymapsTestCase.java
index 4dd45a7df4ba..172811192142 100644
--- a/platform/testFramework/testSrc/com/intellij/openapi/keymap/KeymapsTestCase.java
+++ b/platform/testFramework/testSrc/com/intellij/openapi/keymap/KeymapsTestCase.java
@@ -132,6 +132,8 @@ public abstract class KeymapsTestCase extends PlatformTestCase {
{ "shift control U", "ShelveChanges.UnshelveWithDialog", "EditorToggleCase"},
{ "control E", "RecentFiles", "Vcs.ShowMessageHistory"},
{ "control alt Z", "Vcs.RollbackChangedLines", "ChangesView.Revert"},
+ { "control TAB", "Switcher", "Diff.FocusOppositePane"},
+ { "shift control TAB", "Switcher", "Diff.FocusOppositePaneAndScroll"},
});
put("Mac OS X 10.5+", new String[][] {
{ "F5", "CopyElement", "Console.TableResult.Reload", "UML.ApplyCurrentLayout"},