-package org.simantics.spreadsheet.graph;\r
-\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Optional;\r
-\r
-import org.simantics.spreadsheet.graph.formula.FormulaError2;\r
-import org.simantics.spreadsheet.graph.formula.SpreadsheetEvaluationEnvironment;\r
-import org.simantics.spreadsheet.graph.parser.ast.AstValue;\r
-import org.simantics.spreadsheet.resource.SpreadsheetResource;\r
-import org.simantics.spreadsheet.util.SpreadsheetUtils;\r
-\r
-public class SpreadsheetCell implements SpreadsheetElement, SheetNode {\r
-\r
- private static final long serialVersionUID = 6616793596542239339L;\r
-\r
- public static SpreadsheetCell EMPTY;\r
- \r
- static {\r
- EMPTY = new SpreadsheetCell(null, -1);\r
- EMPTY.setContent("");\r
- EMPTY.setStyle(SpreadsheetStyle.empty().getStyleId());\r
- }\r
- \r
- private boolean inProgress = false;\r
- private int iterations = 0;\r
- \r
- final private SpreadsheetLine line;\r
- final private int column;\r
- int style;\r
- Object content;\r
- \r
- public SpreadsheetCell(SpreadsheetLine line, int column) {\r
- this.line = line;\r
- this.column = column;\r
- }\r
-\r
- public boolean hasExpression() {\r
- return content instanceof SpreadsheetFormula || content instanceof SpreadsheetSCLConstant; \r
- }\r
- \r
- public void setContent(Object newContent) {\r
-// if(newContent != null) {\r
-// if (!(newContent instanceof Serializable)) {\r
-// throw new AssertionError("content not instanceof Serializable but it is " + newContent.getClass().getSimpleName());\r
-// }\r
-// }\r
- if (GraphUI.DEBUG)\r
- System.out.println("SpreadsheetCell.setContent "+ this + " " + newContent);\r
- this.content = newContent;\r
- }\r
-\r
- @Override\r
- public String getName() {\r
- return SpreadsheetUtils.cellName(line.row, column);\r
- }\r
-\r
- @Override\r
- public Map<?, ?> getChildren() {\r
- return Collections.emptyMap();\r
- }\r
- \r
- private static String[] keys = { "typeURI", "content" };\r
- \r
- @Override\r
- public Map<String, SheetNode> getProperties() {\r
- Map<String, SheetNode> properties = new HashMap<>();\r
- \r
- if (GraphUI.DEBUG)\r
- System.out.println("SpreadsheetCell.getProperties: " + this + " " + content + " " + style);\r
- \r
- properties.put("typeURI", new SpreadsheetTypeNode(SpreadsheetResource.URIs.Cell));\r
- properties.put("content", new SpreadsheetCellContent(this));\r
- properties.put("style", new SpreadsheetCellStyle(this));\r
- properties.put("editable", new SpreadsheetCellEditable(this));\r
- return properties;\r
- }\r
- \r
- public SpreadsheetBook getBook() {\r
- return line.getEngine().getBook();\r
- }\r
-\r
- public SpreadsheetEngine getEngine() {\r
- return line.getEngine();\r
- }\r
-\r
- public <T> T evaluate(SpreadsheetEvaluationEnvironment env) {\r
- return evaluate(env, null);\r
- }\r
-\r
- public <T> T evaluate(SpreadsheetEvaluationEnvironment env, CellValueVisitor caller) {\r
-// System.err.println(getEngine().getName() + ":" + getName() + ": evaluate");\r
- if(caller != null)\r
- caller.addReference(makeReferenceKey());\r
- if(content instanceof SpreadsheetFormula) {\r
- SpreadsheetFormula f = (SpreadsheetFormula)content;\r
- if(f.result == null) {\r
- CellValueVisitor visitor = new CellValueVisitor(env, this);\r
- AstValue value = ((SpreadsheetFormula)content).value;\r
- if(this.inProgress == true) this.iterations++;\r
- \r
- if(!env.getBook().isIterationEnabled()){\r
- if(this.inProgress == false){\r
- this.inProgress = true;\r
- f.result = value.accept(visitor);\r
- }\r
- else f.result = FormulaError2.CIRCULAR_REF.getString();\r
- }\r
- else if(this.iterations<env.iterationLimit){\r
- this.inProgress = true;\r
- f.result = value.accept(visitor);\r
- }\r
- else {\r
- if(f.result==null)\r
- f.result = 0.0;\r
- }\r
- \r
- env.getBook().registerReferences(makeReferenceKey(), visitor.getReferences());\r
- }\r
- this.inProgress = false;\r
- this.iterations = 0;\r
- return (T)f.result;\r
- } else if (content instanceof SpreadsheetSCLConstant) {\r
- SpreadsheetSCLConstant sclConstant = (SpreadsheetSCLConstant) content;\r
- return (T) sclConstant.content;\r
- } else {\r
- this.inProgress = false;\r
- return (T)content;\r
- }\r
- }\r
- \r
- public long makeReferenceKey() {\r
- SpreadsheetBook book = getBook();\r
- SpreadsheetEngine engine = getEngine();\r
- long engineIndex = book.getEngineIndex(engine);\r
- long row = line.row;\r
- long col = column;\r
- return (engineIndex << 40) + (row << 20) + col; \r
- }\r
- \r
- public void invalidate() {\r
- getEngine().rangeCache = null;\r
- if(content instanceof SpreadsheetFormula) {\r
- SpreadsheetFormula f = (SpreadsheetFormula)content;\r
- f.result = null;\r
- }\r
- }\r
-\r
- @Override\r
- public void accept(SpreadsheetVisitor v) {\r
- v.visit(this);\r
- }\r
-\r
- @Override\r
- public Optional<SpreadsheetElement> getParent() {\r
- return Optional.of(line);\r
- }\r
-\r
- @Override\r
- public List<SpreadsheetElement> getSpreadsheetChildren() {\r
- return Collections.emptyList();\r
- }\r
-\r
- @Override\r
- public void remove(SpreadsheetElement child) {\r
- // TODO Auto-generated method stub\r
- \r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- final int prime = 31;\r
- int result = 1;\r
- result = prime * result + column;\r
- result = prime * result + ((line == null) ? 0 : line.hashCode());\r
- return result;\r
- }\r
-\r
- @Override\r
- public boolean equals(Object obj) {\r
- if (this == obj)\r
- return true;\r
- if (obj == null)\r
- return false;\r
- if (getClass() != obj.getClass())\r
- return false;\r
- SpreadsheetCell other = (SpreadsheetCell) obj;\r
- if (column != other.column)\r
- return false;\r
- if (line == null) {\r
- if (other.line != null)\r
- return false;\r
- } else if (!line.equals(other.line))\r
- return false;\r
- return true;\r
- }\r
-\r
- public void setStyle(int styleId) {\r
- this.style = styleId;\r
- }\r
-\r
- public int getStyle() {\r
- return style;\r
- }\r
-\r
- public Object getContent() {\r
- return content;\r
- }\r
- \r
- public static SpreadsheetCell empty(SpreadsheetLine line, int column) {\r
- SpreadsheetCell cell = new SpreadsheetCell(line, column);\r
- cell.setContent("");\r
- cell.setStyle(SpreadsheetStyle.empty().getStyleId());\r
- return cell;\r
- }\r
-\r
-}\r
+package org.simantics.spreadsheet.graph;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.simantics.spreadsheet.graph.formula.FormulaError2;
+import org.simantics.spreadsheet.graph.formula.SpreadsheetEvaluationEnvironment;
+import org.simantics.spreadsheet.graph.parser.ast.AstValue;
+import org.simantics.spreadsheet.resource.SpreadsheetResource;
+import org.simantics.spreadsheet.util.SpreadsheetUtils;
+
+public class SpreadsheetCell implements SpreadsheetElement, SheetNode {
+
+ private static final long serialVersionUID = 6616793596542239339L;
+
+ public static SpreadsheetCell EMPTY;
+
+ static {
+ EMPTY = new SpreadsheetCell(null, -1);
+ EMPTY.setContent("");
+ EMPTY.setStyle(SpreadsheetStyle.empty().getStyleId());
+ }
+
+ private boolean inProgress = false;
+ private int iterations = 0;
+
+ final private SpreadsheetLine line;
+ final private int column;
+ int style;
+ Object content;
+
+ public SpreadsheetCell(SpreadsheetLine line, int column) {
+ this.line = line;
+ this.column = column;
+ }
+
+ public boolean hasExpression() {
+ return content instanceof SpreadsheetFormula || content instanceof SpreadsheetSCLConstant;
+ }
+
+ public void setContent(Object newContent) {
+// if(newContent != null) {
+// if (!(newContent instanceof Serializable)) {
+// throw new AssertionError("content not instanceof Serializable but it is " + newContent.getClass().getSimpleName());
+// }
+// }
+ if (GraphUI.DEBUG)
+ System.out.println("SpreadsheetCell.setContent "+ this + " " + newContent);
+ this.content = newContent;
+ }
+
+ @Override
+ public String getName() {
+ return SpreadsheetUtils.cellName(line.row, column);
+ }
+
+ @Override
+ public Map<?, ?> getChildren() {
+ return Collections.emptyMap();
+ }
+
+ private static String[] keys = { "typeURI", "content" };
+
+ @Override
+ public Map<String, SheetNode> getProperties() {
+ Map<String, SheetNode> properties = new HashMap<>();
+
+ if (GraphUI.DEBUG)
+ System.out.println("SpreadsheetCell.getProperties: " + this + " " + content + " " + style);
+
+ properties.put("typeURI", new SpreadsheetTypeNode(SpreadsheetResource.URIs.Cell));
+ properties.put("content", new SpreadsheetCellContent(this));
+ properties.put("style", new SpreadsheetCellStyle(this));
+ properties.put("editable", new SpreadsheetCellEditable(this));
+ return properties;
+ }
+
+ public SpreadsheetBook getBook() {
+ return line.getEngine().getBook();
+ }
+
+ public SpreadsheetEngine getEngine() {
+ return line.getEngine();
+ }
+
+ public <T> T evaluate(SpreadsheetEvaluationEnvironment env) {
+ return evaluate(env, null);
+ }
+
+ public <T> T evaluate(SpreadsheetEvaluationEnvironment env, CellValueVisitor caller) {
+// System.err.println(getEngine().getName() + ":" + getName() + ": evaluate");
+ if(caller != null)
+ caller.addReference(makeReferenceKey());
+ if(content instanceof SpreadsheetFormula) {
+ SpreadsheetFormula f = (SpreadsheetFormula)content;
+ if(f.result == null) {
+ CellValueVisitor visitor = new CellValueVisitor(env, this);
+ AstValue value = ((SpreadsheetFormula)content).value;
+ if(this.inProgress == true) this.iterations++;
+
+ if(!env.getBook().isIterationEnabled()){
+ if(this.inProgress == false){
+ this.inProgress = true;
+ f.result = value.accept(visitor);
+ }
+ else f.result = FormulaError2.CIRCULAR_REF.getString();
+ }
+ else if(this.iterations<env.iterationLimit){
+ this.inProgress = true;
+ f.result = value.accept(visitor);
+ }
+ else {
+ if(f.result==null)
+ f.result = 0.0;
+ }
+
+ env.getBook().registerReferences(makeReferenceKey(), visitor.getReferences());
+ }
+ this.inProgress = false;
+ this.iterations = 0;
+ return (T)f.result;
+ } else if (content instanceof SpreadsheetSCLConstant) {
+ SpreadsheetSCLConstant sclConstant = (SpreadsheetSCLConstant) content;
+ return (T) sclConstant.content;
+ } else {
+ this.inProgress = false;
+ return (T)content;
+ }
+ }
+
+ public long makeReferenceKey() {
+ SpreadsheetBook book = getBook();
+ SpreadsheetEngine engine = getEngine();
+ long engineIndex = book.getEngineIndex(engine);
+ long row = line.row;
+ long col = column;
+ return (engineIndex << 40) + (row << 20) + col;
+ }
+
+ public void invalidate() {
+ getEngine().rangeCache = null;
+ if(content instanceof SpreadsheetFormula) {
+ SpreadsheetFormula f = (SpreadsheetFormula)content;
+ f.result = null;
+ }
+ }
+
+ @Override
+ public void accept(SpreadsheetVisitor v) {
+ v.visit(this);
+ }
+
+ @Override
+ public Optional<SpreadsheetElement> getParent() {
+ return Optional.of(line);
+ }
+
+ @Override
+ public List<SpreadsheetElement> getSpreadsheetChildren() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void remove(SpreadsheetElement child) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + column;
+ result = prime * result + ((line == null) ? 0 : line.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SpreadsheetCell other = (SpreadsheetCell) obj;
+ if (column != other.column)
+ return false;
+ if (line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!line.equals(other.line))
+ return false;
+ return true;
+ }
+
+ public void setStyle(int styleId) {
+ this.style = styleId;
+ }
+
+ public int getStyle() {
+ return style;
+ }
+
+ public Object getContent() {
+ return content;
+ }
+
+ public static SpreadsheetCell empty(SpreadsheetLine line, int column) {
+ SpreadsheetCell cell = new SpreadsheetCell(line, column);
+ cell.setContent("");
+ cell.setStyle(SpreadsheetStyle.empty().getStyleId());
+ return cell;
+ }
+
+}