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"},