]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconButtonStyleBase.java
04d5a500557a029be35e6c96f97d8d5a6c635423
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / profile / IconButtonStyleBase.java
1 package org.simantics.diagram.profile;\r
2 \r
3 import java.awt.geom.AffineTransform;\r
4 \r
5 import org.simantics.datatypes.literal.Vec2d;\r
6 import org.simantics.scenegraph.INode;\r
7 import org.simantics.scenegraph.g2d.IG2DNode;\r
8 import org.simantics.scenegraph.g2d.nodes.SingleElementNode;\r
9 import org.simantics.scenegraph.profile.EvaluationContext;\r
10 import org.simantics.scenegraph.profile.common.ProfileVariables;\r
11 import org.simantics.scenegraph.utils.NodeUtil;\r
12 \r
13 /**\r
14  * @author Antti Villberg\r
15  * @author Tuukka Lehtonen\r
16  */\r
17 public abstract class IconButtonStyleBase<T extends IconButtonResult> extends StyleBase<T> {\r
18 \r
19         abstract protected String getNodePrefix();\r
20         abstract protected Class<?> getNodeClass();\r
21         \r
22     private AffineTransform translateAndScaleIfNeeded(AffineTransform tr, Vec2d offset, boolean relativeTransform) {\r
23         if(relativeTransform) {\r
24                 if(!offset.isZero()) {\r
25                         tr = new AffineTransform(tr);\r
26                         tr.translate(offset.x, offset.y);\r
27                 }\r
28         } else {\r
29                 Vec2d translation = new Vec2d(tr.getTranslateX()+offset.x, tr.getTranslateY()+offset.y);\r
30                 tr = new AffineTransform();\r
31                 tr.translate(translation.x, translation.y);\r
32         }\r
33         return tr;\r
34     }\r
35     \r
36     private AffineTransform getSymbolTransform(INode node, Vec2d offset, boolean relativeTransform) {\r
37         if(node instanceof SingleElementNode) {\r
38                 SingleElementNode s = (SingleElementNode)node;\r
39                 INode symbol = NodeUtil.findChildByPrefix(s, "composite_image"); \r
40                 return translateAndScaleIfNeeded(symbol != null ? ((IG2DNode)symbol).getTransform() : new AffineTransform(), offset, relativeTransform);\r
41         }\r
42         return null;\r
43     }\r
44     \r
45     @Override\r
46     public void applyStyleForNode(EvaluationContext observer, INode node, T result) {\r
47 \r
48         if (result == null) {\r
49             ProfileVariables.denyChildren(node, getNodePrefix());\r
50             return;\r
51         }\r
52 \r
53         IconButtonState state = result.getState();\r
54         IconButtonConfiguration config = state.getConfiguration(); \r
55         \r
56         if (config.getOffset() == null) {\r
57                 ProfileVariables.denyChild(node, getNodePrefix() + config.getId());\r
58                 return;\r
59         }\r
60 \r
61         @SuppressWarnings("unchecked")\r
62                 IconButtonNode iconNode = ProfileVariables.claimChild(node, "", getNodePrefix() + config.getId(), (Class<IconButtonNode>)getNodeClass(), observer);\r
63 \r
64         iconNode.setZIndex( Integer.MAX_VALUE );\r
65         iconNode.setTransform( getSymbolTransform(node, config.getOffset(), config.getRelativeTransform()));\r
66 \r
67         iconNode.setData(result);\r
68             \r
69     }\r
70 \r
71     @Override\r
72     protected void cleanupStyleForNode(EvaluationContext observer, INode node) {\r
73         ProfileVariables.denyChildren(node, getNodePrefix());\r
74     }\r
75 \r
76 }\r