X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scenegraph%2Fsrc%2Forg%2Fsimantics%2Fscenegraph%2Futils%2FNodeUtil.java;h=615899a59eef25676ff17b0cbdcb69ca0d62d1b8;hb=74776fa0c613daf38465901c248433bec99d2c72;hp=c3bb2144108256319a21368469d2385216db658e;hpb=4b6ff1fec23b4a67b8bef502922ee9801c84a394;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/NodeUtil.java b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/NodeUtil.java index c3bb21441..615899a59 100644 --- a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/NodeUtil.java +++ b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/NodeUtil.java @@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Function; import org.simantics.scenegraph.IDynamicSelectionPainterNode; import org.simantics.scenegraph.ILookupService; @@ -276,6 +277,7 @@ public final class NodeUtil { printSceneGraph(System.out, 0, node); } + @FunctionalInterface public static interface NodeProcedure { T execute(INode node, String id); } @@ -324,6 +326,47 @@ public final class NodeUtil { return result; } + /** + * Recursively iterates through all child nodes of the specified node and + * for those nodes that are of class ofClass, invokes + * consumer. + * + * @param node + * @param ofClass + * @param consumer + */ + @SuppressWarnings("unchecked") + public static INode forChildrenDeep(INode node, Class ofClass, Function func) { + return forChildrenDeep(node, n -> ofClass.isInstance(n) ? func.apply((T) n) : null); + } + + public static INode forChildrenDeep(INode node, Function func) { + INode ret = func.apply(node); + if (ret != null) + return ret; + + if (node instanceof ParentNode) { + if (node instanceof G2DParentNode) { + G2DParentNode g2dpn = (G2DParentNode) node; + for (IG2DNode n : g2dpn.getSortedNodes()) { + INode r = forChildrenDeep(n, func); + if (r != null) { + return r; + } + } + } else { + for (INode n : ((ParentNode) node).getNodes()) { + INode r = forChildrenDeep(n, func); + if (r != null) { + return r; + } + } + } + } + + return null; + } + public static final int countTreeNodes(INode node) { int result = 1; if (node instanceof ParentNode) {