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