1 package org.simantics.spreadsheet.graph;
\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
8 import org.simantics.spreadsheet.resource.SpreadsheetResource;
\r
10 import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap;
\r
12 public class SpreadsheetLines implements SpreadsheetElement<SpreadsheetLine, SpreadsheetEngine>, SheetNode {
\r
14 private static final long serialVersionUID = -3615335969248723486L;
\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
23 public SpreadsheetLines(SpreadsheetEngine parent, String name) {
\r
24 this.parent = parent;
\r
26 id = getEngine().getBook().getNewId(this);
\r
29 public SpreadsheetEngine getEngine() {
\r
33 public int getId() {
\r
38 public String getName() {
\r
43 public Map getChildren() {
\r
44 Int2ObjectAVLTreeMap result = new Int2ObjectAVLTreeMap();
\r
45 result.putAll(nodes);
\r
46 result.putAll(lines);
\r
51 public Map getProperties() {
\r
52 return Collections.singletonMap("typeURI", new SpreadsheetTypeNode(SpreadsheetResource.URIs.Lines));
\r
55 Object resolve(String[] parts, int index) {
\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
62 if(index == parts.length-1) return line;
\r
63 else return line.resolve(parts, index+1);
\r
66 int indx = Integer.parseInt(part);
\r
67 SpreadsheetLines node = nodes.get(indx);
\r
69 if(index == parts.length-1) return node;
\r
70 else return node.resolve(parts, index+1);
\r
78 public Object ensureSubprocess(String[] path, int index) {
\r
80 String name = path[index];
\r
82 int i = Integer.parseInt(name);
\r
83 SpreadsheetLines line = nodes.get(i);
\r
85 line = new SpreadsheetLines(parent, "" + i);
\r
89 if(index == path.length - 1) {
\r
92 return line.ensureSubprocess(path, index+1);
\r
97 public void setKeys(int[] keys) {
\r
102 public void accept(SpreadsheetVisitor v) {
\r
106 public String getPath() {
\r
107 return "/" + parent.getName() + "/" + parent.lines.getName() + "/" + getName();
\r
110 private int getKey(int index) {
\r
111 return keys[2*index+1];
\r
114 private int getChild(int index) {
\r
115 return keys[2*index];
\r
119 * [(child,key),...,key)
\r
122 public SpreadsheetLine getLine(int k) {
\r
125 int n = (keys.length - 1) / 2;
\r
127 while(i <= n && k > getKey(i-1)) i++;
\r
129 if(i <= n && k == getKey(i-1)) {
\r
130 return lines.get(-k);
\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
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
144 for (SpreadsheetLines node : nodes.values()) {
\r
145 int row = node.getMaxRow();
\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
156 return keys[keys.length-2];
\r
161 public Optional<SpreadsheetEngine> getParent() {
\r
162 return Optional.of(parent);
\r
166 public Collection<SpreadsheetLine> getSpreadsheetChildren() {
\r
167 return lines.values();
\r
171 public void remove(SpreadsheetLine child) {
\r
172 lines.remove(-child.row);
\r
176 public int hashCode() {
\r
177 final int prime = 31;
\r
179 result = prime * result + ((name == null) ? 0 : name.hashCode());
\r
180 result = prime * result + ((parent == null) ? 0 : parent.hashCode());
\r
185 public boolean equals(Object obj) {
\r
190 if (getClass() != obj.getClass())
\r
192 SpreadsheetLines other = (SpreadsheetLines) obj;
\r
193 if (name == null) {
\r
194 if (other.name != null)
\r
196 } else if (!name.equals(other.name))
\r
198 if (parent == null) {
\r
199 if (other.parent != null)
\r
201 } else if (!parent.equals(other.parent))
\r