]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetNodeManager.java
Refactoring of simulator toolkit
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / SpreadsheetNodeManager.java
index a6ebeb0980ad0eb811d75b9c31e28d7f318a33ab..caa6dc23f4602d10589187018c99f66a9f1f9a24 100644 (file)
@@ -1,23 +1,26 @@
 package org.simantics.spreadsheet.graph;
 
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
-import org.simantics.db.layer0.StandardNodeManager;
+import org.simantics.databoard.binding.Binding;
 import org.simantics.layer0.Layer0;
+import org.simantics.simulator.toolkit.StandardNodeManager;
 import org.simantics.simulator.variable.exceptions.NodeManagerException;
 import org.simantics.spreadsheet.resource.SpreadsheetResource;
 import org.simantics.structural.stubs.StructuralResource2;
 
 @SuppressWarnings("rawtypes")
 public class SpreadsheetNodeManager extends StandardNodeManager<SheetNode, SpreadsheetBook> {
-       
+
     public SpreadsheetNodeManager(SpreadsheetRealm realm) {
         super(realm, realm.getEngine());
     }
 
     static final Set<String> COMPONENT_CLASS = Collections.singleton(StructuralResource2.URIs.Component);
-            
+
     @Override
     public Set<String> getClassifications(SheetNode node) throws NodeManagerException {
         checkThreadAccess();
@@ -26,22 +29,53 @@ public class SpreadsheetNodeManager extends StandardNodeManager<SheetNode, Sprea
         else
             return Collections.emptySet();
     }
-    
+
     @Override
     public String getPropertyURI(SheetNode parent, SheetNode property) {
-       if(property instanceof SpreadsheetCellContent) {
+        if(property instanceof SpreadsheetCellContent) {
             return SpreadsheetResource.URIs.Cell_content;
-       } else if(property instanceof SpreadsheetTypeNode) {
+        } else if(property instanceof SpreadsheetTypeNode) {
             return Layer0.URIs.typeURI;
-       } else if(property instanceof SpreadsheetCellContentExpression) {
+        } else if(property instanceof SpreadsheetCellContentExpression) {
             return Layer0.URIs.SCLValue_expression;
-       } else if (property instanceof SpreadsheetCellStyle) {
-           return SpreadsheetResource.URIs.Cell_style;
-       } else if (property instanceof SpreadsheetCellEditable){
-           return SpreadsheetResource.URIs.Cell_editable;
-       } else {
-               return null;
-       }
+        } else if (property instanceof SpreadsheetCellStyle) {
+            return SpreadsheetResource.URIs.Cell_style;
+        } else if (property instanceof SpreadsheetCellEditable){
+            return SpreadsheetResource.URIs.Cell_editable;
+        } else {
+            return null;
+        }
+    }
+    
+    //Custom setValue logic for SpreadsheetNodeManager - calls the setValueAndFireSelectedListeners
+    @Override
+    public void setValue(SheetNode node, Object value, Binding binding) throws NodeManagerException {
+       Set<SheetNode> dirtyNodeContents = findDirtyNodeContents(node);
+       super.setValueAndFireSelectedListeners(node, value, binding, dirtyNodeContents);
     }
     
+    //Find the cells that are used by this cell and their SpreadsheetContents, so that they can be marked as dirty later
+    public Set<SheetNode> findDirtyNodeContents(SheetNode node){
+       Set<SheetNode> dirty = new HashSet<>();
+       
+       SpreadsheetCell sscell = null;
+       if(node instanceof SpreadsheetCell) {
+               sscell = (SpreadsheetCell)node;
+       } else if (node instanceof SpreadsheetCellContent) {
+               sscell = ((SpreadsheetCellContent)node).cell;
+       }
+                       
+       if(sscell != null) {
+               Set<SpreadsheetCell> result = ((SpreadsheetRealm)super.getRealm()).getEngine().invalidate(sscell);
+               dirty.addAll(result);
+       }
+                       
+       Set<SheetNode> dirtyNodeContents = new HashSet<>();
+       for(SheetNode cell : dirty) {
+               Map<String, SheetNode> properties = cell.getProperties();
+               dirtyNodeContents.add((SpreadsheetCellContent)properties.get("content"));
+       }
+       
+       return dirtyNodeContents;
+    }
 }