1 package org.simantics.diagram.profile;
\r
3 import java.awt.Graphics2D;
\r
4 import java.awt.geom.AffineTransform;
\r
5 import java.awt.geom.Rectangle2D;
\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
14 public class IconNode extends IconButtonNode {
\r
17 NO, INCREASE, DECREASE
\r
21 private SVGNode lo = new SVGNode();
\r
22 private SVGNode mid = new SVGNode();
\r
23 private SVGNode hi = new SVGNode();
\r
25 private SVGNode current;
\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
32 private void setBlink(IconNode.Blink blink) {
\r
34 if(Blink.NO == blink && Blink.NO != this.blink) Updater.getInstance().unregister(this);
\r
36 if(Blink.NO != blink && Blink.NO == this.blink) Updater.getInstance().register(this);
\r
41 private void setValue(double value) {
\r
43 if(value < config.loValue) {
\r
46 } else if (value > config.hiValue) {
\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
55 previousValue = value;
\r
56 previousValueTime = System.nanoTime();
\r
60 private void setConfig(B config) {
\r
62 if(this.config == config) return;
\r
64 if(config.loColor != null) {
\r
65 String loIcon = createSVG(config.iconName, config.loColor, config.size);
\r
68 if(config.midColor != null) {
\r
69 String midIcon = createSVG(config.iconName, config.midColor, config.size);
\r
70 mid.setData(midIcon);
\r
72 if(config.hiColor != null) {
\r
73 String hiIcon = createSVG(config.iconName, config.hiColor, config.size);
\r
77 this.config = config;
\r
81 public void setA(A data) {
\r
83 setConfig(data.config);
\r
84 setValue(data.value);
\r
89 public void cleanup() {
\r
90 Updater.getInstance().unregister(this);
\r
95 public void render(Graphics2D g2d) {
\r
97 AffineTransform ot = null;
\r
98 if (!transform.isIdentity()) {
\r
99 ot = g2d.getTransform();
\r
100 g2d.transform(transform);
\r
103 if(Blink.NO == blink) {
\r
104 current.render(g2d);
\r
106 long time = Updater.getInstance().getTime();
\r
108 // Sanity check: turn blink of when no data for 2 seconds.
\r
109 if(time-previousValueTime > 2000000000L) {
\r
111 setBlink(Blink.NO);
\r
113 long halfSeconds = time / 500000000L;
\r
114 if((halfSeconds & 1) == 0) {
\r
117 if(Blink.INCREASE == blink) {
\r
128 g2d.setTransform(ot);
\r
132 Rectangle2D EMPTY = new Rectangle2D.Double(0, 0, 0, 0);
\r
135 public Rectangle2D getBoundsInLocal() {
\r
140 void setData(IconButtonResult data) {
\r
141 IconResult ir = (IconResult)data;
\r
145 public String createSVG(String iconName, RGB.Integer rgb, Vec2d scale) {
\r
146 return Activator.ICON_PROVIDER.apply(iconName, rgb, scale);
\r