1 package org.simantics.spreadsheet.solver;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.Comparator;
6 import java.util.HashMap;
9 import java.util.Optional;
10 import java.util.function.Consumer;
12 import org.simantics.scl.runtime.function.Function1;
13 import org.simantics.scl.runtime.tuple.Tuple;
14 import org.simantics.spreadsheet.Range;
15 import org.simantics.spreadsheet.SpreadsheetVisitor;
16 import org.simantics.spreadsheet.Spreadsheets;
18 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
20 @SuppressWarnings("rawtypes")
21 public class SpreadsheetLine implements SpreadsheetElement<SpreadsheetCell, SpreadsheetLines>, SheetNode {
23 private static final long serialVersionUID = -304574098117404663L;
25 final private SpreadsheetLines parent;
29 public ObjectArrayList<SpreadsheetCell> cells = new ObjectArrayList<>();
31 public SpreadsheetLine(SpreadsheetLines parent, int row) {
34 this.id = getEngine().getBook().getNewId(this);
41 public SpreadsheetEngine getEngine() {
42 return ((SpreadsheetLines)parent).getEngine();
49 public SpreadsheetLine possibleOffset(int offset) {
50 return getEngine().getLine(row+offset);
53 public SpreadsheetCell cellAt(int column) {
54 int index = Collections.binarySearch(cells, new BinarySearch(column), new Comparator<BinarySearch>() {
56 public int compare(BinarySearch bs1, BinarySearch bs2) {
57 return Integer.compare(bs1.column, bs2.column);
61 return cells.get(index);
66 public String getLinesPath() {
67 return "/" + ((SpreadsheetLines)parent).getLinesPath() + "/" + getName();
70 public void forCells(Consumer<SpreadsheetCell> consumer, int min, int max) {
71 for(int i=min;i<cells.size() && i<max;i++) {
72 SpreadsheetCell cell = cells.get(i);
73 if(SpreadsheetCell.EMPTY == cell) continue;
74 consumer.accept(cell);
78 public List<SpreadsheetCell> getCells(int min, int max) {
79 ArrayList<SpreadsheetCell> result = new ArrayList<>();
80 forCells(cell -> result.add(cell), min, max);
85 public String getName() {
90 public Map getChildren() {
91 String rowName = ""+row;
92 Map<String,SpreadsheetCell> result = new HashMap<>();
93 for(int i=0;i<cells.size();i++) {
94 SpreadsheetCell cell = cells.get(i);
95 if(SpreadsheetCell.EMPTY == cell) continue;
96 String name = "Row"+Spreadsheets.columnName(i) + rowName;
97 result.put(name, cell);
103 public Map getProperties() {
104 return Collections.singletonMap("typeURI", new SpreadsheetTypeNode(Spreadsheets.LINE_TYPE_URI));
107 Object resolve(String[] parts, int index) {
109 if(index == parts.length) return this;
111 Range r = Spreadsheets.decodeCellAbsolute(parts[index]);
112 return cells.get(r.startColumn);
116 public void accept(SpreadsheetVisitor v) {
120 public String getPath() {
121 return ((SpreadsheetLines)parent).getPath() + "/" + getName();
125 public Optional<SpreadsheetLines> getParent() {
126 return Optional.of(parent);
130 public List<SpreadsheetCell> getSpreadsheetChildren() {
135 public void remove(SpreadsheetCell child) {
140 public int hashCode() {
141 final int prime = 31;
143 result = prime * result + ((parent == null) ? 0 : parent.hashCode());
144 result = prime * result + row;
149 public boolean equals(Object obj) {
154 if (getClass() != obj.getClass())
156 SpreadsheetLine other = (SpreadsheetLine) obj;
157 if (parent == null) {
158 if (other.parent != null)
160 } else if (!parent.equals(other.parent))
162 if (row != other.row)