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=edc7aa9e1e5757a7d822ba96c75bb83ca7506aa6;hp=fb584331e8667d5efaf77829e0b1960e2b12ec12;hb=2b0fe692f116091f8d65da664174c92591a077b8;hpb=043ed4538f5bdc16d299bc40c2dd8285a3120f9b 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 fb584331e..edc7aa9e1 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 @@ -11,8 +11,12 @@ *******************************************************************************/ 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, Object>> { +public class SymbolCodeStyle extends StyleBase> { @Override - public Pair, Object> calculateStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource element, Variable configuration) throws DatabaseException { + public Pair 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 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 styles = (List)modi; + List 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, Object> result) { - if (result == null || result.first == null || result.first.isEmpty()) + public void applyStyleForNode(EvaluationContext evaluationContext, INode node, Pair result) { + if (result == null || result.first == null) return; - List styles = result.first; - List 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 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; + }); } }