]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetBook.java
Spreadsheet updates cell values properly
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / SpreadsheetBook.java
index b41e9c754fa751883896ce48b7b007f7edd0ce1d..d64d008edf713b1cfaf33a3e0fe28261bf188447 100644 (file)
@@ -6,13 +6,18 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.binding.Binding;
 import org.simantics.databoard.binding.mutable.Variant;
 import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.StandardEngine;
+import org.simantics.simulator.toolkit.StandardNodeManagerSupport;
+import org.simantics.simulator.variable.exceptions.NodeManagerException;
 import org.simantics.spreadsheet.graph.formula.SpreadsheetEvaluationEnvironment;
 import org.simantics.spreadsheet.graph.synchronization.LineNodeUpdater;
 import org.simantics.spreadsheet.graph.synchronization.LineUpdater;
@@ -33,7 +38,7 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.longs.LongArraySet;
 import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet;
 
-public class SpreadsheetBook implements SpreadsheetElement<SpreadsheetElement, SpreadsheetElement>, StandardEngine<SheetNode>, Serializable, SheetNode<SpreadsheetEngine, SheetNode>, Solver, SolverNameUtil, ComponentFactory<SheetLineComponent>, ModuleUpdaterFactoryBase<SheetLineComponent> {
+public class SpreadsheetBook implements StandardNodeManagerSupport<SheetNode>, SpreadsheetElement<SpreadsheetElement, SpreadsheetElement>, Serializable, SheetNode<SpreadsheetEngine, SheetNode>, Solver, SolverNameUtil, ComponentFactory<SheetLineComponent>, ModuleUpdaterFactoryBase<SheetLineComponent> {
 
        private static final long serialVersionUID = 7417208688311691396L;
        
@@ -90,7 +95,17 @@ public class SpreadsheetBook implements SpreadsheetElement<SpreadsheetElement, S
        }
        
        @Override
-       public Object getValue(SheetNode node) {
+       public Binding getEngineBinding(SheetNode node) throws NodeManagerException {
+               Object value = getEngineValue(node);
+               if(value instanceof Variant) return Bindings.VARIANT;
+               if(value instanceof String) return Bindings.STRING;
+               if(value instanceof Boolean) return Bindings.BOOLEAN;
+               else return Bindings.VOID;
+               
+       }
+       
+       @Override
+       public Object getEngineValue(SheetNode node) {
                if(node instanceof SpreadsheetCellContent) {
                        try {
                                SpreadsheetCellContent scc = (SpreadsheetCellContent)node;
@@ -139,7 +154,7 @@ public class SpreadsheetBook implements SpreadsheetElement<SpreadsheetElement, S
        }
 
        @Override
-       public void setValue(SheetNode node, Object value) {
+       public void setEngineValue(SheetNode node, Object value) {
        }
 
        @Override
@@ -316,7 +331,7 @@ public class SpreadsheetBook implements SpreadsheetElement<SpreadsheetElement, S
        }
 
        @Override
-       public void addSubprocess(String name) {
+       public void addSubprocess(String name, String subprocessType) {
                ensureSubprocess(name);
        }
        
@@ -352,7 +367,26 @@ public class SpreadsheetBook implements SpreadsheetElement<SpreadsheetElement, S
                v.visit(this);
        }
        
-       public List<SpreadsheetCell> invalidate(SpreadsheetCell cell) {
+       //Recursively find all SpreadsheetCells, invalidate them and return them all as a set
+       public Set<SpreadsheetCell> invalidate(SpreadsheetCell cell) {
+               Set<SpreadsheetCell> result = new HashSet<>();
+               result.add(cell);
+               cell.invalidate();
+               long refKey = cell.makeReferenceKey();
+               AbstractLongSet refs = referenceMap.remove(refKey);
+               if(refs == null) return result;
+               for(long ref : refs) {
+                       long sheet = ref >> 40;
+                       long row = (ref >> 20) & 0xFFFFF;
+                       long col = (ref) & 0xFFFFF;
+                       SpreadsheetCell referer = get(sheets.get((int)sheet), (int)row, (int)col);
+                       result.addAll(invalidate(referer));
+               }
+               return result;
+       }
+       
+       @Deprecated
+       public List<SpreadsheetCell> invalidateShallow(SpreadsheetCell cell) {
                ArrayList<SpreadsheetCell> result = new ArrayList<>();
                result.add(cell);
                cell.invalidate();