X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.simulator.toolkit%2Fsrc%2Forg%2Fsimantics%2Fsimulator%2Ftoolkit%2FStandardNodeManager.java;h=8a51fd330764959e7c62f4cc292c2ab2e36fb0c0;hp=87ae4f32f3b7394d1e8168c705c2584ba0ae3f8c;hb=9b9f2a9206583894edb1a4a4a93a6c6720c8dddd;hpb=1251d640abb698a4018ef1ea212f8cdf78befaaf diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java index 87ae4f32f..8a51fd330 100644 --- a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java @@ -43,7 +43,7 @@ import gnu.trove.set.hash.THashSet; /** * StandardNodeManager gives default implementations to some methods * of NodeManager. - * + * * @author Antti Villberg */ public abstract class StandardNodeManager> implements NodeManager { @@ -108,15 +108,15 @@ public abstract class StandardNodeManager valueCache = new THashMap<>(); - protected THashMap> listeners = new THashMap<>(); + THashMap valueCache = new THashMap<>(); + protected THashMap> listeners = new THashMap<>(); AtomicBoolean fireNodeListenersScheduled = new AtomicBoolean(false); Runnable fireNodeListeners = new Runnable() { @@ -136,7 +136,7 @@ public abstract class StandardNodeManager valueCache.clear(); + Runnable clearValueCache = () -> valueCache.clear(); public StandardNodeManager(StandardRealm realm, Node root) { assert(realm != null); @@ -263,6 +263,20 @@ public abstract class StandardNodeManager { + valueCache.remove(node); + synchronized(listeners) { + THashSet runnables = listeners.get(node); + if (runnables != null) { + for (Runnable r : runnables) { + r.run(); + } + } + } + }); + } + public void refreshVariables() { realm.asyncExec(clearValueCache); fireNodeListeners(); @@ -308,6 +322,23 @@ public abstract class StandardNodeManager 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 +358,6 @@ public abstract class StandardNodeManager