--- /dev/null
+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