1 package org.simantics.spreadsheet.graph;
\r
3 import java.util.Collections;
\r
4 import java.util.HashMap;
\r
5 import java.util.List;
\r
6 import java.util.Map;
\r
7 import java.util.Optional;
\r
9 import org.simantics.spreadsheet.Range;
\r
10 import org.simantics.spreadsheet.graph.parser.ast.AstRange;
\r
12 public class SpreadsheetEngine implements SpreadsheetElement, SheetNode {
\r
14 private static final long serialVersionUID = -5246063647558595642L;
\r
16 private static final String LINES = "Lines";
\r
18 private final SpreadsheetBook book;
\r
19 private final String name;
\r
20 private final int id;
\r
22 public SpreadsheetLines lines;
\r
24 transient public Map<String,Object> rangeCache;
\r
26 public Map<String,Object> getRangeCache() {
\r
27 if(rangeCache == null) rangeCache = new HashMap<String,Object>();
\r
31 public Object getCachedRange(AstRange range) {
\r
32 if(range.sheetName != null) return null;
\r
33 return getRangeCache().get(range.first + ":" + range.second);
\r
36 public void cacheRange(AstRange range, Object value) {
\r
37 if(range.sheetName != null) return;
\r
38 getRangeCache().put(range.first + ":" + range.second, value);
\r
41 public SpreadsheetEngine(SpreadsheetBook book, String name) {
\r
44 this.id = book.getNewId(this);
\r
45 this.lines = new SpreadsheetLines(this, LINES);
\r
48 public SpreadsheetBook getBook() {
\r
52 public int getId() {
\r
56 Object resolve(String[] parts, int index) {
\r
58 String part = parts[index];
\r
59 if(!part.equals(LINES)) return null;
\r
61 if(index == parts.length-1) return lines;
\r
63 return lines.resolve(parts, index+1);
\r
68 public String getName() {
\r
73 public Map<String, SheetNode> getChildren() {
\r
74 return Collections.singletonMap(LINES, lines);
\r
78 public Map<String, SheetNode> getProperties() {
\r
79 return Collections.emptyMap();
\r
82 public Object ensureSubprocess(String[] path, int index) {
\r
84 String name = path[index];
\r
85 if(!LINES.equals(name)) throw new IllegalStateException();
\r
86 if(index == path.length - 1) return lines;
\r
87 return lines.ensureSubprocess(path, index+1);
\r
91 public SpreadsheetLine getLine(int row) {
\r
92 assert(lines.nodes.size() == 1);
\r
93 SpreadsheetLines root = lines.nodes.values().iterator().next();
\r
94 return root.getLine(row);
\r
98 public void accept(SpreadsheetVisitor v) {
\r
102 public Range actualRange(Range r) {
\r
103 if(r.isFullRows()) {
\r
104 SpreadsheetLines root = lines.nodes.values().iterator().next();
\r
105 Range result = new Range(r);
\r
106 result.startRow = 0;
\r
107 result.endRow = root.getMaxRow();
\r
115 public Optional<SpreadsheetElement> getParent() {
\r
116 return Optional.of(book);
\r
120 public List<SpreadsheetElement> getSpreadsheetChildren() {
\r
121 return Collections.singletonList(lines);
\r
125 public void remove(SpreadsheetElement child) {
\r
130 public int hashCode() {
\r
131 final int prime = 31;
\r
133 result = prime * result + ((book == null) ? 0 : book.hashCode());
\r
134 result = prime * result + ((name == null) ? 0 : name.hashCode());
\r
139 public boolean equals(Object obj) {
\r
144 if (getClass() != obj.getClass())
\r
146 SpreadsheetEngine other = (SpreadsheetEngine) obj;
\r
147 if (book == null) {
\r
148 if (other.book != null)
\r
150 } else if (!book.equals(other.book))
\r
152 if (name == null) {
\r
153 if (other.name != null)
\r
155 } else if (!name.equals(other.name))
\r