]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java
Dynamic terminals and connections
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / adapters / SymbolCodeStyle.java
index edc7aa9e1e5757a7d822ba96c75bb83ca7506aa6..4e7fe78d05f3caa39b16f408428562a7ad39bbf1 100644 (file)
@@ -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<Pair<G2DNodeModification, Object>
         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<Pair<G2DNodeModification, Object>
         }
     }
 
+    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;
-            });
-        }
+        
     }
 
 }