]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/flag/FlagSceneGraph.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / flag / FlagSceneGraph.java
1 package org.simantics.diagram.flag;\r
2 \r
3 import java.awt.Color;\r
4 import java.awt.Shape;\r
5 import java.awt.geom.AffineTransform;\r
6 import java.awt.geom.Rectangle2D;\r
7 \r
8 import org.simantics.databoard.util.Bean;\r
9 import org.simantics.diagram.adapter.FlagTextInfo;\r
10 import org.simantics.diagram.adapter.SVGImageInfo;\r
11 import org.simantics.diagram.elements.TextNode;\r
12 import org.simantics.g2d.element.ElementUtils;\r
13 import org.simantics.g2d.element.IElement;\r
14 import org.simantics.g2d.element.SceneGraphNodeKey;\r
15 import org.simantics.g2d.element.handler.Outline;\r
16 import org.simantics.g2d.element.handler.SceneGraph;\r
17 import org.simantics.g2d.element.handler.Text;\r
18 import org.simantics.g2d.elementclass.FlagClass;\r
19 import org.simantics.g2d.elementclass.FlagClass.Type;\r
20 import org.simantics.g2d.utils.Alignment;\r
21 import org.simantics.scenegraph.Node;\r
22 import org.simantics.scenegraph.g2d.G2DParentNode;\r
23 import org.simantics.scenegraph.g2d.nodes.FlagNode;\r
24 import org.simantics.scenegraph.g2d.nodes.SVGNode;\r
25 import org.simantics.ui.colors.Colors;\r
26 import org.simantics.ui.fonts.Fonts;\r
27 import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
28 import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;\r
29 \r
30 public class FlagSceneGraph implements SceneGraph {\r
31 \r
32     private static final long serialVersionUID = 35208146123929197L;\r
33 \r
34     public static final FlagSceneGraph INSTANCE           = new FlagSceneGraph();\r
35 \r
36     /**\r
37      * References an array of {@link FlagTextInfo} instances and\r
38      * {@link SVGImageInfo}.\r
39      */\r
40     public static final Key            KEY_FLAG_VISUALS  = new KeyOf(Bean[].class, "FLAG_MONITORS");\r
41 \r
42     public static final Key            KEY_VISUAL_SG_NODE = new SceneGraphNodeKey(Node.class, "FLAG_VISUAL_NODE");\r
43 \r
44     private static final String        VISUAL_ROOT        = "visual";\r
45 \r
46     @Override\r
47     public void cleanup(IElement e) {\r
48         ElementUtils.removePossibleNode(e, FlagClass.KEY_SG_NODE);\r
49         ElementUtils.removePossibleNode(e, KEY_VISUAL_SG_NODE);\r
50     }\r
51 \r
52     @Override\r
53     public void init(IElement e, G2DParentNode parent) {\r
54         Bean[] flagVisuals = e.getHint(KEY_FLAG_VISUALS);\r
55         if (flagVisuals == null || flagVisuals.length == 0) {\r
56             Color fc = ElementUtils.getFillColor(e, Color.WHITE);\r
57             Color bc = ElementUtils.getBorderColor(e, Color.BLACK);\r
58             Color tc = ElementUtils.getTextColor(e, Color.BLACK);\r
59 \r
60             Outline outline = e.getElementClass().getSingleItem(Outline.class);\r
61             Shape shape = outline.getElementShape(e);\r
62             Type type = FlagClass.getType(e);\r
63             double dir = FlagClass.getDirection(e);\r
64             double width = e.getHint(FlagClass.KEY_FLAG_WIDTH);\r
65             double height = e.getHint(FlagClass.KEY_FLAG_HEIGHT);\r
66             double beakAngle = e.getHint(FlagClass.KEY_FLAG_BEAK_ANGLE);\r
67 \r
68             String[] flagText = e.getHint(FlagClass.KEY_FLAG_TEXT);\r
69             if (flagText == null) {\r
70                 // fallback option.\r
71                 Text t = e.getElementClass().getAtMostOneItemOfClass(Text.class);\r
72                 if (t != null) {\r
73                     String text = t.getText(e);\r
74                     if (text != null)\r
75                         flagText = new String[] { text };\r
76                 }\r
77             }\r
78 \r
79             // DEBUG TEXT\r
80             //flagText = new String[] { String.format("%3.1f", dir) + " deg", "FOO"};\r
81 \r
82             Rectangle2D textArea = e.getHint(FlagClass.KEY_FLAG_TEXT_AREA);\r
83             if (textArea == null) {\r
84                 double beakLength = FlagClass.getBeakLength(height, beakAngle);\r
85                 textArea = type == Type.In\r
86                         ? new Rectangle2D.Double(-width-beakLength, -height*0.5, width, height)\r
87                 : new Rectangle2D.Double(0, -height*0.5, width, height);\r
88             }\r
89 \r
90             Alignment horizAlign = ElementUtils.getHintOrDefault(e, FlagClass.KEY_TEXT_HORIZONTAL_ALIGN, Alignment.LEADING);\r
91             Alignment vertAlign = ElementUtils.getHintOrDefault(e, FlagClass.KEY_TEXT_VERTICAL_ALIGN, Alignment.CENTER);\r
92 \r
93             ElementUtils.removePossibleNode(e, KEY_VISUAL_SG_NODE);\r
94             e.removeHint(KEY_VISUAL_SG_NODE);\r
95 \r
96             FlagNode flag = ElementUtils.getOrCreateNode(e, parent, FlagClass.KEY_SG_NODE, ElementUtils.generateNodeId(e), FlagNode.class);\r
97             flag.init(shape,\r
98                     flagText,\r
99                     FlagClass.STROKE,\r
100                     bc,\r
101                     fc,\r
102                     tc,\r
103                     (float) width,\r
104                     (float) height,\r
105                     (float) dir,\r
106                     (float) beakAngle,\r
107                     textArea,\r
108                     horizAlign.ordinal(),\r
109                     vertAlign.ordinal());\r
110             AffineTransform at = ElementUtils.getTransform(e);\r
111             if(at != null) flag.setTransform(at);\r
112 \r
113         } else {\r
114 \r
115             ElementUtils.removePossibleNode(e, FlagClass.KEY_SG_NODE);\r
116             e.removeHint(FlagClass.KEY_SG_NODE);\r
117 \r
118             G2DParentNode par = ElementUtils.getOrCreateNode(e, parent, KEY_VISUAL_SG_NODE, VISUAL_ROOT, G2DParentNode.class);\r
119             if (par.getNodeCount() > 0)\r
120                 par.removeNodes();\r
121 \r
122             AffineTransform at = ElementUtils.getTransform(e);\r
123             if(at != null) par.setTransform(at);\r
124 \r
125             for (Bean visual : flagVisuals) {\r
126                 if (visual instanceof FlagTextInfo) {\r
127                     FlagTextInfo info = (FlagTextInfo) visual;\r
128 \r
129                     String text = info.text;\r
130 \r
131                     TextNode cellNode = par.getOrCreateNode(info.id, TextNode.class);\r
132                     if (info.width >= 0.0f)\r
133                         cellNode.setFixedWidth(info.width);\r
134                     cellNode.setWrapText(info.wrapText);\r
135                     cellNode.setHorizontalAlignment((byte)info.hAlignment.ordinal());\r
136                     cellNode.setVerticalAlignment((byte)info.vAlignment.ordinal());\r
137                     if (info.borderWidth >= 0.0f)\r
138                         cellNode.setBorderWidth(info.borderWidth);\r
139                     if (info.borderColor != null && info.borderWidth > 0.0f)\r
140                         cellNode.setBorderColor(Colors.awt(info.borderColor));\r
141                     if (info.backgroundColor != null)\r
142                         cellNode.setBackgroundColor(Colors.awt(info.backgroundColor));\r
143                     if (info.font != null)\r
144                         cellNode.setFont(Fonts.awt(info.font));\r
145                     if (info.color != null)\r
146                         cellNode.setColor(Colors.awt(info.color));\r
147                     if (info.transform != null)\r
148                         cellNode.setTransform(new AffineTransform(info.transform));\r
149                     if (text != null)\r
150                         cellNode.setText(text);\r
151                 } else if (visual instanceof SVGImageInfo) {\r
152                     SVGImageInfo info = (SVGImageInfo) visual;\r
153                     SVGNode svgNode = par.getOrCreateNode(info.id, SVGNode.class);\r
154                     if (info.svgDocument != null && !info.svgDocument.isEmpty())\r
155                         svgNode.setData(info.svgDocument);\r
156                     if (info.transform != null)\r
157                         svgNode.setTransform(new AffineTransform(info.transform));\r
158                 }\r
159             }\r
160         }\r
161     }\r
162 \r
163 }\r