]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetLines.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / SpreadsheetLines.java
1 package org.simantics.spreadsheet.graph;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 import java.util.Map;\r
6 import java.util.Optional;\r
7 \r
8 import org.simantics.spreadsheet.resource.SpreadsheetResource;\r
9 \r
10 import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap;\r
11 \r
12 public class SpreadsheetLines implements SpreadsheetElement<SpreadsheetLine, SpreadsheetEngine>, SheetNode {\r
13 \r
14         private static final long serialVersionUID = -3615335969248723486L;\r
15         \r
16         private final int id;\r
17         private SpreadsheetEngine parent;\r
18         private String name;\r
19         public Int2ObjectAVLTreeMap<SpreadsheetLines> nodes = new Int2ObjectAVLTreeMap<SpreadsheetLines>();\r
20         public Int2ObjectAVLTreeMap<SpreadsheetLine> lines = new Int2ObjectAVLTreeMap<SpreadsheetLine>();\r
21         public int[] keys;\r
22 \r
23         public SpreadsheetLines(SpreadsheetEngine parent, String name) {\r
24                 this.parent = parent;\r
25                 this.name = name;\r
26                 id = getEngine().getBook().getNewId(this);\r
27         }\r
28 \r
29         public SpreadsheetEngine getEngine() {\r
30                 return parent;\r
31         }\r
32 \r
33         public int getId() {\r
34                 return id;\r
35         }\r
36         \r
37         @Override\r
38         public String getName() {\r
39                 return name;\r
40         }\r
41 \r
42         @Override\r
43         public Map getChildren() {\r
44                 Int2ObjectAVLTreeMap result = new Int2ObjectAVLTreeMap();\r
45                 result.putAll(nodes);\r
46                 result.putAll(lines);\r
47                 return result;\r
48         }\r
49 \r
50         @Override\r
51         public Map getProperties() {\r
52                 return Collections.singletonMap("typeURI", new SpreadsheetTypeNode(SpreadsheetResource.URIs.Lines));\r
53         } \r
54         \r
55         Object resolve(String[] parts, int index) {\r
56                 \r
57                 String part = parts[index];\r
58                 if(part.charAt(0) == 'R') {\r
59                         int indx = Integer.parseInt(part.substring(3));\r
60                         SpreadsheetLine line = lines.get(-indx);\r
61                         if(line != null) {\r
62                                 if(index == parts.length-1) return line;\r
63                                 else return line.resolve(parts, index+1);\r
64                         }\r
65                 } else {\r
66                         int indx = Integer.parseInt(part);\r
67                         SpreadsheetLines node = nodes.get(indx);\r
68                         if(node != null) {\r
69                                 if(index == parts.length-1) return node;\r
70                                 else return node.resolve(parts, index+1);\r
71                         }\r
72                 }\r
73                 \r
74                 return null;\r
75 \r
76         }\r
77 \r
78         public Object ensureSubprocess(String[] path, int index) {\r
79                 \r
80                 String name = path[index];\r
81 \r
82                 int i = Integer.parseInt(name);\r
83                 SpreadsheetLines line = nodes.get(i);\r
84                 if(line == null) {\r
85                         line = new SpreadsheetLines(parent, "" + i);\r
86                         nodes.put(i, line);\r
87                 }\r
88 \r
89                 if(index == path.length - 1) {\r
90                         return line;\r
91                 } else {\r
92                         return line.ensureSubprocess(path, index+1);\r
93                 }\r
94                 \r
95         }\r
96         \r
97         public void setKeys(int[] keys) {\r
98                 this.keys = keys;\r
99         }\r
100         \r
101         @Override\r
102         public void accept(SpreadsheetVisitor v) {\r
103                 v.visit(this);\r
104         }\r
105 \r
106         public String getPath() {\r
107                         return "/" + parent.getName() + "/" + parent.lines.getName() + "/" + getName();\r
108         }\r
109 \r
110         private int getKey(int index) {\r
111                 return keys[2*index+1];\r
112         }\r
113 \r
114         private int getChild(int index) {\r
115                 return keys[2*index];\r
116         }\r
117 \r
118         /*\r
119          *  [(child,key),...,key)\r
120          * \r
121          */\r
122         public SpreadsheetLine getLine(int k) {\r
123                 \r
124                 int i=1;\r
125                 int n = (keys.length - 1) / 2;\r
126                 \r
127                 while(i <= n && k > getKey(i-1)) i++;\r
128                 \r
129                 if(i <= n && k == getKey(i-1)) {\r
130                         return lines.get(-k);\r
131                 }\r
132 \r
133                 int nodeName = getChild(i-1);\r
134                 SpreadsheetLines node = nodes.get(nodeName);\r
135                 if(node == null) return null;\r
136                 return node.getLine(k);\r
137                 \r
138         }\r
139         \r
140         public int getMaxRow() {\r
141                 // if keys == null then this is the root of BTree which has only one child \r
142                 if (keys == null) {\r
143                         int maxRow = 0;\r
144                         for (SpreadsheetLines node : nodes.values()) {\r
145                                 int row = node.getMaxRow();\r
146                                 if (row > maxRow)\r
147                                         maxRow = row;\r
148                         }\r
149                         return maxRow;\r
150                 }\r
151                 int largestChild = keys[keys.length-1]; \r
152                 if(largestChild > 0) {\r
153                         SpreadsheetLines child = nodes.get(largestChild);\r
154                         return child.getMaxRow();\r
155                 } else {\r
156                         return keys[keys.length-2];\r
157                 }\r
158         }\r
159 \r
160     @Override\r
161     public Optional<SpreadsheetEngine> getParent() {\r
162         return Optional.of(parent);\r
163     }\r
164 \r
165     @Override\r
166     public Collection<SpreadsheetLine> getSpreadsheetChildren() {\r
167         return lines.values();\r
168     }\r
169 \r
170     @Override\r
171     public void remove(SpreadsheetLine child) {\r
172         lines.remove(-child.row);\r
173     }\r
174 \r
175     @Override\r
176     public int hashCode() {\r
177         final int prime = 31;\r
178         int result = 1;\r
179         result = prime * result + ((name == null) ? 0 : name.hashCode());\r
180         result = prime * result + ((parent == null) ? 0 : parent.hashCode());\r
181         return result;\r
182     }\r
183 \r
184     @Override\r
185     public boolean equals(Object obj) {\r
186         if (this == obj)\r
187             return true;\r
188         if (obj == null)\r
189             return false;\r
190         if (getClass() != obj.getClass())\r
191             return false;\r
192         SpreadsheetLines other = (SpreadsheetLines) obj;\r
193         if (name == null) {\r
194             if (other.name != null)\r
195                 return false;\r
196         } else if (!name.equals(other.name))\r
197             return false;\r
198         if (parent == null) {\r
199             if (other.parent != null)\r
200                 return false;\r
201         } else if (!parent.equals(other.parent))\r
202             return false;\r
203         return true;\r
204     }\r
205         \r
206 }\r