1 package org.simantics.spreadsheet.solver;
3 import java.util.Collections;
4 import java.util.HashMap;
7 import java.util.Optional;
9 import org.simantics.spreadsheet.Range;
10 import org.simantics.spreadsheet.SpreadsheetVisitor;
11 import org.simantics.spreadsheet.solver.formula.parser.ast.AstRange;
13 @SuppressWarnings("rawtypes")
14 public class SpreadsheetEngine implements SpreadsheetElement, SheetNode {
16 private static final long serialVersionUID = -5246063647558595642L;
18 private static final String LINES = "Lines";
20 private final SpreadsheetBook book;
21 private final String name;
24 public SpreadsheetLines lines;
26 transient public Map<String,Object> rangeCache;
28 public Map<String,Object> getRangeCache() {
29 if(rangeCache == null) rangeCache = new HashMap<String,Object>();
33 public Object getCachedRange(AstRange range) {
34 if(range.sheetName != null) return null;
35 return getRangeCache().get(range.first + ":" + range.second);
38 public void cacheRange(AstRange range, Object value) {
39 if(range.sheetName != null) return;
40 getRangeCache().put(range.first + ":" + range.second, value);
43 public SpreadsheetEngine(SpreadsheetBook book, String name) {
46 this.id = book.getNewId(this);
47 this.lines = new SpreadsheetLines(this, LINES);
50 public SpreadsheetBook getBook() {
58 Object resolve(String[] parts, int index) {
60 String part = parts[index];
61 if(!part.equals(LINES)) return null;
63 if(index == parts.length-1) return lines;
65 return lines.resolve(parts, index+1);
70 public String getName() {
75 public Map<String, SheetNode> getChildren() {
76 return Collections.singletonMap(LINES, lines);
80 public Map<String, SheetNode> getProperties() {
81 return Collections.emptyMap();
84 public Object ensureSubprocess(String[] path, int index) {
86 String name = path[index];
87 if(!LINES.equals(name)) throw new IllegalStateException();
88 if(index == path.length - 1) return lines;
89 return lines.ensureSubprocess(path, index+1);
93 public SpreadsheetLine getLine(int row) {
94 assert(lines.nodes.size() == 1);
95 SpreadsheetLines root = lines.nodes.values().iterator().next();
96 return root.getLine(row);
100 public void accept(SpreadsheetVisitor v) {
104 public Range actualRange(Range r) {
106 SpreadsheetLines root = lines.nodes.values().iterator().next();
107 Range result = new Range(r);
109 result.endRow = root.getMaxRow();
117 public Optional<SpreadsheetElement> getParent() {
118 return Optional.of(book);
122 public List<SpreadsheetElement> getSpreadsheetChildren() {
123 return Collections.singletonList(lines);
127 public void remove(SpreadsheetElement child) {
132 public int hashCode() {
133 final int prime = 31;
135 result = prime * result + ((book == null) ? 0 : book.hashCode());
136 result = prime * result + ((name == null) ? 0 : name.hashCode());
141 public boolean equals(Object obj) {
146 if (getClass() != obj.getClass())
148 SpreadsheetEngine other = (SpreadsheetEngine) obj;
150 if (other.book != null)
152 } else if (!book.equals(other.book))
155 if (other.name != null)
157 } else if (!name.equals(other.name))