]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconNode.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / profile / IconNode.java
1 package org.simantics.diagram.profile;\r
2 \r
3 import java.awt.Graphics2D;\r
4 import java.awt.geom.AffineTransform;\r
5 import java.awt.geom.Rectangle2D;\r
6 \r
7 import org.simantics.datatypes.literal.RGB;\r
8 import org.simantics.datatypes.literal.Vec2d;\r
9 import org.simantics.diagram.internal.Activator;\r
10 import org.simantics.diagram.profile.IconResult.A;\r
11 import org.simantics.diagram.profile.IconResult.B;\r
12 import org.simantics.scenegraph.g2d.nodes.SVGNode;\r
13 \r
14 public class IconNode extends IconButtonNode {\r
15         \r
16         enum Blink {\r
17                 NO, INCREASE, DECREASE\r
18         }\r
19         \r
20         private B config;\r
21         private SVGNode lo = new SVGNode();\r
22         private SVGNode mid = new SVGNode();\r
23         private SVGNode hi = new SVGNode();\r
24 \r
25         private SVGNode current;\r
26         \r
27         private static final long serialVersionUID = -7850188341977866325L;\r
28         private IconNode.Blink blink = Blink.NO;\r
29         private double previousValue = Double.NaN;\r
30         private long previousValueTime = System.nanoTime();\r
31         \r
32         private void setBlink(IconNode.Blink blink) {\r
33                 // Was turned off\r
34                 if(Blink.NO == blink && Blink.NO != this.blink) Updater.getInstance().unregister(this);\r
35                 // Was turned on\r
36                 if(Blink.NO != blink && Blink.NO == this.blink) Updater.getInstance().register(this);\r
37                 // Record state\r
38                 this.blink = blink;\r
39         }\r
40         \r
41         private void setValue(double value) {\r
42                 \r
43                 if(value < config.loValue) {\r
44                         current = lo;\r
45                         setBlink(Blink.NO);\r
46                 } else if (value > config.hiValue) {\r
47                         current = hi;\r
48                         setBlink(Blink.NO);\r
49                 } else {\r
50                         current = mid;\r
51                         if(value-previousValue > 1e-6) setBlink(Blink.INCREASE);\r
52                         else if(previousValue-value > 1e-6) setBlink(Blink.DECREASE);\r
53                         else setBlink(Blink.NO);\r
54                 }\r
55                 previousValue = value;\r
56                 previousValueTime = System.nanoTime();\r
57                 \r
58         }\r
59         \r
60         private void setConfig(B config) {\r
61 \r
62                 if(this.config == config) return;\r
63                 \r
64                 if(config.loColor != null) {\r
65                 String loIcon = createSVG(config.iconName, config.loColor, config.size);\r
66                 lo.setData(loIcon);\r
67                 }\r
68                 if(config.midColor != null) {\r
69                 String midIcon = createSVG(config.iconName, config.midColor, config.size);\r
70                 mid.setData(midIcon);\r
71                 }\r
72                 if(config.hiColor != null) {\r
73                 String hiIcon = createSVG(config.iconName, config.hiColor, config.size);\r
74                 hi.setData(hiIcon);\r
75                 }\r
76         \r
77         this.config = config;\r
78                 \r
79         }\r
80         \r
81         public void setA(A data) {\r
82 \r
83                 setConfig(data.config);\r
84         setValue(data.value);\r
85                 \r
86         }\r
87         \r
88     @Override\r
89     public void cleanup() {\r
90                 Updater.getInstance().unregister(this);\r
91         super.cleanup();\r
92     }\r
93         \r
94     @Override\r
95     public void render(Graphics2D g2d) {\r
96 \r
97                 AffineTransform ot = null;\r
98                 if (!transform.isIdentity()) {\r
99                         ot = g2d.getTransform();\r
100                         g2d.transform(transform);\r
101                 }\r
102         \r
103         if(Blink.NO == blink) {\r
104                 current.render(g2d);\r
105         } else {\r
106                 long time = Updater.getInstance().getTime();\r
107                 \r
108                 // Sanity check: turn blink of when no data for 2 seconds.\r
109                 if(time-previousValueTime > 2000000000L) {\r
110                         mid.render(g2d);\r
111                         setBlink(Blink.NO);\r
112                 } else {\r
113                         long halfSeconds = time / 500000000L; \r
114                         if((halfSeconds & 1) == 0) {\r
115                                 mid.render(g2d);\r
116                         } else {\r
117                                 if(Blink.INCREASE == blink) {\r
118                                         hi.render(g2d);\r
119                                 } else {\r
120                                         lo.render(g2d);\r
121                                 }\r
122                         }\r
123                 }\r
124                 \r
125         }\r
126 \r
127                 if (ot != null)\r
128                         g2d.setTransform(ot);\r
129         \r
130     }\r
131 \r
132     Rectangle2D EMPTY = new Rectangle2D.Double(0, 0, 0, 0);\r
133     \r
134         @Override\r
135         public Rectangle2D getBoundsInLocal() {\r
136                 return EMPTY;\r
137         }\r
138 \r
139         @Override\r
140         void setData(IconButtonResult data) {\r
141                 IconResult ir = (IconResult)data;\r
142                 setA(ir.getA());\r
143         }\r
144         \r
145     public String createSVG(String iconName, RGB.Integer rgb, Vec2d scale) {\r
146         return Activator.ICON_PROVIDER.apply(iconName, rgb, scale);\r
147     }\r
148         \r
149 }