-package org.simantics.diagram.profile;\r
-\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Map;\r
-import java.util.concurrent.TimeUnit;\r
-import java.util.concurrent.atomic.AtomicBoolean;\r
-\r
-import org.simantics.diagram.elements.DiagramNodeUtil;\r
-import org.simantics.g2d.canvas.ICanvasContext;\r
-import org.simantics.scenegraph.INode;\r
-import org.simantics.scenegraph.g2d.G2DNode;\r
-import org.simantics.utils.threads.ThreadUtils;\r
-\r
-class Updater implements Runnable {\r
-\r
- private static Updater INSTANCE;\r
- \r
- Map<INode, ICanvasContext> requesters = new HashMap<INode, ICanvasContext>();\r
- \r
- AtomicBoolean state = new AtomicBoolean(false);\r
- \r
- private static long time = System.nanoTime();\r
- \r
- private Updater() {\r
- }\r
- \r
- @Override\r
- public void run() {\r
-\r
- // Stop this if nothing is to be done, need synchonization since this is not AWT\r
- synchronized(requesters) {\r
- if(requesters.isEmpty()) {\r
- state.set(false);\r
- throw new RuntimeException();\r
- }\r
- }\r
- \r
- // TODO: in unit tests this should not be AWT\r
- ThreadUtils.AWT_EDT.execute(new Runnable() {\r
-\r
- @Override\r
- public void run() {\r
- \r
- time = System.nanoTime();\r
- \r
- synchronized(requesters) {\r
- HashSet<ICanvasContext> ctxSet = new HashSet<ICanvasContext>();\r
- for(ICanvasContext ctx : requesters.values()) {\r
- if(ctx != null) {\r
- if(ctxSet.add(ctx)) ctx.getContentContext().setDirty();\r
- }\r
- }\r
- }\r
- \r
- }\r
- \r
- });\r
- \r
- }\r
- \r
- public void register(INode node) {\r
- // We use ths size of this map to determine whether updates are needed, this is done in AWT thread\r
- synchronized(requesters) {\r
- if(requesters.size() == 0) {\r
- if(state.compareAndSet(false, true)) {\r
- ThreadUtils.getNonBlockingWorkExecutor().scheduleAtFixedRate(this, 0, 500, TimeUnit.MILLISECONDS);\r
- }\r
- }\r
- ICanvasContext context = DiagramNodeUtil.getPossibleCanvasContext((G2DNode)node);\r
- requesters.put(node, context);\r
- }\r
- }\r
- \r
- public void unregister(INode node) {\r
- synchronized(requesters) {\r
- requesters.remove(node);\r
- }\r
- }\r
- \r
- public long getTime() {\r
- return time;\r
- }\r
- \r
- public static Updater getInstance() {\r
- if(INSTANCE == null) {\r
- INSTANCE = new Updater();\r
- }\r
- return INSTANCE;\r
- }\r
- \r
+package org.simantics.diagram.profile;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.simantics.diagram.elements.DiagramNodeUtil;
+import org.simantics.g2d.canvas.ICanvasContext;
+import org.simantics.scenegraph.INode;
+import org.simantics.scenegraph.g2d.G2DNode;
+import org.simantics.utils.threads.ThreadUtils;
+
+class Updater implements Runnable {
+
+ private static Updater INSTANCE;
+
+ Map<INode, ICanvasContext> requesters = new HashMap<INode, ICanvasContext>();
+
+ AtomicBoolean state = new AtomicBoolean(false);
+
+ private static long time = System.nanoTime();
+
+ private Updater() {
+ }
+
+ @Override
+ public void run() {
+
+ // Stop this if nothing is to be done, need synchonization since this is not AWT
+ synchronized(requesters) {
+ if(requesters.isEmpty()) {
+ state.set(false);
+ throw new RuntimeException();
+ }
+ }
+
+ // TODO: in unit tests this should not be AWT
+ ThreadUtils.AWT_EDT.execute(new Runnable() {
+
+ @Override
+ public void run() {
+
+ time = System.nanoTime();
+
+ synchronized(requesters) {
+ HashSet<ICanvasContext> ctxSet = new HashSet<ICanvasContext>();
+ for(ICanvasContext ctx : requesters.values()) {
+ if(ctx != null) {
+ if(ctxSet.add(ctx)) ctx.getContentContext().setDirty();
+ }
+ }
+ }
+
+ }
+
+ });
+
+ }
+
+ public void register(INode node) {
+ // We use ths size of this map to determine whether updates are needed, this is done in AWT thread
+ synchronized(requesters) {
+ if(requesters.size() == 0) {
+ if(state.compareAndSet(false, true)) {
+ ThreadUtils.getNonBlockingWorkExecutor().scheduleAtFixedRate(this, 0, 500, TimeUnit.MILLISECONDS);
+ }
+ }
+ ICanvasContext context = DiagramNodeUtil.getPossibleCanvasContext((G2DNode)node);
+ requesters.put(node, context);
+ }
+ }
+
+ public void unregister(INode node) {
+ synchronized(requesters) {
+ requesters.remove(node);
+ }
+ }
+
+ public long getTime() {
+ return time;
+ }
+
+ public static Updater getInstance() {
+ if(INSTANCE == null) {
+ INSTANCE = new Updater();
+ }
+ return INSTANCE;
+ }
+