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 extends AbstractTreeNode> 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;
+ }
+}