]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java
Support for dynamic transforms for both elements and terminals
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / adapters / SymbolCodeStyle.java
index fb584331e8667d5efaf77829e0b1960e2b12ec12..edc7aa9e1e5757a7d822ba96c75bb83ca7506aa6 100644 (file)
  *******************************************************************************/
 package org.simantics.modeling.adapters;
 
+import java.awt.geom.AffineTransform;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
@@ -22,8 +26,12 @@ import org.simantics.db.layer0.variable.Variables;
 import org.simantics.diagram.profile.StyleBase;
 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.SVGNode;
-import org.simantics.scenegraph.g2d.nodes.SVGNode.SVGNodeAssignment;
+import org.simantics.scenegraph.g2d.nodes.SVGNodeAssignment;
+import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
+import org.simantics.scenegraph.g2d.nodes.TransformationAssignment;
 import org.simantics.scenegraph.profile.EvaluationContext;
 import org.simantics.scenegraph.utils.NodeUtil;
 import org.simantics.utils.datastructures.Pair;
@@ -32,39 +40,63 @@ import org.simantics.utils.datastructures.Pair;
  * @author Antti Villberg
  * @since 1.29.0
  */
-public class SymbolCodeStyle extends StyleBase<Pair<List<String>, Object>> {
+public class SymbolCodeStyle extends StyleBase<Pair<G2DNodeModification, Object>> {
 
     @Override
-    public Pair<List<String>, Object> calculateStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource element, Variable configuration) throws DatabaseException {
+    public Pair<G2DNodeModification, Object> calculateStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource element, Variable configuration) throws DatabaseException {
         DiagramResource DIA = DiagramResource.getInstance(graph);
 
         // Find a component for the element 
         Variable elementVariable = Variables.getPossibleVariable(graph, element);
         if (elementVariable == null)
             return null;
-        List<String> styles = elementVariable.getPossiblePropertyValue(graph, DIA.symbolCode);
-        if (styles == null)
+        Object modi = elementVariable.getPossiblePropertyValue(graph, DIA.symbolCode);
+        if (modi == null)
             return null;
 
         // If element is moved, recalculate style
         Object transform = graph.getPossibleRelatedValue(element, DIA.HasTransform);
 
-        return Pair.make(styles, transform);
+        if (modi instanceof G2DNodeModification) {
+            return Pair.make((G2DNodeModification)modi, transform);
+        } else if (modi instanceof List) {
+            @SuppressWarnings("unchecked")
+            List<String> styles = (List<String>)modi;
+            List<SVGNodeAssignment> assignments = new ArrayList<>(styles.size()/3);
+            for (int i = 0; i < styles.size()/3; i++)
+                assignments.add(new SVGNodeAssignment(styles.get(3*i), styles.get(3*i+1), styles.get(3*i+2)));
+            return Pair.make(new G2DNodeModification(assignments, Collections.emptyList()), transform);
+        } else {
+            throw new DatabaseException("Invalid symbolCode value: " + modi);
+        }
     }
 
     @Override
-    public void applyStyleForNode(EvaluationContext evaluationContext, INode node, Pair<List<String>, Object> result) {
-        if (result == null || result.first == null || result.first.isEmpty())
+    public void applyStyleForNode(EvaluationContext evaluationContext, INode node, Pair<G2DNodeModification, Object> result) {
+        if (result == null || result.first == null)
             return;
 
-        List<String> styles = result.first;
-        List<SVGNodeAssignment> assignments = new ArrayList<>(styles.size()/3);
-        for (int i = 0; i < styles.size()/3; i++)
-            assignments.add(new SVGNodeAssignment(styles.get(3*i), styles.get(3*i+1), styles.get(3*i+2)));
-
-        for (SVGNode p : NodeUtil.collectNodes(node, SVGNode.class)) {
-            p.setAssignments(assignments);
-            p.cleanDiagramCache();
+        G2DNodeModification modification = result.first;
+        if (modification.svgAssignments != null && !modification.svgAssignments.isEmpty()) {
+            for (SVGNode p : NodeUtil.collectNodes(node, SVGNode.class)) {
+                p.setAssignments(modification.svgAssignments);
+                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;
+            });
         }
     }