*******************************************************************************/
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;
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;
* @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;
+ });
}
}