]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/SymbolCodeStyle.java
Symbol code style into platform
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / adapters / SymbolCodeStyle.java
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
new file mode 100644 (file)
index 0000000..fb58433
--- /dev/null
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Semantum Oy - initial API and implementation
+ *******************************************************************************/
+package org.simantics.modeling.adapters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.Variable;
+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.nodes.SVGNode;
+import org.simantics.scenegraph.g2d.nodes.SVGNode.SVGNodeAssignment;
+import org.simantics.scenegraph.profile.EvaluationContext;
+import org.simantics.scenegraph.utils.NodeUtil;
+import org.simantics.utils.datastructures.Pair;
+
+/**
+ * @author Antti Villberg
+ * @since 1.29.0
+ */
+public class SymbolCodeStyle extends StyleBase<Pair<List<String>, Object>> {
+
+    @Override
+    public Pair<List<String>, 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)
+            return null;
+
+        // If element is moved, recalculate style
+        Object transform = graph.getPossibleRelatedValue(element, DIA.HasTransform);
+
+        return Pair.make(styles, transform);
+    }
+
+    @Override
+    public void applyStyleForNode(EvaluationContext evaluationContext, INode node, Pair<List<String>, Object> result) {
+        if (result == null || result.first == null || result.first.isEmpty())
+            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();
+        }
+    }
+
+}