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=5dac6fd2a59b68bc380fddbdbdda71efc5fd74f5;hb=452670c58399d8054872655841ebb6e66d9c6b6e;hp=c3bb2144108256319a21368469d2385216db658e;hpb=9d4a145fef9bcec16e3d1f1477894cba6429b9c4;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..5dac6fd2a 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; @@ -53,6 +54,8 @@ import org.simantics.scl.runtime.function.Function1; import org.simantics.scl.runtime.function.FunctionImpl1; import org.simantics.utils.datastructures.Pair; import org.simantics.utils.threads.IThreadWorkQueue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Utilities for debugging/printing the contents of a scenegraph. @@ -61,6 +64,7 @@ import org.simantics.utils.threads.IThreadWorkQueue; */ public final class NodeUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(NodeUtil.class); /** * @param */ @@ -96,6 +100,18 @@ public final class NodeUtil { } } + public static INode getPossibleNearestParentOfType(INode node, Class clazz) { + ParentNode parent = null; + while (true) { + parent = node.getParent(); + if (parent == null) + return null; + node = parent; + if (clazz.isInstance(node)) + return node; + } + } + public static INode getRootNode(INode node) { ParentNode parent = null; while (true) { @@ -276,6 +292,7 @@ public final class NodeUtil { printSceneGraph(System.out, 0, node); } + @FunctionalInterface public static interface NodeProcedure { T execute(INode node, String id); } @@ -324,6 +341,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) { @@ -552,7 +610,7 @@ public final class NodeUtil { } else { if(pc.length > 0) { - System.err.println("Method " + setter.getName() + " expects " + pc[0].getCanonicalName() + " (got " + value.getClass().getCanonicalName() + ")."); + LOGGER.warn("Method " + setter.getName() + " expects " + pc[0].getCanonicalName() + " (got " + value.getClass().getCanonicalName() + ")."); } } @@ -881,7 +939,7 @@ public final class NodeUtil { // Find node transform.. AffineTransform transform = getGlobalToLocalTransform(node, null); if (transform == null) { - System.err.println("WARNING: Non-invertible transform for node: " + node); + LOGGER.warn("WARNING: Non-invertible transform for node: " + node); return event; } MouseEvent me = (MouseEvent)event; @@ -920,7 +978,7 @@ public final class NodeUtil { if(DEBUG_BOUNDS) { for(int i=0;i " + bl); + LOGGER.warn("+getLocalBoundsImpl " + next + " => " + bl); } if(bl != null) { @@ -934,7 +992,7 @@ public final class NodeUtil { if(DEBUG_BOUNDS) { for(int i=0;i " + bounds); + LOGGER.warn("=getLocalBoundsImpl " + node + " => " + bounds); } return bounds; @@ -943,7 +1001,7 @@ public final class NodeUtil { if(result != null) { if(DEBUG_BOUNDS) { for(int i=0;i " + result); + LOGGER.warn("=getLocalBoundsImpl " + node + " => " + result); } return result; }