package org.simantics.district.network.profile; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.exception.DatabaseException; import org.simantics.scenegraph.INode; import org.simantics.scenegraph.g2d.G2DSceneGraph; import org.simantics.scenegraph.g2d.nodes.ConnectionNode; import org.simantics.scenegraph.profile.EvaluationContext; import org.simantics.scenegraph.profile.common.ProfileVariables; public class EdgeThicknessStyle extends ThrottledStyleBase { private static final Double PENDING = Double.NaN; private static final Double ONE = 1.0; @Override public Double calculateThrottledStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource groupItem) throws DatabaseException { DiagramSettings ds = graph.syncRequest(new DiagramSettingsRequest(runtimeDiagram), TransientCacheAsyncListener.instance()); // Prevent PendingVariableExceptions from coming through boolean wasSynchronous = graph.setSynchronous(true); try { Double thickness = ONE; if (ds.edgeThicknessProperty.isPresent()) { thickness = Simantics.applySCLRead(graph, ds.edgeThicknessProperty.get(), groupItem); // System.out.println("read thickness: " + thickness + " : " + ds.edgeThicknessProperty); if (thickness == null) { thickness = ONE; } else { thickness = thickness * ds.edgeThicknessGain + ds.edgeThicknessBias; } } return thickness; } finally { graph.setSynchronous(wasSynchronous); } } @Override public void applyThrottledStyleForNode(EvaluationContext observer, INode node, Double value) { // System.out.println("apply: " + node + " : " + value); ConnectionNode n = (ConnectionNode) node; if (value == PENDING) { ((G2DSceneGraph)node.getRootNode()).setPending(node); } else { ((G2DSceneGraph)node.getRootNode()).clearPending(node); } if (value == null) value = ONE; for (INode nn : n.getNodes()) ProfileVariables.claimNodeProperty(nn, "stroke", value, observer); } @Override protected void cleanupStyleForNode(EvaluationContext evaluationContext, INode node) { ((G2DSceneGraph)node.getRootNode()).clearPending(node); ConnectionNode n = (ConnectionNode) node; for (INode nn : n.getNodes()) ProfileVariables.claimNodeProperty(nn, "stroke", ONE, evaluationContext); } }