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