1 package org.simantics.diagram.flag;
\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
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
30 public class FlagSceneGraph implements SceneGraph {
\r
32 private static final long serialVersionUID = 35208146123929197L;
\r
34 public static final FlagSceneGraph INSTANCE = new FlagSceneGraph();
\r
37 * References an array of {@link FlagTextInfo} instances and
\r
38 * {@link SVGImageInfo}.
\r
40 public static final Key KEY_FLAG_VISUALS = new KeyOf(Bean[].class, "FLAG_MONITORS");
\r
42 public static final Key KEY_VISUAL_SG_NODE = new SceneGraphNodeKey(Node.class, "FLAG_VISUAL_NODE");
\r
44 private static final String VISUAL_ROOT = "visual";
\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
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
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
68 String[] flagText = e.getHint(FlagClass.KEY_FLAG_TEXT);
\r
69 if (flagText == null) {
\r
71 Text t = e.getElementClass().getAtMostOneItemOfClass(Text.class);
\r
73 String text = t.getText(e);
\r
75 flagText = new String[] { text };
\r
80 //flagText = new String[] { String.format("%3.1f", dir) + " deg", "FOO"};
\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
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
93 ElementUtils.removePossibleNode(e, KEY_VISUAL_SG_NODE);
\r
94 e.removeHint(KEY_VISUAL_SG_NODE);
\r
96 FlagNode flag = ElementUtils.getOrCreateNode(e, parent, FlagClass.KEY_SG_NODE, ElementUtils.generateNodeId(e), FlagNode.class);
\r
108 horizAlign.ordinal(),
\r
109 vertAlign.ordinal());
\r
110 AffineTransform at = ElementUtils.getTransform(e);
\r
111 if(at != null) flag.setTransform(at);
\r
115 ElementUtils.removePossibleNode(e, FlagClass.KEY_SG_NODE);
\r
116 e.removeHint(FlagClass.KEY_SG_NODE);
\r
118 G2DParentNode par = ElementUtils.getOrCreateNode(e, parent, KEY_VISUAL_SG_NODE, VISUAL_ROOT, G2DParentNode.class);
\r
119 if (par.getNodeCount() > 0)
\r
122 AffineTransform at = ElementUtils.getTransform(e);
\r
123 if(at != null) par.setTransform(at);
\r
125 for (Bean visual : flagVisuals) {
\r
126 if (visual instanceof FlagTextInfo) {
\r
127 FlagTextInfo info = (FlagTextInfo) visual;
\r
129 String text = info.text;
\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
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