1 package org.simantics.spreadsheet.graph;
3 import java.util.Collection;
4 import java.util.Collections;
6 import java.util.Optional;
8 import org.simantics.spreadsheet.resource.SpreadsheetResource;
10 import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap;
12 public class SpreadsheetLines implements SpreadsheetElement<SpreadsheetLine, SpreadsheetEngine>, SheetNode {
14 private static final long serialVersionUID = -3615335969248723486L;
17 private SpreadsheetEngine parent;
19 public Int2ObjectAVLTreeMap<SpreadsheetLines> nodes = new Int2ObjectAVLTreeMap<SpreadsheetLines>();
20 public Int2ObjectAVLTreeMap<SpreadsheetLine> lines = new Int2ObjectAVLTreeMap<SpreadsheetLine>();
23 public SpreadsheetLines(SpreadsheetEngine parent, String name) {
26 id = getEngine().getBook().getNewId(this);
29 public SpreadsheetEngine getEngine() {
38 public String getName() {
43 public Map getChildren() {
44 Int2ObjectAVLTreeMap result = new Int2ObjectAVLTreeMap();
51 public Map getProperties() {
52 return Collections.singletonMap("typeURI", new SpreadsheetTypeNode(SpreadsheetResource.URIs.Lines));
55 Object resolve(String[] parts, int index) {
57 String part = parts[index];
58 if(part.charAt(0) == 'R') {
59 int indx = Integer.parseInt(part.substring(3));
60 SpreadsheetLine line = lines.get(-indx);
62 if(index == parts.length-1) return line;
63 else return line.resolve(parts, index+1);
66 int indx = Integer.parseInt(part);
67 SpreadsheetLines node = nodes.get(indx);
69 if(index == parts.length-1) return node;
70 else return node.resolve(parts, index+1);
78 public Object ensureSubprocess(String[] path, int index) {
80 String name = path[index];
82 int i = Integer.parseInt(name);
83 SpreadsheetLines line = nodes.get(i);
85 line = new SpreadsheetLines(parent, "" + i);
89 if(index == path.length - 1) {
92 return line.ensureSubprocess(path, index+1);
97 public void setKeys(int[] keys) {
102 public void accept(SpreadsheetVisitor v) {
106 public String getPath() {
107 return "/" + parent.getName() + "/" + parent.lines.getName() + "/" + getName();
110 private int getKey(int index) {
111 return keys[2*index+1];
114 private int getChild(int index) {
115 return keys[2*index];
119 * [(child,key),...,key)
122 public SpreadsheetLine getLine(int k) {
125 int n = (keys.length - 1) / 2;
127 while(i <= n && k > getKey(i-1)) i++;
129 if(i <= n && k == getKey(i-1)) {
130 return lines.get(-k);
133 int nodeName = getChild(i-1);
134 SpreadsheetLines node = nodes.get(nodeName);
135 if(node == null) return null;
136 return node.getLine(k);
140 public int getMaxRow() {
141 // if keys == null then this is the root of BTree which has only one child
144 for (SpreadsheetLines node : nodes.values()) {
145 int row = node.getMaxRow();
151 int largestChild = keys[keys.length-1];
152 if(largestChild > 0) {
153 SpreadsheetLines child = nodes.get(largestChild);
154 return child.getMaxRow();
156 return keys[keys.length-2];
161 public Optional<SpreadsheetEngine> getParent() {
162 return Optional.of(parent);
166 public Collection<SpreadsheetLine> getSpreadsheetChildren() {
167 return lines.values();
171 public void remove(SpreadsheetLine child) {
172 lines.remove(-child.row);
176 public int hashCode() {
177 final int prime = 31;
179 result = prime * result + ((name == null) ? 0 : name.hashCode());
180 result = prime * result + ((parent == null) ? 0 : parent.hashCode());
185 public boolean equals(Object obj) {
190 if (getClass() != obj.getClass())
192 SpreadsheetLines other = (SpreadsheetLines) obj;
194 if (other.name != null)
196 } else if (!name.equals(other.name))
198 if (parent == null) {
199 if (other.parent != null)
201 } else if (!parent.equals(other.parent))