diff --git a/platform/lang-api/src/com/intellij/execution/dashboard/DashboardGroupingRule.java b/platform/lang-api/src/com/intellij/execution/dashboard/DashboardGroupingRule.java index 87dd77fe0bc7..f65785bb5277 100644 --- a/platform/lang-api/src/com/intellij/execution/dashboard/DashboardGroupingRule.java +++ b/platform/lang-api/src/com/intellij/execution/dashboard/DashboardGroupingRule.java @@ -17,10 +17,12 @@ package com.intellij.execution.dashboard; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.ide.util.treeView.smartTree.TreeAction; +import com.intellij.openapi.extensions.ExtensionPointName; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; +import java.util.Comparator; import java.util.List; /** @@ -29,6 +31,24 @@ import java.util.List; * @author konstantin.aleev */ public interface DashboardGroupingRule extends TreeAction { + ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.runtimeDashboardGroupingRule"); + + Comparator PRIORITY_COMPARATOR = (o1, o2) -> { + final int res = o2.getPriority() - o1.getPriority(); + return res != 0 ? res : (o1.getName().compareTo(o2.getName())); + }; + + /** + * Grouping rules are ordered and applied to dashboard nodes according to their priority. + * @return Rule's priority. + */ + int getPriority(); + + /** + * @return {@code true} if grouping rule should always be applied to dashboard nodes. + */ + boolean isAlwaysEnable(); + /** * @return A list of groups which should be shown in the tree even if they do not contain any nodes. */ @@ -43,4 +63,10 @@ public interface DashboardGroupingRule extends TreeAction { */ @Nullable DashboardGroup getGroup(AbstractTreeNode node); + + interface Priorities { + int BY_FOLDER = 200; + int BY_STATUS = 800; + int BY_TYPE = 1000; + } } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardContent.java b/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardContent.java index 919f30098409..565584f43189 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardContent.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardContent.java @@ -295,7 +295,7 @@ public class RuntimeDashboardContent extends JPanel implements TreeContent, Disp rightGroup.add(collapseAllAction); rightGroup.add(new Separator()); - myGroupers.forEach(grouper -> rightGroup.add(new GroupAction(grouper))); + myGroupers.stream().filter(grouper -> !grouper.getRule().isAlwaysEnable()).forEach(grouper -> rightGroup.add(new GroupAction(grouper))); ActionToolbar rightActionToolBar = ActionManager.getInstance().createActionToolbar(PLACE_TOOLBAR, rightGroup, false); toolBarPanel.add(rightActionToolBar.getComponent()); diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardManagerImpl.java index 34d520838feb..5afd1aa0ac21 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/RuntimeDashboardManagerImpl.java @@ -15,10 +15,7 @@ */ package com.intellij.execution.dashboard; -import com.intellij.execution.dashboard.tree.ConfigurationTypeDashboardGroupingRule; import com.intellij.execution.dashboard.tree.DashboardGrouper; -import com.intellij.execution.dashboard.tree.FolderDashboardGroupingRule; -import com.intellij.execution.dashboard.tree.StatusDashboardGroupingRule; import com.intellij.icons.AllIcons; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.PersistentStateComponent; @@ -41,6 +38,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -65,9 +63,10 @@ public class RuntimeDashboardManagerImpl implements RuntimeDashboardManager, Per project, true); toolWindow.setIcon(getToolWindowIcon()); if (!ApplicationManager.getApplication().isUnitTestMode()) { - myGroupers.add(new DashboardGrouper(new ConfigurationTypeDashboardGroupingRule())); - myGroupers.add(new DashboardGrouper(new StatusDashboardGroupingRule())); - myGroupers.add(new DashboardGrouper(new FolderDashboardGroupingRule())); + myGroupers = Arrays.stream(DashboardGroupingRule.EP_NAME.getExtensions()) + .sorted(DashboardGroupingRule.PRIORITY_COMPARATOR) + .map(DashboardGrouper::new) + .collect(Collectors.toList()); RuntimeDashboardContent dashboardContent = new RuntimeDashboardContent(project, myContentManager, myGroupers); Content content = contentFactory.createContent(dashboardContent, null, false); @@ -101,7 +100,9 @@ public class RuntimeDashboardManagerImpl implements RuntimeDashboardManager, Per @Override public State getState() { State state = new State(); - state.ruleStates = myGroupers.stream().map(grouper -> new RuleState(grouper.getRule().getName(), grouper.isEnabled())) + state.ruleStates = myGroupers.stream() + .filter(grouper -> !grouper.getRule().isAlwaysEnable()) + .map(grouper -> new RuleState(grouper.getRule().getName(), grouper.isEnabled())) .collect(Collectors.toList()); return state; } @@ -110,7 +111,7 @@ public class RuntimeDashboardManagerImpl implements RuntimeDashboardManager, Per public void loadState(State state) { state.ruleStates.forEach(ruleState -> { for (DashboardGrouper grouper : myGroupers) { - if (grouper.getRule().getName().equals(ruleState.name)) { + if (grouper.getRule().getName().equals(ruleState.name) && !grouper.getRule().isAlwaysEnable()) { grouper.setEnabled(ruleState.enabled); return; } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeAction.java b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeAction.java index 5409df0e032c..d04a2d491191 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeAction.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeAction.java @@ -36,6 +36,6 @@ public abstract class RuntimeDashboardTreeAction extend @Override protected boolean isVisibleForAnySelection(@NotNull AnActionEvent e) { - return false; + return true; } } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeLeafAction.java b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeLeafAction.java index 729db3c6a565..65c5cf7112b4 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeLeafAction.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RuntimeDashboardTreeLeafAction.java @@ -46,12 +46,7 @@ public abstract class RuntimeDashboardTreeLeafAction ex if (!(o instanceof AbstractTreeNode)) { return Collections.emptySet(); } - AbstractTreeNode node = (AbstractTreeNode)o; - if (node instanceof GroupingNode && node.getChildren().isEmpty()) { - // Action could not be performed if current selection contains empty grouping nodes - return Collections.emptySet(); - } - nodes.add(node); + nodes.add((AbstractTreeNode)o); } return getLeaves(nodes); } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/ConfigurationTypeDashboardGroupingRule.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/ConfigurationTypeDashboardGroupingRule.java index 7ba9ec5d5f2a..8900389f9b40 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/ConfigurationTypeDashboardGroupingRule.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/ConfigurationTypeDashboardGroupingRule.java @@ -49,6 +49,16 @@ public class ConfigurationTypeDashboardGroupingRule implements DashboardGrouping AllIcons.Actions.GroupByFile); } + @Override + public int getPriority() { + return Priorities.BY_TYPE; + } + + @Override + public boolean isAlwaysEnable() { + return false; + } + @Nullable @Override public DashboardGroup getGroup(AbstractTreeNode node) { diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/FolderDashboardGroupingRule.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/FolderDashboardGroupingRule.java index ca220eb478ef..b287c2d1391b 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/FolderDashboardGroupingRule.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/FolderDashboardGroupingRule.java @@ -48,6 +48,16 @@ public class FolderDashboardGroupingRule implements DashboardGroupingRule { AllIcons.Actions.GroupByPackage); } + @Override + public int getPriority() { + return Priorities.BY_FOLDER; + } + + @Override + public boolean isAlwaysEnable() { + return true; + } + @Nullable @Override public DashboardGroup getGroup(AbstractTreeNode node) { diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/StatusDashboardGroupingRule.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/StatusDashboardGroupingRule.java index a7d3df515355..705a766c9905 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/StatusDashboardGroupingRule.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/StatusDashboardGroupingRule.java @@ -16,9 +16,7 @@ package com.intellij.execution.dashboard.tree; import com.intellij.execution.ExecutionBundle; -import com.intellij.execution.dashboard.DashboardGroup; -import com.intellij.execution.dashboard.DashboardGroupingRule; -import com.intellij.execution.dashboard.DashboardRunConfigurationNode; +import com.intellij.execution.dashboard.*; import com.intellij.icons.AllIcons; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.ide.util.treeView.smartTree.ActionPresentation; @@ -52,6 +50,16 @@ public class StatusDashboardGroupingRule implements DashboardGroupingRule { AllIcons.Actions.GroupByPrefix); // TODO [konstantin.aleev] provide new icon } + @Override + public int getPriority() { + return Priorities.BY_STATUS; + } + + @Override + public boolean isAlwaysEnable() { + return false; + } + @NotNull @Override public List getPermanentGroups() { diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index 5fa964c3dc85..450d26052853 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -461,6 +461,8 @@ + diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index ae158e48c760..c4b2e0f9a57a 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -951,7 +951,12 @@ + + + + +