]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/SpreadsheetEngine.java
Adopt spreadsheet changes made in Balas development
[simantics/platform.git] / bundles / org.simantics.spreadsheet / src / org / simantics / spreadsheet / solver / SpreadsheetEngine.java
diff --git a/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/SpreadsheetEngine.java b/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/SpreadsheetEngine.java
new file mode 100644 (file)
index 0000000..9ccbc6d
--- /dev/null
@@ -0,0 +1,163 @@
+package org.simantics.spreadsheet.solver;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.simantics.spreadsheet.Range;
+import org.simantics.spreadsheet.SpreadsheetVisitor;
+import org.simantics.spreadsheet.solver.formula.parser.ast.AstRange;
+
+@SuppressWarnings("rawtypes")
+public class SpreadsheetEngine implements SpreadsheetElement, SheetNode {
+
+    private static final long serialVersionUID = -5246063647558595642L;
+
+    private static final String LINES = "Lines";
+
+    private final SpreadsheetBook book;
+    private final String name;
+    private final int id;
+
+    public SpreadsheetLines lines;
+
+    transient public Map<String,Object> rangeCache;
+
+    public Map<String,Object> getRangeCache() {
+        if(rangeCache == null) rangeCache = new HashMap<String,Object>();
+        return rangeCache;
+    }
+
+    public Object getCachedRange(AstRange range) {
+        if(range.sheetName != null) return null;
+        return getRangeCache().get(range.first + ":" + range.second); 
+    }
+
+    public void cacheRange(AstRange range, Object value) {
+        if(range.sheetName != null) return;
+        getRangeCache().put(range.first + ":" + range.second, value);
+    }
+
+    public SpreadsheetEngine(SpreadsheetBook book, String name) {
+        this.book = book;
+        this.name = name;
+        this.id = book.getNewId(this);
+        this.lines = new SpreadsheetLines(this, LINES);
+    }
+
+    public SpreadsheetBook getBook() {
+        return book;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    Object resolve(String[] parts, int index) {
+
+        String part = parts[index];
+        if(!part.equals(LINES)) return null;
+
+        if(index == parts.length-1) return lines;
+
+        return lines.resolve(parts, index+1);
+
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public Map<String, SheetNode> getChildren() {
+        return Collections.singletonMap(LINES, lines);
+    }
+
+    @Override
+    public Map<String, SheetNode> getProperties() {
+        return Collections.emptyMap();
+    } 
+
+    public Object ensureSubprocess(String[] path, int index) {
+
+        String name = path[index];
+        if(!LINES.equals(name)) throw new IllegalStateException();
+        if(index == path.length - 1) return lines;
+        return lines.ensureSubprocess(path, index+1);
+
+    }
+
+    public SpreadsheetLine getLine(int row) {
+        assert(lines.nodes.size() == 1);
+        SpreadsheetLines root = lines.nodes.values().iterator().next();
+        return root.getLine(row);
+    }
+
+    @Override
+    public void accept(SpreadsheetVisitor v) {
+        v.visit(this);
+    }
+
+    public Range actualRange(Range r) {
+        if(r.isFullRows()) {
+            SpreadsheetLines root = lines.nodes.values().iterator().next();
+            Range result = new Range(r);
+            result.startRow = 0;
+            result.endRow = root.getMaxRow(); 
+            return result;
+        } else {
+            return r;
+        }
+    }
+
+    @Override
+    public Optional<SpreadsheetElement> getParent() {
+        return Optional.of(book);
+    }
+
+    @Override
+    public List<SpreadsheetElement> getSpreadsheetChildren() {
+        return Collections.singletonList(lines);
+    }
+
+    @Override
+    public void remove(SpreadsheetElement child) {
+
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((book == null) ? 0 : book.hashCode());
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        SpreadsheetEngine other = (SpreadsheetEngine) obj;
+        if (book == null) {
+            if (other.book != null)
+                return false;
+        } else if (!book.equals(other.book))
+            return false;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
+        return true;
+    }
+
+
+}
\ No newline at end of file