1 package org.simantics.spreadsheet.graph.synchronization;
\r
3 import java.io.StringReader;
\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
23 public class LineCommandBuilder implements CommandBuilder {
\r
25 private String name;
\r
26 // private boolean update;
\r
27 LineContentBean bean;
\r
29 public LineCommandBuilder(String name, boolean update) {
\r
31 // this.update = update;
\r
35 public void apply(Solver solver) {
\r
37 SpreadsheetBook book = solver.getConcreteSolver();
\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
43 SpreadsheetLines node = book.ensureSubprocess(path);
\r
44 SpreadsheetLine line = node.lines.get(-row);
\r
46 line = new SpreadsheetLine(node, row);
\r
47 node.lines.put(-row, line);
\r
50 // line.cells.clear();
\r
51 for(int i=0;i<bean.cells.length;i++) {
\r
53 SpreadsheetCell currentCell;
\r
54 if (line.cells.size() > i) {
\r
55 currentCell = line.cells.get(i);
\r
57 currentCell = new SpreadsheetCell(line, i);
\r
58 line.cells.add(currentCell);
\r
61 LineContentBeanCell cell = bean.cells[i];
\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
70 currentCell.setContent("");
\r
71 // if (currentCell != SpreadsheetCell.EMPTY) {
\r
72 // line.cells.remove(i);
\r
73 // line.cells.add(i, SpreadsheetCell.EMPTY);
\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
90 currentCell.setStyle(cell.getStyleId());
\r
91 // DO not update constant values during update
\r
92 currentCell.setContent(cellVariant.getValue());
\r
94 } else if (content instanceof SpreadsheetSCLConstant){
\r
95 currentCell.setStyle(cell.getStyleId());
\r
96 currentCell.setContent(content);
\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
105 new Exception("failed: " + ((ExcelFormula)(cellVariant.getValue(ExcelFormula.BINDING))).expression, e).printStackTrace();
\r
106 } catch (AdaptException e1) {
\r
107 e1.printStackTrace();
\r
110 currentCell.setStyle(cell.getStyleId());
\r
111 currentCell.setContent("LCB error happened");
\r
117 @SuppressWarnings("unchecked")
\r
119 public <T> T getConcrete() {
\r