From bd337c151736186e55bd9b837d3e7a495c0c03a0 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Fri, 1 Jul 2016 12:00:43 +0300 Subject: [PATCH] usages view: regression: exclude/include action must be available only on UsagesNode-s and don't produce class cast exceptions IDEA-157266 --- .../ui/InspectionResultsView.java | 5 +++++ .../ide/actions/exclusion/ExclusionHandler.java | 2 ++ .../exclusion/TreeNodeExclusionAction.java | 1 + .../com/intellij/usages/impl/UsageViewImpl.java | 17 +++++++++++------ 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java index bf950aed295d..089dfe821ace 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java @@ -163,6 +163,11 @@ public class InspectionResultsView extends JPanel implements Disposable, Occuren }); add(mySplitter, BorderLayout.CENTER); myExclusionHandler = new ExclusionHandler() { + @Override + public boolean isNodeExclusionAvailable(@NotNull InspectionTreeNode node) { + return true; + } + @Override public boolean isNodeExcluded(@NotNull InspectionTreeNode node) { return node.isExcluded(myExcludedInspectionTreeNodesManager); diff --git a/platform/platform-api/src/com/intellij/ide/actions/exclusion/ExclusionHandler.java b/platform/platform-api/src/com/intellij/ide/actions/exclusion/ExclusionHandler.java index d208e93daef0..102a1e492e2f 100644 --- a/platform/platform-api/src/com/intellij/ide/actions/exclusion/ExclusionHandler.java +++ b/platform/platform-api/src/com/intellij/ide/actions/exclusion/ExclusionHandler.java @@ -26,6 +26,8 @@ import javax.swing.tree.MutableTreeNode; public interface ExclusionHandler { DataKey EXCLUSION_HANDLER = DataKey.create("tree.exclusion.handler"); + boolean isNodeExclusionAvailable(@NotNull T node); + boolean isNodeExcluded(@NotNull T node); void excludeNode(@NotNull T node); diff --git a/platform/platform-api/src/com/intellij/ide/actions/exclusion/TreeNodeExclusionAction.java b/platform/platform-api/src/com/intellij/ide/actions/exclusion/TreeNodeExclusionAction.java index a5f2443f710d..62986773d869 100644 --- a/platform/platform-api/src/com/intellij/ide/actions/exclusion/TreeNodeExclusionAction.java +++ b/platform/platform-api/src/com/intellij/ide/actions/exclusion/TreeNodeExclusionAction.java @@ -63,6 +63,7 @@ abstract class TreeNodeExclusionAction extends AnActi for (TreePath path : selection) { final T node = (T)path.getLastPathComponent(); TreeUtil.traverse(node, n -> { + if (!exclusionProcessor.isNodeExclusionAvailable((T)n)) return true; final Boolean isNodeExcluded = exclusionProcessor.isNodeExcluded((T)n); if (myIsExclude != isNodeExcluded) { isEnabled[0] = true; diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java index 0c279e77df35..fd580538a454 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -106,7 +106,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra private final ExporterToTextFile myTextFileExporter = new ExporterToTextFile(this); private final Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); - private final ExclusionHandler myExclusionHandler; + private final ExclusionHandler myExclusionHandler; private final UsageModelTracker myModelTracker; private final Map myUsageNodes = new ConcurrentHashMap(); public static final UsageNode NULL_NODE = new UsageNode(NullUsage.INSTANCE, new UsageViewTreeModelBuilder(new UsageViewPresentation(), UsageTarget.EMPTY_ARRAY)); @@ -253,21 +253,26 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra runnable.run(); return true; }, o -> isDisposed || project.isDisposed(), 200); - myExclusionHandler = new ExclusionHandler() { + myExclusionHandler = new ExclusionHandler() { @Override - public boolean isNodeExcluded(@NotNull Node node) { - return node.isDataExcluded(); + public boolean isNodeExclusionAvailable(@NotNull DefaultMutableTreeNode node) { + return node instanceof UsageNode; } @Override - public void excludeNode(@NotNull Node node) { + public boolean isNodeExcluded(@NotNull DefaultMutableTreeNode node) { + return ((UsageNode)node).isDataExcluded(); + } + + @Override + public void excludeNode(@NotNull DefaultMutableTreeNode node) { final HashSet usages = new HashSet<>(); collectUsages(node, usages); excludeUsages(usages.toArray(new Usage[usages.size()])); } @Override - public void includeNode(@NotNull Node node) { + public void includeNode(@NotNull DefaultMutableTreeNode node) { final HashSet usages = new HashSet<>(); collectUsages(node, usages); includeUsages(usages.toArray(new Usage[usages.size()]));