import java.util.List;
import java.util.Map;
+import org.simantics.Simantics;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
import org.simantics.db.exception.DatabaseException;
import org.simantics.scenegraph.INode;
import org.simantics.scenegraph.g2d.G2DNodeModification;
import org.simantics.scenegraph.g2d.IG2DNode;
+import org.simantics.scenegraph.g2d.nodes.ConnectionNode;
import org.simantics.scenegraph.g2d.nodes.SVGNode;
import org.simantics.scenegraph.g2d.nodes.SVGNodeAssignment;
import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
+import org.simantics.scenegraph.g2d.nodes.TargetedSVGNodeAssignment;
import org.simantics.scenegraph.g2d.nodes.TransformationAssignment;
+import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode;
import org.simantics.scenegraph.profile.EvaluationContext;
import org.simantics.scenegraph.utils.NodeUtil;
+import org.simantics.scl.runtime.function.Function;
+import org.simantics.structural.stubs.StructuralResource2;
import org.simantics.utils.datastructures.Pair;
/**
if (elementVariable == null)
return null;
Object modi = elementVariable.getPossiblePropertyValue(graph, DIA.symbolCode);
- if (modi == null)
- return null;
+ if (modi == null) {
+ if(graph.isInstanceOf(element, DIA.RouteGraphConnection)) {
+ StructuralResource2 STR = StructuralResource2.getInstance(graph);
+ Resource connectionType = graph.getPossibleObject(element, STR.HasConnectionType);
+ if(connectionType != null) {
+ Variable connectionTypeVariable = Variables.getPossibleVariable(graph, connectionType);
+ Function fn = connectionTypeVariable.getPossiblePropertyValue(graph, DIA.symbolFunction);
+ modi = Simantics.applySCLRead(graph, fn, elementVariable);
+ }
+ }
+ }
+
+ if(modi == null) return null;
// If element is moved, recalculate style
Object transform = graph.getPossibleRelatedValue(element, DIA.HasTransform);
}
}
+ private Map<Object,SingleElementNode> buildSingleElementMap(INode node) {
+ Map<Object,SingleElementNode> elements = new HashMap<>();
+ NodeUtil.forChildrenDeep(node, SingleElementNode.class, n -> {
+ elements.put(n.getKey(), n);
+ return null;
+ });
+ return elements;
+ }
+
@Override
public void applyStyleForNode(EvaluationContext evaluationContext, INode node, Pair<G2DNodeModification, Object> result) {
- if (result == null || result.first == null)
+
+ if (result == null || result.first == null)
return;
+ Map<Object,SingleElementNode> elements = null;
+
G2DNodeModification modification = result.first;
- if (modification.svgAssignments != null && !modification.svgAssignments.isEmpty()) {
- for (SVGNode p : NodeUtil.collectNodes(node, SVGNode.class)) {
- p.setAssignments(modification.svgAssignments);
+
+ if(node instanceof ConnectionNode) {
+
+ if (modification.svgAssignments != null && !modification.svgAssignments.isEmpty()) {
+ INode child = NodeUtil.getFirstChild(node);
+ if(child instanceof RouteGraphNode) {
+ RouteGraphNode rgn = (RouteGraphNode)child;
+ rgn.setAssignments(modification.svgAssignments);
+ }
+ }
+
+ } else if(node instanceof SingleElementNode) {
+
+ Map<SVGNode, List<SVGNodeAssignment>> assignmentMap = new HashMap<>();
+
+ if (modification.svgAssignments != null && !modification.svgAssignments.isEmpty()) {
+ for (SVGNode p : NodeUtil.collectNodes(node, SVGNode.class)) {
+ List<SVGNodeAssignment> list = assignmentMap.get(p);
+ if(list == null) {
+ list = new ArrayList<>();
+ assignmentMap.put(p, list);
+ }
+ list.addAll(modification.svgAssignments);
+ }
+ }
+
+ if(modification.targetedSVGAssignments != null && !modification.targetedSVGAssignments.isEmpty()) {
+ elements = buildSingleElementMap(node);
+ for(TargetedSVGNodeAssignment ass : modification.targetedSVGAssignments) {
+ SingleElementNode sen = elements.get(ass.singleElementKey);
+ for (SVGNode p : NodeUtil.collectNodes(sen, SVGNode.class)) {
+ List<SVGNodeAssignment> list = assignmentMap.get(p);
+ if(list == null) {
+ list = new ArrayList<>();
+ assignmentMap.put(p, list);
+ }
+ list.add(ass);
+ }
+ }
+ }
+
+ for(Map.Entry<SVGNode, List<SVGNodeAssignment>> entry : assignmentMap.entrySet()) {
+ SVGNode p = entry.getKey();
+ p.setAssignments(entry.getValue());
p.cleanDiagramCache();
+ }
+
+ if (modification.transformAssignments != null) {
+ Map<Object,AffineTransform> trs = new HashMap<>();
+ for (TransformationAssignment ass : modification.transformAssignments)
+ trs.put(ass.key, ass.transform);
+ NodeUtil.forChildrenDeep(node, SingleElementNode.class, n -> {
+ Object key = n.getKey();
+ AffineTransform tr = trs.get(key);
+ if (tr != null) {
+ IG2DNode[] children = n.getSortedNodes();
+ if (children.length > 0)
+ children[0].setTransform(tr);
+ }
+ return null;
+ });
}
+
}
- if (modification.transformAssignments != null) {
- Map<Object,AffineTransform> trs = new HashMap<>();
- for (TransformationAssignment ass : modification.transformAssignments)
- trs.put(ass.key, ass.transform);
- NodeUtil.forChildrenDeep(node, SingleElementNode.class, n -> {
- Object key = n.getKey();
- AffineTransform tr = trs.get(key);
- if (tr != null) {
- IG2DNode[] children = n.getSortedNodes();
- if (children.length > 0)
- children[0].setTransform(tr);
- }
- return null;
- });
- }
+
}
}