mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-CR-27104 introduce and employ treeNodeTraverser(); correct javadoc
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user