]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulation/src/org/simantics/simulation/experiment/Experiment.java
EXPERIMENT_STATE_READ needs to be triggered on state change
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / experiment / Experiment.java
index b4222df012e4a56d8533914fa0c751adfd724fef..827677451ab3d33d067e466f9db829869a3ad8a1 100644 (file)
@@ -19,6 +19,8 @@ import org.simantics.databoard.accessor.Accessor;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.procedure.Listener;
+import org.simantics.db.request.ExternalRead;
 import org.simantics.utils.datastructures.ListenerList;
 
 public abstract class Experiment implements IExperiment {
 import org.simantics.utils.datastructures.ListenerList;
 
 public abstract class Experiment implements IExperiment {
@@ -64,7 +66,7 @@ public abstract class Experiment implements IExperiment {
     
     @Override
     public ExperimentState getState(ReadGraph graph) throws DatabaseException {
     
     @Override
     public ExperimentState getState(ReadGraph graph) throws DatabaseException {
-       throw new UnsupportedOperationException();
+       return graph.syncRequest(EXPERIMENT_STATE_READ);
     }
 
     public void changeState(ExperimentState newState) {
     }
 
     public void changeState(ExperimentState newState) {
@@ -79,6 +81,7 @@ public abstract class Experiment implements IExperiment {
             localStateChange();
             for(IExperimentListener listener : listeners.getListeners())
                 listener.stateChanged(newState);
             localStateChange();
             for(IExperimentListener listener : listeners.getListeners())
                 listener.stateChanged(newState);
+            EXPERIMENT_STATE_READ.run();
         }
     }
 
         }
     }
 
@@ -136,4 +139,37 @@ public abstract class Experiment implements IExperiment {
         return identifier;
     }
 
         return identifier;
     }
 
+    static class ExperimentStateRead implements ExternalRead<ExperimentState>, Runnable {
+       
+       final private Experiment experiment;
+        private Listener<ExperimentState> listener = null;
+        
+        ExperimentStateRead(Experiment experiment) {
+               this.experiment = experiment;
+        }
+
+        @Override
+        public void register(ReadGraph graph, final Listener<ExperimentState> procedure) {
+            //System.out.println("IcTrackerRequest.register: " + procedure);
+            listener = procedure;
+            procedure.execute(experiment.state);
+        }
+
+        @Override
+        public void unregistered() {
+            //System.out.println("IcTrackerRequest.unregister: " + listener);
+            listener = null;
+        }
+
+        @Override
+        public void run() {
+            Listener<ExperimentState> l = listener;
+            //System.out.println("IcTrackerRequest.run: " + l);
+            if (l != null)
+                l.execute(experiment.state);
+        }
+    }
+
+    private ExperimentStateRead EXPERIMENT_STATE_READ = new ExperimentStateRead(this);
+    
 }
 }