RunDashboard: do not tie contributor to configuration type

- rename contributor to customizer and cleanup
- implement common presentation customizer for SMTRunners (IDEA-188662)
- implement common double click handler for Java based configurations
This commit is contained in:
Konstantin Aleev
2019-03-27 13:40:25 +03:00
parent 30321316aa
commit d969c2dc28
17 changed files with 264 additions and 174 deletions
@@ -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);
}
}
@@ -688,6 +688,8 @@
<runLineMarkerContributor language="JAVA" id="applicationRunLineMarkerProvider"
implementationClass="com.intellij.execution.application.ApplicationRunLineMarkerProvider"/>
<runDashboardCustomizer implementation="com.intellij.execution.CommonJavaRunDashboardCustomizer" id="commonJavaCustomizer"/>
<javaExpressionSurrounder implementation="com.intellij.debugger.codeinsight.JavaWithRuntimeCastSurrounder"/>
<exceptionFilter implementation="com.intellij.execution.filters.ExceptionBaseFilterFactory"/>
@@ -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<RunDashboardContributor> 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;
}
}
@@ -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;
}
}
@@ -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<String> types);
@Nullable
RunDashboardContributor getContributor(@NotNull ConfigurationType type);
@NotNull
List<RunDashboardCustomizer> getCustomizers(@NotNull RunnerAndConfigurationSettings settings, @Nullable RunContentDescriptor descriptor);
@NotNull
Condition<Content> getReuseCondition();
@@ -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<RunDashboardCustomizer> getCustomizers();
@NotNull
RunDashboardRunConfigurationStatus getStatus();
@@ -39,7 +39,7 @@ public class RunConfigurationsServiceViewContributor
public List<RunConfigurationNode> 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;
};
};
}
@@ -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;
@@ -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<RunDashboardManagerImpl.State> {
private static final ExtensionPointName<RunDashboardCustomizer> 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<RunDashboardCustomizer> getCustomizers(@NotNull RunnerAndConfigurationSettings settings,
@Nullable RunContentDescriptor descriptor) {
List<RunDashboardCustomizer> 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);
}
}
@@ -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<Pair<RunnerAndConfigurationSettings, Content>>
implements RunDashboardRunConfigurationNode {
@Nullable private final RunDashboardContributor myContributor;
private final List<RunDashboardCustomizer> myCustomizers;
private final UserDataHolder myUserDataHolder = new UserDataHolderBase();
public RunConfigurationNode(Project project, @NotNull Pair<RunnerAndConfigurationSettings, RunContentDescriptor> value,
@Nullable RunDashboardContributor contributor) {
@NotNull List<RunDashboardCustomizer> 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<Pair<RunnerAndConfigu
}
presentation.setIcon(isStored ? icon : IconLoader.getDisabledIcon(icon));
if (myContributor != null) {
myContributor.updatePresentation(presentation, this);
for (RunDashboardCustomizer customizer : myCustomizers) {
if (customizer.updatePresentation(presentation, this)) {
return;
}
}
}
@@ -123,16 +126,22 @@ public class RunConfigurationNode extends AbstractTreeNode<Pair<RunnerAndConfigu
myUserDataHolder.putUserData(key, value);
}
@Nullable
@NotNull
@Override
public RunDashboardContributor getContributor() {
return myContributor;
public List<RunDashboardCustomizer> 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
@@ -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<Pair<RunDashboardHyperlinkTextComponent, RunDashboardHyperlinkIconComponent>> 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<RunDashboardHyperlinkTextComponent, RunDashboardHyperlinkIconComponent> 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);
@@ -79,7 +79,7 @@ public class RunDashboardTreeStructure extends AbstractTreeStructureBase {
public Collection<? extends AbstractTreeNode> getChildren() {
RunDashboardManager runDashboardManager = RunDashboardManager.getInstance(myProject);
List<RunConfigurationNode> 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());
@@ -492,8 +492,8 @@
<with attribute="implementationClass" implements="com.intellij.execution.lineMarker.RunLineMarkerContributor"/>
</extensionPoint>
<extensionPoint name="runDashboardContributor"
interface="com.intellij.execution.dashboard.RunDashboardContributor"/>
<extensionPoint name="runDashboardCustomizer"
interface="com.intellij.execution.dashboard.RunDashboardCustomizer"/>
<extensionPoint name="runDashboardGroupingRule"
interface="com.intellij.execution.dashboard.RunDashboardGroupingRule"/>
<extensionPoint name="serviceViewContributor"
@@ -564,6 +564,9 @@
<sdkType implementation="com.intellij.openapi.projectRoots.SimpleJavaSdkType"/>
<runDashboardCustomizer implementation="com.intellij.execution.testframework.sm.runner.SMTRunnerRunDashboardCustomizer"
order="first" id="smtRunnerCustomizer"/>
<!--context providers-->
<tasks.contextProvider implementation="com.intellij.tasks.context.OpenEditorsContextProvider"/>
<tasks.contextProvider implementation="com.intellij.tasks.context.ProjectViewContextProvider"/>
@@ -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;
}
}
+2 -1
View File
@@ -95,7 +95,8 @@
groupBundle="messages.InspectionsBundle" groupKey="group.names.junit.issues" enabledByDefault="true" level="WARNING"
implementationClass="com.intellij.execution.junit.codeInsight.JUnit5MalformedNestedClassInspection"/>
<runDashboardContributor implementation="com.intellij.execution.junit.JUnitRunDashboardContributor"/>
<runDashboardCustomizer implementation="com.intellij.execution.junit.JUnitRunDashboardCustomizer"
order="before commonJavaCustomizer"/>
</extensions>
<extensionPoints>
@@ -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;
}
}