]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java
Merge "Refactoring of simulator toolkit"
[simantics/platform.git] / bundles / org.simantics.simulator.toolkit / src / org / simantics / simulator / toolkit / StandardNodeManager.java
index 87ae4f32f3b7394d1e8168c705c2584ba0ae3f8c..b8a549087fdb1c745cb6287f95b5faf7ba88a892 100644 (file)
@@ -13,6 +13,7 @@
 package org.simantics.simulator.toolkit;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -43,10 +44,10 @@ import gnu.trove.set.hash.THashSet;
 /**
  * StandardNodeManager gives default implementations to some methods
  * of NodeManager.
- * 
+ *
  * @author Antti Villberg
  */
-public abstract class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport<Node>> implements NodeManager<Node> {
+public class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport<Node>> implements NodeManager<Node> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(StandardNodeManager.class);
 
@@ -108,15 +109,15 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
                     return  System.identityHashCode(o1);
                 } else {
                     if(o1.equals(o2)) return 0;
-                    return System.identityHashCode(o1) - System.identityHashCode(o2);  
+                    return System.identityHashCode(o1) - System.identityHashCode(o2);
                 }
             }
         }
 
     };
 
-    THashMap<Node, Variant> valueCache = new THashMap<>(); 
-    protected THashMap<Node, THashSet<Runnable>> listeners = new THashMap<>(); 
+    THashMap<Node, Variant> valueCache = new THashMap<>();
+    protected THashMap<Node, THashSet<Runnable>> listeners = new THashMap<>();
 
     AtomicBoolean fireNodeListenersScheduled = new AtomicBoolean(false);
     Runnable fireNodeListeners = new Runnable() {
@@ -136,7 +137,7 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
         }
     };
 
-    Runnable clearValueCache = () -> valueCache.clear(); 
+    Runnable clearValueCache = () -> valueCache.clear();
 
     public StandardNodeManager(StandardRealm<Node,Engine> realm, Node root) {
         assert(realm != null);
@@ -263,6 +264,20 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
         }
     }
 
+    public void refreshVariable(Node node) {
+        realm.asyncExec(() -> {
+            valueCache.remove(node);
+            synchronized(listeners) {
+                THashSet<Runnable> runnables = listeners.get(node);
+                if (runnables != null) {
+                    for (Runnable r : runnables) {
+                        r.run();
+                    }
+                }
+            }
+        });
+    }
+
     public void refreshVariables() {
         realm.asyncExec(clearValueCache);
         fireNodeListeners();
@@ -308,6 +323,23 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
     @Override
     public void setValue(Node node, Object value, Binding binding)
             throws NodeManagerException {
+       updateValueInner(node, value, binding);
+        refreshVariable(node);
+    }
+
+    //Update the value of the node and remove from valueCache only the references nodes
+    public void setValueAndFireSelectedListeners(Node node, Object value, Binding binding, Set<Node> references) throws NodeManagerException {
+       if(references.size() > 0) {
+               for(Node n : references) {
+                       valueCache.remove(n);
+               }
+       }
+       updateValueInner(node, value, binding);
+       fireNodeListenersSync();
+    }
+    
+    //Update the value of the node helper method
+    private void updateValueInner(Node node, Object value, Binding binding) throws NodeManagerException {
         checkThreadAccess();
         Binding targetBinding = realm.getEngine().getEngineBinding(node);
         if(binding.equals(targetBinding)) {
@@ -327,7 +359,6 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
                 throw new NodeManagerException(e);
             }
         }
-        refreshVariables();
     }
 
     @Override
@@ -336,7 +367,7 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
             String id = getRealmId();
             int lastSlash = id.lastIndexOf("/");
             if(lastSlash == -1) throw new IllegalStateException("Invalid realm id " + id);
-            String name = id.substring(lastSlash+1); 
+            String name = id.substring(lastSlash+1);
             return name;
         } else {
             return realm.getEngine().getName(node);
@@ -394,4 +425,9 @@ public abstract class StandardNodeManager<Node, Engine extends StandardNodeManag
         listeners.clear();
     }
 
+    @Override
+    public Set<String> getClassifications(Node node) throws NodeManagerException {
+        return Collections.emptySet();
+    }
+
 }
\ No newline at end of file