]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconButtonStyleBase.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / profile / IconButtonStyleBase.java
diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconButtonStyleBase.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconButtonStyleBase.java
new file mode 100644 (file)
index 0000000..04d5a50
--- /dev/null
@@ -0,0 +1,76 @@
+package org.simantics.diagram.profile;\r
+\r
+import java.awt.geom.AffineTransform;\r
+\r
+import org.simantics.datatypes.literal.Vec2d;\r
+import org.simantics.scenegraph.INode;\r
+import org.simantics.scenegraph.g2d.IG2DNode;\r
+import org.simantics.scenegraph.g2d.nodes.SingleElementNode;\r
+import org.simantics.scenegraph.profile.EvaluationContext;\r
+import org.simantics.scenegraph.profile.common.ProfileVariables;\r
+import org.simantics.scenegraph.utils.NodeUtil;\r
+\r
+/**\r
+ * @author Antti Villberg\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public abstract class IconButtonStyleBase<T extends IconButtonResult> extends StyleBase<T> {\r
+\r
+       abstract protected String getNodePrefix();\r
+       abstract protected Class<?> getNodeClass();\r
+       \r
+    private AffineTransform translateAndScaleIfNeeded(AffineTransform tr, Vec2d offset, boolean relativeTransform) {\r
+       if(relativeTransform) {\r
+               if(!offset.isZero()) {\r
+                       tr = new AffineTransform(tr);\r
+                       tr.translate(offset.x, offset.y);\r
+               }\r
+       } else {\r
+               Vec2d translation = new Vec2d(tr.getTranslateX()+offset.x, tr.getTranslateY()+offset.y);\r
+               tr = new AffineTransform();\r
+               tr.translate(translation.x, translation.y);\r
+       }\r
+       return tr;\r
+    }\r
+    \r
+    private AffineTransform getSymbolTransform(INode node, Vec2d offset, boolean relativeTransform) {\r
+       if(node instanceof SingleElementNode) {\r
+               SingleElementNode s = (SingleElementNode)node;\r
+               INode symbol = NodeUtil.findChildByPrefix(s, "composite_image"); \r
+               return translateAndScaleIfNeeded(symbol != null ? ((IG2DNode)symbol).getTransform() : new AffineTransform(), offset, relativeTransform);\r
+       }\r
+       return null;\r
+    }\r
+    \r
+    @Override\r
+    public void applyStyleForNode(EvaluationContext observer, INode node, T result) {\r
+\r
+       if (result == null) {\r
+            ProfileVariables.denyChildren(node, getNodePrefix());\r
+            return;\r
+        }\r
+\r
+       IconButtonState state = result.getState();\r
+       IconButtonConfiguration config = state.getConfiguration(); \r
+       \r
+       if (config.getOffset() == null) {\r
+               ProfileVariables.denyChild(node, getNodePrefix() + config.getId());\r
+               return;\r
+       }\r
+\r
+       @SuppressWarnings("unchecked")\r
+               IconButtonNode iconNode = ProfileVariables.claimChild(node, "", getNodePrefix() + config.getId(), (Class<IconButtonNode>)getNodeClass(), observer);\r
+\r
+        iconNode.setZIndex( Integer.MAX_VALUE );\r
+        iconNode.setTransform( getSymbolTransform(node, config.getOffset(), config.getRelativeTransform()));\r
+\r
+        iconNode.setData(result);\r
+            \r
+    }\r
+\r
+    @Override\r
+    protected void cleanupStyleForNode(EvaluationContext observer, INode node) {\r
+       ProfileVariables.denyChildren(node, getNodePrefix());\r
+    }\r
+\r
+}\r