]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/synchronization/LineCommandBuilder.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / synchronization / LineCommandBuilder.java
1 package org.simantics.spreadsheet.graph.synchronization;\r
2 \r
3 import java.io.StringReader;\r
4 \r
5 import org.simantics.databoard.adapter.AdaptException;\r
6 import org.simantics.databoard.binding.mutable.Variant;\r
7 import org.simantics.spreadsheet.graph.ExcelArrayFormula;\r
8 import org.simantics.spreadsheet.graph.ExcelFormula;\r
9 import org.simantics.spreadsheet.graph.SpreadsheetBook;\r
10 import org.simantics.spreadsheet.graph.SpreadsheetCell;\r
11 import org.simantics.spreadsheet.graph.SpreadsheetFormula;\r
12 import org.simantics.spreadsheet.graph.SpreadsheetLine;\r
13 import org.simantics.spreadsheet.graph.SpreadsheetLines;\r
14 import org.simantics.spreadsheet.graph.SpreadsheetSCLConstant;\r
15 import org.simantics.spreadsheet.graph.function.LineContentBean;\r
16 import org.simantics.spreadsheet.graph.function.LineContentBeanCell;\r
17 import org.simantics.spreadsheet.graph.parser.SheetFormulaParser;\r
18 import org.simantics.spreadsheet.graph.parser.ast.AstArrayFormulaReference;\r
19 import org.simantics.spreadsheet.graph.parser.ast.AstValue;\r
20 import org.simantics.structural.synchronization.base.CommandBuilder;\r
21 import org.simantics.structural.synchronization.base.Solver;\r
22 \r
23 public class LineCommandBuilder implements CommandBuilder {\r
24         \r
25         private String name;\r
26 //      private boolean update;\r
27         LineContentBean bean;\r
28         \r
29         public LineCommandBuilder(String name, boolean update) {\r
30                 this.name = name;\r
31 //              this.update = update;\r
32         }\r
33 \r
34         @Override\r
35         public void apply(Solver solver) {\r
36                 \r
37                 SpreadsheetBook book = solver.getConcreteSolver();\r
38                 \r
39                 String path = name.substring(0, name.lastIndexOf("/"));\r
40                 String lineName = name.substring(name.lastIndexOf("/")+1);\r
41                 int row = Integer.parseInt(lineName.substring(3));\r
42                 \r
43                 SpreadsheetLines node = book.ensureSubprocess(path);\r
44                 SpreadsheetLine line = node.lines.get(-row);\r
45                 if(line == null) {\r
46                         line = new SpreadsheetLine(node, row);\r
47                         node.lines.put(-row, line);\r
48                 }\r
49                 \r
50 //              line.cells.clear();\r
51                 for(int i=0;i<bean.cells.length;i++) {\r
52                         \r
53                     SpreadsheetCell currentCell;\r
54                     if (line.cells.size() > i) {\r
55                         currentCell = line.cells.get(i);\r
56                     } else {\r
57                         currentCell = new SpreadsheetCell(line, i);\r
58                         line.cells.add(currentCell);\r
59                     }\r
60                     \r
61                         LineContentBeanCell cell = bean.cells[i];\r
62                         \r
63                         try {\r
64                                 Object content = cell.getContent();\r
65                                 if (content instanceof Variant) {\r
66                                     Variant cellVariant = (Variant) content;\r
67                                     if (cellVariant == LineContentBeanCell.EMPTY) {\r
68                                         currentCell.setStyle(cell.getStyleId());\r
69                                         // Empty content\r
70                                         currentCell.setContent("");\r
71 //                                      if (currentCell != SpreadsheetCell.EMPTY) {\r
72 //                                          line.cells.remove(i);\r
73 //                                          line.cells.add(i, SpreadsheetCell.EMPTY);\r
74 //                                      }\r
75                                     } else if(ExcelFormula.BINDING.type().equals(cellVariant.getBinding().type())) {\r
76                             ExcelFormula formula = (ExcelFormula)cellVariant.getValue(ExcelFormula.BINDING);\r
77                             SheetFormulaParser p = new SheetFormulaParser(new StringReader(formula.expression));\r
78                             AstValue v = p.relation();\r
79                         currentCell.setStyle(cell.getStyleId());\r
80                         SpreadsheetFormula sformula = new SpreadsheetFormula(v, formula.expression);\r
81                         currentCell.setContent(sformula);\r
82                         } else if (ExcelArrayFormula.BINDING.type().equals(cellVariant.getBinding().type())) {\r
83                             ExcelArrayFormula formula = (ExcelArrayFormula)cellVariant.getValue(ExcelArrayFormula.BINDING);\r
84                             SheetFormulaParser p = new SheetFormulaParser(new StringReader(formula.expression));\r
85                             AstArrayFormulaReference v = new AstArrayFormulaReference(formula.range, p.relation());\r
86                         currentCell.setStyle(cell.getStyleId());\r
87                         SpreadsheetFormula sformula = new SpreadsheetFormula(v, formula.expression);\r
88                         currentCell.setContent(sformula);\r
89                         } else {\r
90                         currentCell.setStyle(cell.getStyleId());\r
91                         // DO not update constant values during update\r
92                         currentCell.setContent(cellVariant.getValue());\r
93                         }\r
94                                 } else if (content instanceof SpreadsheetSCLConstant){\r
95                     currentCell.setStyle(cell.getStyleId());\r
96                     currentCell.setContent(content);\r
97                                 }\r
98                         } catch (Throwable e) {\r
99                             Object content = cell.getContent();\r
100                 if (content instanceof Variant) {\r
101                     Variant cellVariant = (Variant) content;\r
102                     currentCell.setStyle(cell.getStyleId());\r
103                     currentCell.setContent(content);\r
104                     try {\r
105                         new Exception("failed: " + ((ExcelFormula)(cellVariant.getValue(ExcelFormula.BINDING))).expression, e).printStackTrace();\r
106                     } catch (AdaptException e1) {\r
107                         e1.printStackTrace();\r
108                     }\r
109                 } else {\r
110                     currentCell.setStyle(cell.getStyleId());\r
111                     currentCell.setContent("LCB error happened");\r
112                 }\r
113                         }\r
114                 }\r
115         }\r
116 \r
117         @SuppressWarnings("unchecked")\r
118         @Override\r
119         public <T> T getConcrete() {\r
120                 return (T)this;\r
121         }\r
122         \r
123 }