]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetCell.java
Introduce new DiagramViewer.getRuntimeFromManager()
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / SpreadsheetCell.java
index 7d04e9b6e21c607bb80b30bce98ed10ac8a5489c..0ee66cf075142e57f94f27405cfb1609e17c8785 100644 (file)
-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.iterationEnabled == false){\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(iterations<env.iterationLimit){\r
-                                       this.inProgress = true;\r
-                                       f.result = value.accept(visitor);\r
-                               }\r
-                               else f.result = 0.0;\r
-                               \r
-                               env.getBook().registerReferences(makeReferenceKey(), visitor.getReferences());\r
-                       }\r
-                       this.inProgress = false;\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;
+       final private Map<String, SheetNode> properties;
+       
+       public SpreadsheetCell(SpreadsheetLine line, int column) {
+               this.properties = createProperties();
+               this.line = line;
+               this.column = column;
+       }
+
+       //All SpreadsheetCells have these properties - create them when object is created
+       private Map<String, SheetNode> createProperties() {
+           Map<String, SheetNode> p = new HashMap<>();     
+           p.put("typeURI", new SpreadsheetTypeNode(SpreadsheetResource.URIs.Cell));
+           p.put("content", new SpreadsheetCellContent(this));
+        p.put("style", new SpreadsheetCellStyle(this));
+        p.put("editable", new SpreadsheetCellEditable(this));
+        return p;
+       }
+       
+    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() {
+           if (GraphUI.DEBUG)
+               System.out.println("SpreadsheetCell.getProperties: " + this + " " + content + " " + style);
+           return properties; //Return this SpreadsheetCells's properties, rather than a new HashMap
+       }
+       
+       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;
+    }
+
+}