--- /dev/null
+package org.simantics.spreadsheet.graph.synchronization;\r
+\r
+import java.io.StringReader;\r
+\r
+import org.simantics.databoard.adapter.AdaptException;\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.spreadsheet.graph.ExcelArrayFormula;\r
+import org.simantics.spreadsheet.graph.ExcelFormula;\r
+import org.simantics.spreadsheet.graph.SpreadsheetBook;\r
+import org.simantics.spreadsheet.graph.SpreadsheetCell;\r
+import org.simantics.spreadsheet.graph.SpreadsheetFormula;\r
+import org.simantics.spreadsheet.graph.SpreadsheetLine;\r
+import org.simantics.spreadsheet.graph.SpreadsheetLines;\r
+import org.simantics.spreadsheet.graph.SpreadsheetSCLConstant;\r
+import org.simantics.spreadsheet.graph.function.LineContentBean;\r
+import org.simantics.spreadsheet.graph.function.LineContentBeanCell;\r
+import org.simantics.spreadsheet.graph.parser.SheetFormulaParser;\r
+import org.simantics.spreadsheet.graph.parser.ast.AstArrayFormulaReference;\r
+import org.simantics.spreadsheet.graph.parser.ast.AstValue;\r
+import org.simantics.structural.synchronization.base.CommandBuilder;\r
+import org.simantics.structural.synchronization.base.Solver;\r
+\r
+public class LineCommandBuilder implements CommandBuilder {\r
+ \r
+ private String name;\r
+// private boolean update;\r
+ LineContentBean bean;\r
+ \r
+ public LineCommandBuilder(String name, boolean update) {\r
+ this.name = name;\r
+// this.update = update;\r
+ }\r
+\r
+ @Override\r
+ public void apply(Solver solver) {\r
+ \r
+ SpreadsheetBook book = solver.getConcreteSolver();\r
+ \r
+ String path = name.substring(0, name.lastIndexOf("/"));\r
+ String lineName = name.substring(name.lastIndexOf("/")+1);\r
+ int row = Integer.parseInt(lineName.substring(3));\r
+ \r
+ SpreadsheetLines node = book.ensureSubprocess(path);\r
+ SpreadsheetLine line = node.lines.get(-row);\r
+ if(line == null) {\r
+ line = new SpreadsheetLine(node, row);\r
+ node.lines.put(-row, line);\r
+ }\r
+ \r
+// line.cells.clear();\r
+ for(int i=0;i<bean.cells.length;i++) {\r
+ \r
+ SpreadsheetCell currentCell;\r
+ if (line.cells.size() > i) {\r
+ currentCell = line.cells.get(i);\r
+ } else {\r
+ currentCell = new SpreadsheetCell(line, i);\r
+ line.cells.add(currentCell);\r
+ }\r
+ \r
+ LineContentBeanCell cell = bean.cells[i];\r
+ \r
+ try {\r
+ Object content = cell.getContent();\r
+ if (content instanceof Variant) {\r
+ Variant cellVariant = (Variant) content;\r
+ if (cellVariant == LineContentBeanCell.EMPTY) {\r
+ currentCell.setStyle(cell.getStyleId());\r
+ // Empty content\r
+ currentCell.setContent("");\r
+// if (currentCell != SpreadsheetCell.EMPTY) {\r
+// line.cells.remove(i);\r
+// line.cells.add(i, SpreadsheetCell.EMPTY);\r
+// }\r
+ } else if(ExcelFormula.BINDING.type().equals(cellVariant.getBinding().type())) {\r
+ ExcelFormula formula = (ExcelFormula)cellVariant.getValue(ExcelFormula.BINDING);\r
+ SheetFormulaParser p = new SheetFormulaParser(new StringReader(formula.expression));\r
+ AstValue v = p.relation();\r
+ currentCell.setStyle(cell.getStyleId());\r
+ SpreadsheetFormula sformula = new SpreadsheetFormula(v, formula.expression);\r
+ currentCell.setContent(sformula);\r
+ } else if (ExcelArrayFormula.BINDING.type().equals(cellVariant.getBinding().type())) {\r
+ ExcelArrayFormula formula = (ExcelArrayFormula)cellVariant.getValue(ExcelArrayFormula.BINDING);\r
+ SheetFormulaParser p = new SheetFormulaParser(new StringReader(formula.expression));\r
+ AstArrayFormulaReference v = new AstArrayFormulaReference(formula.range, p.relation());\r
+ currentCell.setStyle(cell.getStyleId());\r
+ SpreadsheetFormula sformula = new SpreadsheetFormula(v, formula.expression);\r
+ currentCell.setContent(sformula);\r
+ } else {\r
+ currentCell.setStyle(cell.getStyleId());\r
+ // DO not update constant values during update\r
+ currentCell.setContent(cellVariant.getValue());\r
+ }\r
+ } else if (content instanceof SpreadsheetSCLConstant){\r
+ currentCell.setStyle(cell.getStyleId());\r
+ currentCell.setContent(content);\r
+ }\r
+ } catch (Throwable e) {\r
+ Object content = cell.getContent();\r
+ if (content instanceof Variant) {\r
+ Variant cellVariant = (Variant) content;\r
+ currentCell.setStyle(cell.getStyleId());\r
+ currentCell.setContent(content);\r
+ try {\r
+ new Exception("failed: " + ((ExcelFormula)(cellVariant.getValue(ExcelFormula.BINDING))).expression, e).printStackTrace();\r
+ } catch (AdaptException e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ } else {\r
+ currentCell.setStyle(cell.getStyleId());\r
+ currentCell.setContent("LCB error happened");\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T> T getConcrete() {\r
+ return (T)this;\r
+ }\r
+ \r
+}
\ No newline at end of file