From 9ceaf5b931d44f15cb2d5b28bd5cdf1718a9bf5f Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 1 Jul 2022 16:02:22 +0200 Subject: [PATCH] IDEA-297124 diff: prefer code navigation inside active diff editor Fix "Jump to Source" from diff in "Local Changes" - it should navigate to the main editor. Fix regression after d366a295b5ccd07d2df8f01b9ccba7c1b669d4b3 GitOrigin-RevId: 2902aace9c5ded1ecf0ead81eff3f5359d013544 --- .../diff/actions/impl/OpenInEditorAction.java | 9 +++++---- .../openapi/fileEditor/FileNavigatorImpl.java | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/OpenInEditorAction.java b/platform/diff-impl/src/com/intellij/diff/actions/impl/OpenInEditorAction.java index ceca314c860d..716199c4811f 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/impl/OpenInEditorAction.java +++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/OpenInEditorAction.java @@ -10,6 +10,8 @@ import com.intellij.ide.actions.EditSourceAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.actionSystem.ex.ActionUtil; +import com.intellij.openapi.fileEditor.FileNavigator; +import com.intellij.openapi.fileEditor.FileNavigatorImpl; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.pom.Navigatable; @@ -76,12 +78,11 @@ public class OpenInEditorAction extends EditSourceAction implements DumbAware { } public void openEditor(@NotNull Project project, Navigatable @NotNull [] navigatables) { + FileNavigatorImpl fileNavigator = (FileNavigatorImpl)FileNavigator.getInstance(); + boolean success = false; for (Navigatable navigatable : navigatables) { - if (navigatable.canNavigate()) { - navigatable.navigate(true); - success = true; - } + success |= fileNavigator.navigateIgnoringContextEditor(navigatable); } if (success) onAfterEditorOpened(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/FileNavigatorImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/FileNavigatorImpl.java index 9c34c9f03a31..056bbd56d8aa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/FileNavigatorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/FileNavigatorImpl.java @@ -14,6 +14,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -21,6 +23,8 @@ import java.util.List; import static com.intellij.openapi.fileEditor.OpenFileDescriptor.unfoldCurrentLine; public class FileNavigatorImpl implements FileNavigator { + private final ThreadLocal myIgnoreContextEditor = new ThreadLocal<>(); + @Override public boolean canNavigate(@NotNull OpenFileDescriptor descriptor) { VirtualFile file = descriptor.getFile(); @@ -79,6 +83,7 @@ public class FileNavigatorImpl implements FileNavigator { } private boolean navigateInRequestedEditor(@NotNull OpenFileDescriptor descriptor) { + if (myIgnoreContextEditor.get() == Boolean.TRUE) return false; @SuppressWarnings("deprecation") DataContext ctx = DataManager.getInstance().getDataContext(); Editor e = OpenFileDescriptor.NAVIGATE_IN_EDITOR.getData(ctx); if (e == null) return false; @@ -103,4 +108,17 @@ public class FileNavigatorImpl implements FileNavigator { } return !editors.isEmpty(); } + + @ApiStatus.Experimental + public boolean navigateIgnoringContextEditor(@NotNull Navigatable navigatable) { + if (!navigatable.canNavigate()) return false; + myIgnoreContextEditor.set(Boolean.TRUE); + try { + navigatable.navigate(true); + } + finally { + myIgnoreContextEditor.set(null); + } + return true; + } }