diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java index 26bbe600688b..b268f54425d3 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java @@ -115,9 +115,11 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane }); } myTreeStructure = createStructure(); - setTreeBuilder(createBuilder(treeModel)); - installComparator(); + BaseProjectTreeBuilder treeBuilder = createBuilder(treeModel); + installComparator(treeBuilder); + setTreeBuilder(treeBuilder); + initTree(); Disposer.register(getTreeBuilder(), new UiNotifyConnector(myTree, new Activatable() { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java index c7cc3707856b..d8cea1c90c66 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java @@ -468,8 +468,12 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl } public void installComparator() { + installComparator(getTreeBuilder()); + } + + public void installComparator(AbstractTreeBuilder treeBuilder) { final ProjectView projectView = ProjectView.getInstance(myProject); - getTreeBuilder().setNodeDescriptorComparator(new GroupByTypeComparator(projectView, getId())); + treeBuilder.setNodeDescriptorComparator(new GroupByTypeComparator(projectView, getId())); } public JTree getTree() { @@ -633,6 +637,14 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl myTreeBuilder = treeBuilder; } + public boolean supportsFoldersAlwaysOnTop() { + return true; + } + + public boolean supportsSortByType() { + return true; + } + private class MyDragSource implements DnDSource { @Override public boolean canStartDragging(DnDAction action, Point dragOrigin) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java index 6cee8227393b..83938b304366 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java @@ -1878,7 +1878,8 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo public void update(final AnActionEvent e) { super.update(e); final Presentation presentation = e.getPresentation(); - presentation.setVisible(getCurrentProjectViewPane() != null); + AbstractProjectViewPane pane = getCurrentProjectViewPane(); + presentation.setVisible(pane != null && pane.supportsSortByType()); } } @@ -1901,7 +1902,8 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo public void update(final AnActionEvent e) { super.update(e); final Presentation presentation = e.getPresentation(); - presentation.setEnabledAndVisible(getCurrentProjectViewPane() != null); + AbstractProjectViewPane pane = getCurrentProjectViewPane(); + presentation.setEnabledAndVisible(pane != null && pane.supportsFoldersAlwaysOnTop()); } } diff --git a/platform/platform-api/src/com/intellij/util/ui/tree/TreeUtil.java b/platform/platform-api/src/com/intellij/util/ui/tree/TreeUtil.java index fe37c0f50216..d9ce308f2568 100644 --- a/platform/platform-api/src/com/intellij/util/ui/tree/TreeUtil.java +++ b/platform/platform-api/src/com/intellij/util/ui/tree/TreeUtil.java @@ -794,14 +794,27 @@ public final class TreeUtil { expand(tree, new TreePath(tree.getModel().getRoot()), levels); } - private static void expand(@NotNull JTree tree, @NotNull TreePath path, int levels) { - if (levels == 0) return; + /** + * Expands n levels of the tree counting from the root and return true if there is no nodes to expand + * @param tree to expand nodes of + * @param levels depths of the expantion + */ + public static boolean expandWithResult(@NotNull JTree tree, int levels) { + return expand(tree, new TreePath(tree.getModel().getRoot()), levels); + } + + private static boolean expand(@NotNull JTree tree, @NotNull TreePath path, int levels) { + if (levels == 0) return false; tree.expandPath(path); TreeNode node = (TreeNode)path.getLastPathComponent(); Enumeration children = node.children(); + + boolean isReady = true; while (children.hasMoreElements()) { - expand(tree, path.pathByAddingChild(children.nextElement()) , levels - 1); + if (!expand(tree, path.pathByAddingChild(children.nextElement()) , levels - 1)) + isReady = false; } + return isReady; } @NotNull