mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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();
|
||||
|
||||
+4
-3
@@ -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();
|
||||
|
||||
+7
-3
@@ -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;
|
||||
|
||||
+16
-15
@@ -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
-10
@@ -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
|
||||
|
||||
+33
-9
@@ -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);
|
||||
|
||||
+1
-1
@@ -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"/>
|
||||
|
||||
+12
-44
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user