diff --git a/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java b/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java index e43bfc9034d1..a806e1ffde27 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java @@ -311,18 +311,11 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom @Override public boolean isModified() { if (myHasDeletedItems) return true; - final boolean[] modified = new boolean[1]; - TreeUtil.traverseDepth(myRoot, node -> { - if (node instanceof MyNode) { - final NamedConfigurable configurable = ((MyNode)node).getConfigurable(); - if (isInitialized(configurable) && configurable.isModified()) { - modified[0] = true; - return false; - } - } - return true; - }); - return modified[0]; + return TreeUtil.treeNodeTraverser(myRoot) + .traverse() + .filterMap(node -> node instanceof MyNode? ((MyNode)node).getConfigurable() : null) + .filter(configurable -> isInitialized(configurable) && configurable.isModified()) + .isNotEmpty(); } protected boolean isInitialized(final NamedConfigurable configurable) { @@ -332,24 +325,11 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom @Override public void apply() throws ConfigurationException { processRemovedItems(); - final ConfigurationException[] ex = new ConfigurationException[1]; - TreeUtil.traverse(myRoot, node -> { - if (node instanceof MyNode) { - try { - final NamedConfigurable configurable = ((MyNode)node).getConfigurable(); - if (isInitialized(configurable) && configurable.isModified()) { - configurable.apply(); - } - } - catch (ConfigurationException e) { - ex[0] = e; - return false; - } + for (MyNode node : TreeUtil.treeNodeTraverser(myRoot).filter(MyNode.class)) { + NamedConfigurable configurable = node.getConfigurable(); + if (isInitialized(configurable) && configurable.isModified()) { + configurable.apply(); } - return true; - }); - if (ex[0] != null) { - throw ex[0]; } myHasDeletedItems = false; } @@ -449,16 +429,12 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom } protected void clearChildren() { - TreeUtil.traverseDepth(myRoot, node -> { - if (node instanceof MyNode) { - final MyNode treeNode = (MyNode)node; - treeNode.getConfigurable().disposeUIResources(); - if (!(treeNode instanceof MyRootNode)) { - treeNode.setUserObject(null); - } + for (MyNode node : TreeUtil.treeNodeTraverser(myRoot).filter(MyNode.class)) { + node.getConfigurable().disposeUIResources(); + if (!(node instanceof MyRootNode)) { + node.setUserObject(null); } - return true; - }); + } myRoot.removeAllChildren(); } @@ -639,15 +615,10 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom } protected static MyNode findNodeByCondition(final TreeNode root, final Condition condition) { - final MyNode[] nodeToSelect = new MyNode[1]; - TreeUtil.traverseDepth(root, node -> { - if (condition.value(((MyNode)node).getConfigurable())) { - nodeToSelect[0] = (MyNode)node; - return false; - } - return true; - }); - return nodeToSelect[0]; + return TreeUtil.treeNodeTraverser(root) + .filter(MyNode.class) + .filter(node -> condition.value(node.getConfigurable())) + .first(); } protected void setSelectedNode(@Nullable MyNode node) { diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/SimpleTree.java b/platform/platform-api/src/com/intellij/ui/treeStructure/SimpleTree.java index 57b29ae04c8a..015e43a8a760 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/SimpleTree.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/SimpleTree.java @@ -476,13 +476,6 @@ public class SimpleTree extends Tree implements CellEditorListener { }, null, false); } - private void debugTree(AbstractTreeBuilder aBuilder) { - TreeUtil.traverseDepth((TreeNode)aBuilder.getTree().getModel().getRoot(), node -> { - System.out.println("Node: " + node); - return true; - }); - } - private boolean hasSingleSelection() { return !isSelectionEmpty() && getSelectionPaths().length == 1; } 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 cf88d5648902..fb421ff8d23d 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 @@ -31,6 +31,7 @@ import com.intellij.ui.treeStructure.Tree; import com.intellij.util.Range; import com.intellij.util.containers.JBIterable; import com.intellij.util.containers.JBTreeTraverser; +import com.intellij.util.containers.TreeTraversal; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -79,6 +80,17 @@ public final class TreeUtil { return count == 0 ? JBIterable.empty() : NUMBERS.take(count).map(index -> model.getChild(node, index)); } + @NotNull + public static JBTreeTraverser treeNodeTraverser(@Nullable TreeNode treeNode) { + return JBTreeTraverser.from(node -> nodeChildren(node)).withRoot(treeNode); + } + + @NotNull + public static JBIterable nodeChildren(@Nullable TreeNode treeNode) { + int count = treeNode == null ? 0 : treeNode.getChildCount(); + return count == 0 ? JBIterable.empty() : NUMBERS.take(count).map(index -> treeNode.getChildAt(index)); + } + @NotNull public static List collectExpandedPaths(@NotNull JTree tree){ return treePathTraverser(tree).expandAndFilter(tree::isExpanded).toList(); @@ -335,24 +347,16 @@ public final class TreeUtil { } } - /** @deprecated use TreeUtil#treeTraverser() or TreeUtil#treePathTraverser() */ + /** @deprecated use TreeUtil#treeTraverser() or TreeUtil#treeNodeTraverser() directly */ @Deprecated public static boolean traverse(@NotNull TreeNode node, @NotNull Traverse traverse) { - final int childCount = node.getChildCount(); - for (int i = 0; i < childCount; i++){ - if (!traverse(node.getChildAt(i), traverse)) return false; - } - return traverse.accept(node); + return treeNodeTraverser(node).traverse(TreeTraversal.POST_ORDER_DFS).processEach(traverse::accept); } - /** @deprecated use TreeUtil#treeTraverser() or TreeUtil#treePathTraverser() */ + /** @deprecated use TreeUtil#treeTraverser() or TreeUtil#treeNodeTraverser() directly */ @Deprecated - public static boolean traverseDepth(@NotNull final TreeNode node, @NotNull final Traverse traverse) { - if (!traverse.accept(node)) return false; - final int childCount = node.getChildCount(); - for (int i = 0; i < childCount; i++) - if (!traverseDepth(node.getChildAt(i), traverse)) return false; - return true; + public static boolean traverseDepth(@NotNull TreeNode node, @NotNull Traverse traverse) { + return treeNodeTraverser(node).traverse(TreeTraversal.PRE_ORDER_DFS).processEach(traverse::accept); } public static void selectPaths(@NotNull JTree tree, @NotNull Collection paths) {