]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconNode.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/IconNode.java
new file mode 100644 (file)
index 0000000..27c6193
--- /dev/null
@@ -0,0 +1,149 @@
+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