diff --git a/java/execution/impl/src/com/intellij/execution/CommonJavaRunDashboardCustomizer.java b/java/execution/impl/src/com/intellij/execution/CommonJavaRunDashboardCustomizer.java new file mode 100644 index 000000000000..fa73fa0d9635 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/CommonJavaRunDashboardCustomizer.java @@ -0,0 +1,56 @@ +// Copyright 2000-2019 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.execution; + +import com.intellij.execution.configurations.JavaRunConfigurationModule; +import com.intellij.execution.configurations.ModuleBasedConfiguration; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.configurations.RunConfigurationModule; +import com.intellij.execution.dashboard.RunDashboardCustomizer; +import com.intellij.execution.dashboard.RunDashboardRunConfigurationNode; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.psi.PsiClass; +import com.intellij.util.PsiNavigateUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.event.MouseEvent; + +public class CommonJavaRunDashboardCustomizer extends RunDashboardCustomizer { + @Override + public boolean isApplicable(@NotNull RunnerAndConfigurationSettings settings, @Nullable RunContentDescriptor descriptor) { + RunConfiguration runConfiguration = settings.getConfiguration(); + return runConfiguration instanceof SingleClassConfiguration || + (runConfiguration instanceof CommonJavaRunConfigurationParameters && + runConfiguration instanceof ModuleBasedConfiguration && + ((ModuleBasedConfiguration)runConfiguration).getConfigurationModule() instanceof JavaRunConfigurationModule); + } + + @Override + public boolean handleDoubleClick(@NotNull MouseEvent event, @NotNull RunDashboardRunConfigurationNode node) { + PsiClass mainClass = findMainClass(node.getConfigurationSettings().getConfiguration()); + if (mainClass == null || !mainClass.isValid()) return false; + + PsiNavigateUtil.navigate(mainClass); + return true; + } + + @Nullable + private static PsiClass findMainClass(@NotNull RunConfiguration runConfiguration) { + if (runConfiguration instanceof SingleClassConfiguration) { + return ((SingleClassConfiguration)runConfiguration).getMainClass(); + } + + if (!(runConfiguration instanceof CommonJavaRunConfigurationParameters) || + !(runConfiguration instanceof ModuleBasedConfiguration)) { + return null; + } + + RunConfigurationModule configurationModule = ((ModuleBasedConfiguration)runConfiguration).getConfigurationModule(); + if (!(configurationModule instanceof JavaRunConfigurationModule)) return null; + + String runClassName = ((CommonJavaRunConfigurationParameters)runConfiguration).getRunClass(); + if (runClassName == null) return null; + + return ((JavaRunConfigurationModule)configurationModule).findClass(runClassName); + } +} diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index 4142f8c066a2..51033885a2ef 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -688,6 +688,8 @@ + + diff --git a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardContributor.java b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardContributor.java deleted file mode 100644 index 3533b5f29d51..000000000000 --- a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardContributor.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2000-2016 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.execution.dashboard; - -import com.intellij.execution.configurations.ConfigurationType; -import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.ide.projectView.PresentationData; -import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.ui.ColoredTreeCellRenderer; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; - -/** - * In order to show run configurations of the specific configuration type in Run Dashboard tool window, - * one should register this extension. - * - * @author konstantin.aleev - */ -@ApiStatus.Experimental -public abstract class RunDashboardContributor { - public static final ExtensionPointName EP_NAME = - ExtensionPointName.create("com.intellij.runDashboardContributor"); - - @NotNull private final ConfigurationType myType; - - protected RunDashboardContributor(@NotNull ConfigurationType type) { - myType = type; - } - - /** - * @return configuration type for which contributor is registered. - */ - @NotNull - public ConfigurationType getType() { - return myType; - } - - public void updatePresentation(@NotNull PresentationData presentation, @NotNull RunDashboardNode node) { - } - - public boolean customizeCellRenderer(@NotNull ColoredTreeCellRenderer cellRenderer, @NotNull JLabel nodeLabel, - @NotNull RunDashboardNode node, - boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { - return false; - } - - /** - * Returns node's status. Subclasses may override this method to provide custom statuses. - * - * @param node dashboard node - * @return node's status. Returned status is used for grouping nodes by status. - */ - @NotNull - public RunDashboardRunConfigurationStatus getStatus(@NotNull RunDashboardRunConfigurationNode node) { - return RunDashboardRunConfigurationStatus.getStatus(node); - } - - public boolean isShowInDashboard(@NotNull RunConfiguration runConfiguration) { - return true; - } - - public boolean handleDoubleClick(@NotNull RunConfiguration runConfiguration) { - return false; - } -} diff --git a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardCustomizer.java b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardCustomizer.java new file mode 100644 index 000000000000..c9edce478fbc --- /dev/null +++ b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardCustomizer.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2016 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.execution.dashboard; + +import com.intellij.execution.RunnerAndConfigurationSettings; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.ide.projectView.PresentationData; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.event.MouseEvent; + +/** + * Register this extension to customize Run Dashboard. + */ +@ApiStatus.Experimental +public abstract class RunDashboardCustomizer { + public abstract boolean isApplicable(@NotNull RunnerAndConfigurationSettings settings, @Nullable RunContentDescriptor descriptor); + + public boolean updatePresentation(@NotNull PresentationData presentation, @NotNull RunDashboardRunConfigurationNode node) { + return false; + } + + /** + * Returns node's status. Subclasses may override this method to provide custom statuses. + * + * @param node dashboard node + * @return node's status. Returned status is used for grouping nodes by status. + */ + @Nullable + public RunDashboardRunConfigurationStatus getStatus(@NotNull RunDashboardRunConfigurationNode node) { + return null; + } + + public boolean handleDoubleClick(@NotNull MouseEvent event, @NotNull RunDashboardRunConfigurationNode node) { + return false; + } +} diff --git a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardManager.java b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardManager.java index 00063ade7e4f..bd0f5117fa64 100644 --- a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardManager.java +++ b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardManager.java @@ -16,7 +16,6 @@ package com.intellij.execution.dashboard; import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.configurations.ConfigurationType; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.components.ServiceManager; @@ -79,8 +78,8 @@ public interface RunDashboardManager { void setTypes(Set types); - @Nullable - RunDashboardContributor getContributor(@NotNull ConfigurationType type); + @NotNull + List getCustomizers(@NotNull RunnerAndConfigurationSettings settings, @Nullable RunContentDescriptor descriptor); @NotNull Condition getReuseCondition(); diff --git a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardRunConfigurationNode.java b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardRunConfigurationNode.java index 916daabf6ff3..b8901c720857 100644 --- a/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardRunConfigurationNode.java +++ b/platform/lang-api/src/com/intellij/execution/dashboard/RunDashboardRunConfigurationNode.java @@ -18,7 +18,8 @@ package com.intellij.execution.dashboard; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.openapi.util.UserDataHolder; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; + +import java.util.List; /** * @author konstantin.aleev @@ -27,8 +28,8 @@ public interface RunDashboardRunConfigurationNode extends RunDashboardNode, User @NotNull RunnerAndConfigurationSettings getConfigurationSettings(); - @Nullable - RunDashboardContributor getContributor(); + @NotNull + List getCustomizers(); @NotNull RunDashboardRunConfigurationStatus getStatus(); diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/RunConfigurationsServiceViewContributor.java b/platform/lang-impl/src/com/intellij/execution/dashboard/RunConfigurationsServiceViewContributor.java index caf4576f8b02..006cbf2e0229 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/RunConfigurationsServiceViewContributor.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/RunConfigurationsServiceViewContributor.java @@ -39,7 +39,7 @@ public class RunConfigurationsServiceViewContributor public List getNodes(@NotNull Project project) { RunDashboardManager runDashboardManager = RunDashboardManager.getInstance(project); return ContainerUtil.map(runDashboardManager.getRunConfigurations(), - value -> new RunConfigurationNode(project, value, runDashboardManager.getContributor(value.first.getType()))); + value -> new RunConfigurationNode(project, value, runDashboardManager.getCustomizers(value.first, value.second))); } @NotNull @@ -113,8 +113,12 @@ public class RunConfigurationsServiceViewContributor @Override public boolean handleDoubleClick(@NotNull MouseEvent event) { - RunDashboardContributor contributor = node.getContributor(); - return contributor != null && contributor.handleDoubleClick(node.getConfigurationSettings().getConfiguration()); + for (RunDashboardCustomizer customizer : node.getCustomizers()) { + if (customizer.handleDoubleClick(event, node)) { + return true; + } + } + return false; }; }; } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardContent.java b/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardContent.java index 9582f4d324d5..e028d5c95050 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardContent.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardContent.java @@ -218,9 +218,10 @@ public class RunDashboardContent extends JPanel implements TreeContent, Disposab protected boolean onDoubleClick(MouseEvent event) { if (myLastSelection instanceof RunDashboardRunConfigurationNode && myLastSelection.getChildren().isEmpty()) { RunDashboardRunConfigurationNode node = (RunDashboardRunConfigurationNode)myLastSelection; - RunDashboardContributor contributor = node.getContributor(); - if (contributor != null) { - return contributor.handleDoubleClick(node.getConfigurationSettings().getConfiguration()); + for (RunDashboardCustomizer customizer : node.getCustomizers()) { + if (customizer.handleDoubleClick(event, node)) { + return true; + } } } return false; diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardManagerImpl.java index c05b908d68a4..975e30333ef9 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardManagerImpl.java @@ -2,7 +2,6 @@ package com.intellij.execution.dashboard; import com.intellij.execution.*; -import com.intellij.execution.configurations.ConfigurationType; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.dashboard.tree.RunConfigurationNode; import com.intellij.execution.dashboard.tree.RunDashboardGrouper; @@ -20,6 +19,7 @@ import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StoragePathMacros; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; @@ -55,6 +55,8 @@ import java.util.concurrent.atomic.AtomicBoolean; storages = @Storage(StoragePathMacros.WORKSPACE_FILE) ) public class RunDashboardManagerImpl implements RunDashboardManager, PersistentStateComponent { + private static final ExtensionPointName EP_NAME = + ExtensionPointName.create("com.intellij.runDashboardCustomizer"); private static final float DEFAULT_CONTENT_PROPORTION = 0.3f; @NonNls private static final String HELP_ID = "run-dashboard.reference"; @@ -177,7 +179,7 @@ public class RunDashboardManagerImpl implements RunDashboardManager, PersistentS RunnerAndConfigurationSettings configurationSettings = ContainerUtil.getFirstItem(configurationsSettings); if (configurationSettings != null) { RunConfigurationNode node = new RunConfigurationNode(myProject, Pair.create(configurationSettings, contentDescriptor), - getContributor(configurationSettings.getType())); + getCustomizers(configurationSettings, contentDescriptor)); ServiceViewManager.getInstance(myProject).selectNode(node, true, false); } } @@ -325,12 +327,7 @@ public class RunDashboardManagerImpl implements RunDashboardManager, PersistentS @Override public boolean isShowInDashboard(@NotNull RunConfiguration runConfiguration) { - if (myState.configurationTypes.contains(runConfiguration.getType().getId())) { - RunDashboardContributor contributor = getContributor(runConfiguration.getType()); - return contributor == null || contributor.isShowInDashboard(runConfiguration); - } - - return false; + return myState.configurationTypes.contains(runConfiguration.getType().getId()); } @Override @@ -350,18 +347,22 @@ public class RunDashboardManagerImpl implements RunDashboardManager, PersistentS } @Override - @Nullable - public RunDashboardContributor getContributor(@NotNull ConfigurationType type) { - for (RunDashboardContributor contributor : RunDashboardContributor.EP_NAME.getExtensions()) { - if (type.equals(contributor.getType())) { - return contributor; + @NotNull + public List getCustomizers(@NotNull RunnerAndConfigurationSettings settings, + @Nullable RunContentDescriptor descriptor) { + List customizers = ContainerUtil.newSmartList(); + for (RunDashboardCustomizer customizer : EP_NAME.getExtensions()) { + if (customizer.isApplicable(settings, descriptor)) { + customizers.add(customizer); } } - return null; + return customizers; } private void updateDashboardIfNeeded(@Nullable RunnerAndConfigurationSettings settings) { - if (settings != null && (getContributor(settings.getType()) != null || isShowInDashboard(settings.getConfiguration()))) { + if (settings != null && + (isShowInDashboard(settings.getConfiguration()) || + !filterByContent(ExecutionManagerImpl.getInstance(myProject).getDescriptors(s -> settings.equals(s))).isEmpty())) { updateDashboard(true); } } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java index ce52ebada57a..3e3397b5ee0b 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java @@ -19,7 +19,7 @@ import com.intellij.execution.Executor; import com.intellij.execution.RunManager; import com.intellij.execution.RunManagerEx; import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.dashboard.RunDashboardContributor; +import com.intellij.execution.dashboard.RunDashboardCustomizer; import com.intellij.execution.dashboard.RunDashboardRunConfigurationNode; import com.intellij.execution.dashboard.RunDashboardRunConfigurationStatus; import com.intellij.execution.ui.RunContentDescriptor; @@ -36,6 +36,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Collection; import java.util.Collections; +import java.util.List; /** * @author konstantin.aleev @@ -43,13 +44,13 @@ import java.util.Collections; public class RunConfigurationNode extends AbstractTreeNode> implements RunDashboardRunConfigurationNode { - @Nullable private final RunDashboardContributor myContributor; + private final List myCustomizers; private final UserDataHolder myUserDataHolder = new UserDataHolderBase(); public RunConfigurationNode(Project project, @NotNull Pair value, - @Nullable RunDashboardContributor contributor) { + @NotNull List customizers) { super(project, Pair.create(value.first, value.second == null ? null : value.second.getAttachedContent())); - myContributor = contributor; + myCustomizers = customizers; } @Override @@ -101,8 +102,10 @@ public class RunConfigurationNode extends AbstractTreeNode getCustomizers() { + return myCustomizers; } @NotNull @Override public RunDashboardRunConfigurationStatus getStatus() { - return myContributor != null ? myContributor.getStatus(this) : RunDashboardRunConfigurationStatus.getStatus(this); + for (RunDashboardCustomizer customizer : myCustomizers) { + RunDashboardRunConfigurationStatus status = customizer.getStatus(this); + if (status != null) { + return status; + } + } + return RunDashboardRunConfigurationStatus.getStatus(this); } @Nullable diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeCellRenderer.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeCellRenderer.java index 068e84d347f3..bd6001b3ae4c 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeCellRenderer.java @@ -1,13 +1,19 @@ // Copyright 2000-2018 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.execution.dashboard.tree; -import com.intellij.execution.dashboard.RunDashboardContributor; import com.intellij.execution.dashboard.RunDashboardGroup; import com.intellij.execution.dashboard.RunDashboardRunConfigurationNode; +import com.intellij.execution.dashboard.hyperlink.RunDashboardHyperlinkComponent; +import com.intellij.execution.dashboard.hyperlink.RunDashboardHyperlinkIconComponent; +import com.intellij.execution.dashboard.hyperlink.RunDashboardHyperlinkTextComponent; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.util.treeView.NodeRenderer; import com.intellij.navigation.ItemPresentation; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; import com.intellij.ui.ColoredTreeCellRenderer; +import com.intellij.util.ui.EmptyIcon; +import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.Nullable; @@ -22,6 +28,9 @@ import java.awt.event.MouseEvent; * @author Konstantin Aleev */ public class RunDashboardTreeCellRenderer extends JPanel implements TreeCellRenderer { + public static final Key> NODE_LINKS = + new Key<>("RunDashboardNodeLink"); + private final ColoredTreeCellRenderer myNodeRender = new NodeRenderer() { @Nullable @Override @@ -50,18 +59,33 @@ public class RunDashboardTreeCellRenderer extends JPanel implements TreeCellRend boolean hasFocus) { myNodeRender.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); RunDashboardRunConfigurationNode node = TreeUtil.getUserObject(RunDashboardRunConfigurationNode.class, value); - if (node != null) { - RunDashboardContributor contributor = node.getContributor(); - if (contributor != null) { - if (contributor.customizeCellRenderer(myNodeRender, myLabel, node, selected, expanded, leaf, row, hasFocus)) { - this.add(myNodeRender, BorderLayout.CENTER); - return this; - } - } + if (node != null && customizeCellRenderer(tree, node, selected)) { + this.add(myNodeRender, BorderLayout.CENTER); + return this; } return myNodeRender; } + private boolean customizeCellRenderer(JTree tree, RunDashboardRunConfigurationNode node, boolean selected) { + Pair links = node.getUserData(NODE_LINKS); + if (links == null || links.first.getText().isEmpty()) return false; + + links.first.setSelected(selected); + links.first.render(myNodeRender); + + myLabel.setText(null); + if (selected || node.equals(UIUtil.getClientProperty(tree, RunDashboardHyperlinkComponent.AIMED_OBJECT))) { + myLabel.setIcon(links.second); + } + else { + // Use empty icon to avoid node's preferred size changes depending on a node state. + myLabel.setIcon(EmptyIcon.ICON_16); + } + myLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2)); + + return true; + } + @Override public String getToolTipText(MouseEvent event) { return myNodeRender.getToolTipText(event); diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeStructure.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeStructure.java index d30c1181d501..cf138339b846 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeStructure.java @@ -79,7 +79,7 @@ public class RunDashboardTreeStructure extends AbstractTreeStructureBase { public Collection getChildren() { RunDashboardManager runDashboardManager = RunDashboardManager.getInstance(myProject); List nodes = runDashboardManager.getRunConfigurations().stream() - .map(value -> new RunConfigurationNode(myProject, value, runDashboardManager.getContributor(value.first.getType()))) + .map(value -> new RunConfigurationNode(myProject, value, runDashboardManager.getCustomizers(value.first, value.second))) .filter(node -> myFilters.stream().allMatch(filter -> filter.isVisible(node))) .collect(Collectors.toList()); diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index b23719fa1478..1c40383f098d 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -492,8 +492,8 @@ - + + + diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitRunDashboardContributor.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerRunDashboardCustomizer.java similarity index 70% rename from plugins/junit/src/com/intellij/execution/junit/JUnitRunDashboardContributor.java rename to platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerRunDashboardCustomizer.java index 1c1fb66dc0a8..f35702aab8a9 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitRunDashboardContributor.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerRunDashboardCustomizer.java @@ -1,10 +1,9 @@ -// Copyright 2000-2017 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.execution.junit; +// Copyright 2000-2019 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.execution.testframework.sm.runner; -import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.dashboard.*; import com.intellij.execution.testframework.TestsUIUtil; -import com.intellij.execution.testframework.sm.runner.SMTestProxy; import com.intellij.execution.testframework.sm.runner.ui.SMTRunnerConsoleView; import com.intellij.execution.testframework.sm.runner.ui.SMTestRunnerResultsForm; import com.intellij.execution.testframework.sm.runner.ui.TestTreeRenderer; @@ -13,37 +12,30 @@ import com.intellij.execution.ui.ExecutionConsole; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.ide.projectView.PresentationData; import com.intellij.openapi.progress.util.ColorProgressBar; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiMethod; import com.intellij.ui.SimpleTextAttributes; -import com.intellij.util.PsiNavigateUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -/** - * @author Konstantin Aleev - */ -public class JUnitRunDashboardContributor extends RunDashboardContributor { +public class SMTRunnerRunDashboardCustomizer extends RunDashboardCustomizer { private static final SimpleTextAttributes IGNORE_ATTRIBUTES = new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, ColorProgressBar.YELLOW); private static final SimpleTextAttributes ERROR_ATTRIBUTES = new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, ColorProgressBar.RED_TEXT); - public JUnitRunDashboardContributor() { - super(JUnitConfigurationType.getInstance()); + @Override + public boolean isApplicable(@NotNull RunnerAndConfigurationSettings settings, @Nullable RunContentDescriptor descriptor) { + return descriptor != null && descriptor.getExecutionConsole() instanceof SMTRunnerConsoleView; } @Override - public void updatePresentation(@NotNull PresentationData presentation, @NotNull RunDashboardNode node) { - if (!(node instanceof RunDashboardRunConfigurationNode)) return; - + public boolean updatePresentation(@NotNull PresentationData presentation, @NotNull RunDashboardRunConfigurationNode node) { boolean animated = false; try { RunContentDescriptor descriptor = node.getDescriptor(); - if (descriptor == null) return; + if (descriptor == null) return false; ExecutionConsole executionConsole = descriptor.getExecutionConsole(); - if (!(executionConsole instanceof SMTRunnerConsoleView)) return; + if (!(executionConsole instanceof SMTRunnerConsoleView)) return false; SMTestRunnerResultsForm resultsViewer = ((SMTRunnerConsoleView)executionConsole).getResultsViewer(); animated = resultsViewer.isRunning(); @@ -72,6 +64,7 @@ public class JUnitRunDashboardContributor extends RunDashboardContributor { } } } + return true; } private static void addTestSummary(@NotNull PresentationData presentation, @NotNull SMTestProxy.SMRootTestProxy rootNode) { @@ -110,29 +103,4 @@ public class JUnitRunDashboardContributor extends RunDashboardContributor { presentation.addText(" of " + total +"]", SimpleTextAttributes.GRAYED_ATTRIBUTES); } - - @Override - public boolean handleDoubleClick(@NotNull RunConfiguration runConfiguration) { - if (!(runConfiguration instanceof JUnitConfiguration)) return false; - - JUnitConfiguration jUnitConfiguration = (JUnitConfiguration)runConfiguration; - - String runClassName = jUnitConfiguration.getRunClass(); - if (runClassName == null) return false; - - PsiClass runClass = jUnitConfiguration.getConfigurationModule().findClass(runClassName); - if (runClass == null) return false; - - PsiElement psiElement = runClass; - String testMethod = jUnitConfiguration.getPersistentData().getMethodName(); - if (testMethod != null) { - PsiMethod[] methods = runClass.findMethodsByName(testMethod, false); - if (methods.length > 0) { - psiElement = methods[0]; - } - } - - PsiNavigateUtil.navigate(psiElement); - return true; - } } diff --git a/plugins/junit/src/META-INF/plugin.xml b/plugins/junit/src/META-INF/plugin.xml index 85f5424f4be4..d885e5b6e9bd 100644 --- a/plugins/junit/src/META-INF/plugin.xml +++ b/plugins/junit/src/META-INF/plugin.xml @@ -95,7 +95,8 @@ groupBundle="messages.InspectionsBundle" groupKey="group.names.junit.issues" enabledByDefault="true" level="WARNING" implementationClass="com.intellij.execution.junit.codeInsight.JUnit5MalformedNestedClassInspection"/> - + diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitRunDashboardCustomizer.java b/plugins/junit/src/com/intellij/execution/junit/JUnitRunDashboardCustomizer.java new file mode 100644 index 000000000000..8d36972e3115 --- /dev/null +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitRunDashboardCustomizer.java @@ -0,0 +1,49 @@ +// Copyright 2000-2017 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.execution.junit; + +import com.intellij.execution.RunnerAndConfigurationSettings; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.dashboard.RunDashboardCustomizer; +import com.intellij.execution.dashboard.RunDashboardRunConfigurationNode; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.util.PsiNavigateUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.event.MouseEvent; + +public class JUnitRunDashboardCustomizer extends RunDashboardCustomizer { + @Override + public boolean isApplicable(@NotNull RunnerAndConfigurationSettings settings, @Nullable RunContentDescriptor descriptor) { + return settings.getConfiguration() instanceof JUnitConfiguration; + } + + @Override + public boolean handleDoubleClick(@NotNull MouseEvent event, @NotNull RunDashboardRunConfigurationNode node) { + RunConfiguration runConfiguration = node.getConfigurationSettings().getConfiguration(); + if (!(runConfiguration instanceof JUnitConfiguration)) return false; + + JUnitConfiguration jUnitConfiguration = (JUnitConfiguration)runConfiguration; + + String runClassName = jUnitConfiguration.getRunClass(); + if (runClassName == null) return false; + + PsiClass runClass = jUnitConfiguration.getConfigurationModule().findClass(runClassName); + if (runClass == null) return false; + + PsiElement psiElement = runClass; + String testMethod = jUnitConfiguration.getPersistentData().getMethodName(); + if (testMethod != null) { + PsiMethod[] methods = runClass.findMethodsByName(testMethod, false); + if (methods.length > 0) { + psiElement = methods[0]; + } + } + + PsiNavigateUtil.navigate(psiElement); + return true; + } +}