X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fadapters%2FSymbolCodeStyle.java;h=4e7fe78d05f3caa39b16f408428562a7ad39bbf1;hp=edc7aa9e1e5757a7d822ba96c75bb83ca7506aa6;hb=2e21c89c81d449bcc2301b3cf3cce4f2cd403a60;hpb=edbb4df64407826271ee6423451401684e9cd68c diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java index edc7aa9e1..4e7fe78d0 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java @@ -18,6 +18,7 @@ import java.util.HashMap; 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; @@ -28,12 +29,17 @@ import org.simantics.diagram.stubs.DiagramResource; 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; /** @@ -51,8 +57,19 @@ public class SymbolCodeStyle extends StyleBase 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); @@ -71,33 +88,89 @@ public class SymbolCodeStyle extends StyleBase } } + private Map buildSingleElementMap(INode node) { + Map 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 result) { - if (result == null || result.first == null) + + if (result == null || result.first == null) return; + Map 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> assignmentMap = new HashMap<>(); + + if (modification.svgAssignments != null && !modification.svgAssignments.isEmpty()) { + for (SVGNode p : NodeUtil.collectNodes(node, SVGNode.class)) { + List 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 list = assignmentMap.get(p); + if(list == null) { + list = new ArrayList<>(); + assignmentMap.put(p, list); + } + list.add(ass); + } + } + } + + for(Map.Entry> entry : assignmentMap.entrySet()) { + SVGNode p = entry.getKey(); + p.setAssignments(entry.getValue()); p.cleanDiagramCache(); + } + + if (modification.transformAssignments != null) { + Map 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 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; - }); - } + } }