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 0fe520acd82c..cdfd5c039df9 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -347,7 +347,10 @@ public class FileStructurePopup implements Disposable { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - selectPsiElement(myInitialPsiElement); + if (selectPsiElement(myInitialPsiElement) == null) { + TreeUtil.ensureSelection(myAbstractTreeBuilder.getTree()); + myAbstractTreeBuilder.revalidateTree(); + } } }); } @@ -432,7 +435,7 @@ public class FileStructurePopup implements Disposable { Set parents = getAllParents(element); FilteringTreeStructure.FilteringNode node = (FilteringTreeStructure.FilteringNode)myAbstractTreeBuilder.getRootElement(); - if (node != null && myStructureView instanceof StructureViewComposite) { + if (element != null && node != null && myStructureView instanceof StructureViewComposite) { parents.remove(element.getContainingFile()); final List fileNodes = node.children(); @@ -445,11 +448,11 @@ public class FileStructurePopup implements Disposable { } else { final FilteringTreeStructure.FilteringNode found = findNode(parents, node); if (found == null) { - TreeUtil.selectFirstNode(myTree); + TreeUtil.ensureSelection(myTree); } return found; } - TreeUtil.selectFirstNode(myTree); + TreeUtil.ensureSelection(myTree); return null; } diff --git a/platform/lang-impl/src/com/intellij/ide/util/StructureViewCompositeModel.java b/platform/lang-impl/src/com/intellij/ide/util/StructureViewCompositeModel.java index 565ba5faf265..f359d0137495 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/StructureViewCompositeModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/StructureViewCompositeModel.java @@ -15,23 +15,31 @@ */ package com.intellij.ide.util; +import com.intellij.ide.structureView.StructureViewModel; import com.intellij.ide.structureView.StructureViewModelBase; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.StructureViewComposite; +import com.intellij.ide.util.treeView.smartTree.Filter; +import com.intellij.ide.util.treeView.smartTree.NodeProvider; +import com.intellij.ide.util.treeView.smartTree.ProvidingTreeModel; import com.intellij.ide.util.treeView.smartTree.TreeElement; import com.intellij.navigation.ItemPresentation; import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; +import java.util.*; /** * @author Konstantin Bulenkov */ public class StructureViewCompositeModel extends StructureViewModelBase { + private final StructureViewComposite.StructureViewDescriptor[] myViews; + public StructureViewCompositeModel(PsiFile file, StructureViewComposite.StructureViewDescriptor[] views) { super(file, createRootNode(file, views)); + myViews = views; } private static StructureViewTreeElement createRootNode(final PsiFile file, final StructureViewComposite.StructureViewDescriptor[] views) { @@ -72,6 +80,30 @@ public class StructureViewCompositeModel extends StructureViewModelBase { }; } + @NotNull + @Override + public Collection getNodeProviders() { + final Set providers = new HashSet(); + for (StructureViewComposite.StructureViewDescriptor view : myViews) { + final StructureViewModel model = view.structureView.getTreeModel(); + if (model instanceof ProvidingTreeModel) { + providers.addAll(((ProvidingTreeModel)model).getNodeProviders()); + } + } + return providers; + } + + @NotNull + @Override + public Filter[] getFilters() { + final HashSet filters = new HashSet(); + for (StructureViewComposite.StructureViewDescriptor view : myViews) { + final StructureViewModel model = view.structureView.getTreeModel(); + filters.addAll(Arrays.asList(model.getFilters())); + } + return filters.toArray(new Filter[filters.size()]); + } + private static TreeElement createTreeElementFromView(final PsiFile file, final StructureViewComposite.StructureViewDescriptor view) { return new StructureViewTreeElement() { @Override @@ -122,5 +154,7 @@ public class StructureViewCompositeModel extends StructureViewModelBase { return view.structureView.getTreeModel().getRoot().getChildren(); } }; + + } }