diff --git a/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java b/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java index 7159c7fa7c51..73e14f088b14 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java +++ b/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java @@ -1,6 +1,7 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.lightEdit; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.project.Project; @@ -61,4 +62,7 @@ public interface LightEditService { */ void saveNewDocuments(); + boolean isTabNavigationAvailable(@NotNull AnAction navigationAction); + + void navigateToTab(@NotNull AnAction navigationAction); } diff --git a/platform/platform-impl/src/com/intellij/ide/actions/NextTabAction.java b/platform/platform-impl/src/com/intellij/ide/actions/NextTabAction.java index b57b586236bf..302a03d239bc 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/NextTabAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/NextTabAction.java @@ -3,6 +3,6 @@ package com.intellij.ide.actions; import com.intellij.ide.lightEdit.LightEditCompatible; -final class NextTabAction extends TabNavigationActionBase implements LightEditCompatible { +public final class NextTabAction extends TabNavigationActionBase implements LightEditCompatible { public NextTabAction () { super (NavigationType.NEXT); } } diff --git a/platform/platform-impl/src/com/intellij/ide/actions/TabNavigationActionBase.java b/platform/platform-impl/src/com/intellij/ide/actions/TabNavigationActionBase.java index 8544bac72b36..94b61b0dfe03 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/TabNavigationActionBase.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/TabNavigationActionBase.java @@ -1,6 +1,8 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.actions; +import com.intellij.ide.lightEdit.LightEdit; +import com.intellij.ide.lightEdit.LightEditService; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.diagnostic.Logger; @@ -36,6 +38,11 @@ abstract class TabNavigationActionBase extends AnAction implements DumbAware { return; } + if (LightEdit.owns(project)) { + LightEditService.getInstance().navigateToTab(this); + return; + } + ToolWindowManager windowManager = ToolWindowManager.getInstance(project); if (windowManager.isEditorComponentActive()) { @@ -51,6 +58,12 @@ abstract class TabNavigationActionBase extends AnAction implements DumbAware { Presentation presentation = event.getPresentation(); DataContext dataContext = event.getDataContext(); Project project = CommonDataKeys.PROJECT.getData(dataContext); + + if (LightEdit.owns(project)) { + presentation.setEnabled(LightEditService.getInstance().isTabNavigationAvailable(this)); + return; + } + presentation.setEnabled(false); if (project == null || project.isDisposed()) { return; diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java index d9964abde343..476f7f6c0dd7 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java @@ -2,9 +2,12 @@ package com.intellij.ide.lightEdit; import com.intellij.ide.AppLifecycleListener; +import com.intellij.ide.actions.NextTabAction; +import com.intellij.ide.actions.PreviousTabAction; import com.intellij.ide.lightEdit.project.LightEditProjectManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ApplicationManager; @@ -513,4 +516,14 @@ public final class LightEditServiceImpl implements LightEditService, } } } + + @Override + public boolean isTabNavigationAvailable(@NotNull AnAction navigationAction) { + return getEditPanel().getTabs().isTabNavigationAvailable(navigationAction); + } + + @Override + public void navigateToTab(@NotNull AnAction navigationAction) { + getEditPanel().getTabs().navigateToTab(navigationAction); + } } diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditTabs.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditTabs.java index 8ebee89a6c18..dac1344ea33b 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditTabs.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditTabs.java @@ -4,13 +4,12 @@ package com.intellij.ide.lightEdit; import com.intellij.icons.AllIcons; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.CloseAction; +import com.intellij.ide.actions.NextTabAction; +import com.intellij.ide.actions.PreviousTabAction; import com.intellij.ide.lightEdit.project.LightEditFileEditorManagerImpl; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.ActionPlaces; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; @@ -18,6 +17,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorColorsListener; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.impl.EditorComponentImpl; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; @@ -41,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.*; import java.awt.event.InputEvent; import java.util.Collection; import java.util.Collections; @@ -400,4 +401,42 @@ final class LightEditTabs extends JBEditorTabs implements LightEditorListener, C } return null; } + + boolean isTabNavigationAvailable(@NotNull AnAction navigationAction) { + if (getTabCount() > 1) { + Component focusOwner = FocusManager.getCurrentManager().getFocusOwner(); + if (focusOwner instanceof EditorComponentImpl) { + int currIndex = getIndexOf(getSelectedInfo()); + if (currIndex >= 0) { + if (navigationAction instanceof PreviousTabAction) { + return currIndex > 0; + } + else if (navigationAction instanceof NextTabAction) { + return currIndex < getTabCount() - 1; + } + } + } + } + return false; + } + + void navigateToTab(@NotNull AnAction navigationAction) { + int currIndex = getIndexOf(getSelectedInfo()); + if (currIndex >= 0) { + if (navigationAction instanceof PreviousTabAction) { + if (currIndex > 0) { + currIndex --; + TabInfo newInfo = getTabAt(currIndex); + select(newInfo, true); + } + } + else if (navigationAction instanceof NextTabAction) { + if (currIndex < getTabCount() - 1) { + currIndex ++; + TabInfo newInfo = getTabAt(currIndex); + select(newInfo, true); + } + } + } + } }