--- /dev/null
+package org.simantics.diagram.profile;\r
+\r
+import java.awt.Graphics2D;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+\r
+import org.simantics.datatypes.literal.RGB;\r
+import org.simantics.datatypes.literal.Vec2d;\r
+import org.simantics.diagram.internal.Activator;\r
+import org.simantics.diagram.profile.IconResult.A;\r
+import org.simantics.diagram.profile.IconResult.B;\r
+import org.simantics.scenegraph.g2d.nodes.SVGNode;\r
+\r
+public class IconNode extends IconButtonNode {\r
+ \r
+ enum Blink {\r
+ NO, INCREASE, DECREASE\r
+ }\r
+ \r
+ private B config;\r
+ private SVGNode lo = new SVGNode();\r
+ private SVGNode mid = new SVGNode();\r
+ private SVGNode hi = new SVGNode();\r
+\r
+ private SVGNode current;\r
+ \r
+ private static final long serialVersionUID = -7850188341977866325L;\r
+ private IconNode.Blink blink = Blink.NO;\r
+ private double previousValue = Double.NaN;\r
+ private long previousValueTime = System.nanoTime();\r
+ \r
+ private void setBlink(IconNode.Blink blink) {\r
+ // Was turned off\r
+ if(Blink.NO == blink && Blink.NO != this.blink) Updater.getInstance().unregister(this);\r
+ // Was turned on\r
+ if(Blink.NO != blink && Blink.NO == this.blink) Updater.getInstance().register(this);\r
+ // Record state\r
+ this.blink = blink;\r
+ }\r
+ \r
+ private void setValue(double value) {\r
+ \r
+ if(value < config.loValue) {\r
+ current = lo;\r
+ setBlink(Blink.NO);\r
+ } else if (value > config.hiValue) {\r
+ current = hi;\r
+ setBlink(Blink.NO);\r
+ } else {\r
+ current = mid;\r
+ if(value-previousValue > 1e-6) setBlink(Blink.INCREASE);\r
+ else if(previousValue-value > 1e-6) setBlink(Blink.DECREASE);\r
+ else setBlink(Blink.NO);\r
+ }\r
+ previousValue = value;\r
+ previousValueTime = System.nanoTime();\r
+ \r
+ }\r
+ \r
+ private void setConfig(B config) {\r
+\r
+ if(this.config == config) return;\r
+ \r
+ if(config.loColor != null) {\r
+ String loIcon = createSVG(config.iconName, config.loColor, config.size);\r
+ lo.setData(loIcon);\r
+ }\r
+ if(config.midColor != null) {\r
+ String midIcon = createSVG(config.iconName, config.midColor, config.size);\r
+ mid.setData(midIcon);\r
+ }\r
+ if(config.hiColor != null) {\r
+ String hiIcon = createSVG(config.iconName, config.hiColor, config.size);\r
+ hi.setData(hiIcon);\r
+ }\r
+ \r
+ this.config = config;\r
+ \r
+ }\r
+ \r
+ public void setA(A data) {\r
+\r
+ setConfig(data.config);\r
+ setValue(data.value);\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void cleanup() {\r
+ Updater.getInstance().unregister(this);\r
+ super.cleanup();\r
+ }\r
+ \r
+ @Override\r
+ public void render(Graphics2D g2d) {\r
+\r
+ AffineTransform ot = null;\r
+ if (!transform.isIdentity()) {\r
+ ot = g2d.getTransform();\r
+ g2d.transform(transform);\r
+ }\r
+ \r
+ if(Blink.NO == blink) {\r
+ current.render(g2d);\r
+ } else {\r
+ long time = Updater.getInstance().getTime();\r
+ \r
+ // Sanity check: turn blink of when no data for 2 seconds.\r
+ if(time-previousValueTime > 2000000000L) {\r
+ mid.render(g2d);\r
+ setBlink(Blink.NO);\r
+ } else {\r
+ long halfSeconds = time / 500000000L; \r
+ if((halfSeconds & 1) == 0) {\r
+ mid.render(g2d);\r
+ } else {\r
+ if(Blink.INCREASE == blink) {\r
+ hi.render(g2d);\r
+ } else {\r
+ lo.render(g2d);\r
+ }\r
+ }\r
+ }\r
+ \r
+ }\r
+\r
+ if (ot != null)\r
+ g2d.setTransform(ot);\r
+ \r
+ }\r
+\r
+ Rectangle2D EMPTY = new Rectangle2D.Double(0, 0, 0, 0);\r
+ \r
+ @Override\r
+ public Rectangle2D getBoundsInLocal() {\r
+ return EMPTY;\r
+ }\r
+\r
+ @Override\r
+ void setData(IconButtonResult data) {\r
+ IconResult ir = (IconResult)data;\r
+ setA(ir.getA());\r
+ }\r
+ \r
+ public String createSVG(String iconName, RGB.Integer rgb, Vec2d scale) {\r
+ return Activator.ICON_PROVIDER.apply(iconName, rgb, scale);\r
+ }\r
+ \r
+}
\ No newline at end of file