]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.spreadsheet.solver;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Optional;
8
9 import org.simantics.spreadsheet.Range;
10 import org.simantics.spreadsheet.SpreadsheetVisitor;
11 import org.simantics.spreadsheet.solver.formula.parser.ast.AstRange;
12
13 @SuppressWarnings("rawtypes")
14 public class SpreadsheetEngine implements SpreadsheetElement, SheetNode {
15
16     private static final long serialVersionUID = -5246063647558595642L;
17
18     private static final String LINES = "Lines";
19
20     private final SpreadsheetBook book;
21     private final String name;
22     private final int id;
23
24     public SpreadsheetLines lines;
25
26     transient public Map<String,Object> rangeCache;
27
28     public Map<String,Object> getRangeCache() {
29         if(rangeCache == null) rangeCache = new HashMap<String,Object>();
30         return rangeCache;
31     }
32
33     public Object getCachedRange(AstRange range) {
34         if(range.sheetName != null) return null;
35         return getRangeCache().get(range.first + ":" + range.second); 
36     }
37
38     public void cacheRange(AstRange range, Object value) {
39         if(range.sheetName != null) return;
40         getRangeCache().put(range.first + ":" + range.second, value);
41     }
42
43     public SpreadsheetEngine(SpreadsheetBook book, String name) {
44         this.book = book;
45         this.name = name;
46         this.id = book.getNewId(this);
47         this.lines = new SpreadsheetLines(this, LINES);
48     }
49
50     public SpreadsheetBook getBook() {
51         return book;
52     }
53
54     public int getId() {
55         return id;
56     }
57
58     Object resolve(String[] parts, int index) {
59
60         String part = parts[index];
61         if(!part.equals(LINES)) return null;
62
63         if(index == parts.length-1) return lines;
64
65         return lines.resolve(parts, index+1);
66
67     }
68
69     @Override
70     public String getName() {
71         return name;
72     }
73
74     @Override
75     public Map<String, SheetNode> getChildren() {
76         return Collections.singletonMap(LINES, lines);
77     }
78
79     @Override
80     public Map<String, SheetNode> getProperties() {
81         return Collections.emptyMap();
82     } 
83
84     public Object ensureSubprocess(String[] path, int index) {
85
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);
90
91     }
92
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);
97     }
98
99     @Override
100     public void accept(SpreadsheetVisitor v) {
101         v.visit(this);
102     }
103
104     public Range actualRange(Range r) {
105         if(r.isFullRows()) {
106             SpreadsheetLines root = lines.nodes.values().iterator().next();
107             Range result = new Range(r);
108             result.startRow = 0;
109             result.endRow = root.getMaxRow(); 
110             return result;
111         } else {
112             return r;
113         }
114     }
115
116     @Override
117     public Optional<SpreadsheetElement> getParent() {
118         return Optional.of(book);
119     }
120
121     @Override
122     public List<SpreadsheetElement> getSpreadsheetChildren() {
123         return Collections.singletonList(lines);
124     }
125
126     @Override
127     public void remove(SpreadsheetElement child) {
128
129     }
130
131     @Override
132     public int hashCode() {
133         final int prime = 31;
134         int result = 1;
135         result = prime * result + ((book == null) ? 0 : book.hashCode());
136         result = prime * result + ((name == null) ? 0 : name.hashCode());
137         return result;
138     }
139
140     @Override
141     public boolean equals(Object obj) {
142         if (this == obj)
143             return true;
144         if (obj == null)
145             return false;
146         if (getClass() != obj.getClass())
147             return false;
148         SpreadsheetEngine other = (SpreadsheetEngine) obj;
149         if (book == null) {
150             if (other.book != null)
151                 return false;
152         } else if (!book.equals(other.book))
153             return false;
154         if (name == null) {
155             if (other.name != null)
156                 return false;
157         } else if (!name.equals(other.name))
158             return false;
159         return true;
160     }
161
162
163 }