IDEA-CR-27104 introduce and employ treeNodeTraverser(); correct javadoc

This commit is contained in:
Gregory.Shrago
2017-11-21 02:54:06 +03:00
parent 52352c9351
commit 933b830de5
3 changed files with 35 additions and 67 deletions
@@ -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<NamedConfigurable> 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) {
@@ -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;
}
@@ -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<TreeNode> treeNodeTraverser(@Nullable TreeNode treeNode) {
return JBTreeTraverser.<TreeNode>from(node -> nodeChildren(node)).withRoot(treeNode);
}
@NotNull
public static JBIterable<TreeNode> 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<TreePath> 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<TreePath> paths) {