From 890cf6bf41a57a0d1e71206c1787f96d766f1d9b Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 27 Dec 2011 17:50:57 +0100 Subject: [PATCH] make node providers work (Ctrl+F12, etc) --- .../com/intellij/ide/util/FileStructurePopup.java | 15 ++++++++------- .../filtered/FilteringTreeStructure.java | 9 +++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java index d539d5f4fcb4..2b675f1b1c0a 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -100,6 +100,8 @@ public class FileStructurePopup implements Disposable { private FilteringTreeBuilder myAbstractTreeBuilder; private String myTitle; private TreeSpeedSearch mySpeedSearch; + private final FilteringTreeStructure myStructure; + private SmartTreeStructure mySmartTreeStructure; public FileStructurePopup(StructureViewModel structureViewModel, @Nullable Editor editor, @@ -136,7 +138,7 @@ public class FileStructurePopup implements Disposable { } } - SmartTreeStructure smartTreeStructure = new SmartTreeStructure(project, myTreeModel){ + mySmartTreeStructure = new SmartTreeStructure(project, myTreeModel){ public void rebuildTree() { if (!myPopup.isDisposed()) { super.rebuildTree(); @@ -157,15 +159,15 @@ public class FileStructurePopup implements Disposable { } }; ElementFilter filter = new FileStructurePopupFilter(); - final FilteringTreeStructure treeStructure = new FilteringTreeStructure(project, filter, smartTreeStructure); + myStructure = new FilteringTreeStructure(project, filter, mySmartTreeStructure); //final DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode(treeStructure.getRootElement())); - myTree = new Tree(new DefaultMutableTreeNode(treeStructure.getRootElement())); + myTree = new Tree(new DefaultMutableTreeNode(myStructure.getRootElement())); myTree.setRootVisible(false); myTree.setShowsRootHandles(true); mySpeedSearch = new TreeSpeedSearch(myTree, TreeSpeedSearch.NODE_DESCRIPTOR_TOSTRING, true); - myAbstractTreeBuilder = new FilteringTreeBuilder(project, myTree, filter, treeStructure, null) { + myAbstractTreeBuilder = new FilteringTreeBuilder(project, myTree, filter, myStructure, null) { @Override protected boolean validateNode(Object child) { return StructureViewComponent.isValid(child); @@ -403,6 +405,7 @@ public class FileStructurePopup implements Disposable { } final boolean state = chkFilter.isSelected(); myTreeActionsOwner.setActionIncluded(action, action instanceof FileStructureFilter ? !state : state); + mySmartTreeStructure.rebuildTree(); myAbstractTreeBuilder.refilter(); //todo full update myAbstractTreeBuilder.queueUpdate(); if (currentParent != null) { @@ -415,8 +418,6 @@ public class FileStructurePopup implements Disposable { myShouldNarrowDown = oldNarrowDown; } } - myAbstractTreeBuilder.queueUpdate(); - if (SpeedSearchBase.hasActiveSpeedSearch(myTree)) { final SpeedSearchSupply supply = SpeedSearchSupply.getSupply(myTree); if (supply != null && supply.isPopupActive()) supply.refreshSelection(); @@ -642,7 +643,7 @@ public class FileStructurePopup implements Disposable { if (matches) { Object o = value; - while ((o = ((FilteringTreeStructure.Node)o).getParent()) != null) { + while (o instanceof FilteringTreeStructure.Node && (o = ((FilteringTreeStructure.Node)o).getParent()) != null) { myVisibleParents.add(o); } return true; diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeStructure.java b/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeStructure.java index c0cbd0bb6b25..b39c5fa021fc 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeStructure.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeStructure.java @@ -46,6 +46,9 @@ public class FilteringTreeStructure extends AbstractTreeStructure { } public void refilter() { + if (myStructure instanceof FilteringTreeStructure) { + ((FilteringTreeStructure)myStructure).refilter(); + } myRoot.clear(); myNodeObject2Node.clear(); fillChildren(myRoot, getStructure().getRootElement()); @@ -90,6 +93,12 @@ public class FilteringTreeStructure extends AbstractTreeStructure { return myDelegate; } + @Override + public void cleanUpCache() { + super.cleanUpCache(); + myChildren.clear(); + } + @Override public String toString() { return String.valueOf(getDelegate());