1 package org.simantics.spreadsheet.graph.adapter;
\r
3 import org.simantics.databoard.Bindings;
\r
4 import org.simantics.databoard.binding.Binding;
\r
5 import org.simantics.databoard.binding.mutable.Variant;
\r
6 import org.simantics.db.ReadGraph;
\r
7 import org.simantics.db.Resource;
\r
8 import org.simantics.db.WriteGraph;
\r
9 import org.simantics.db.exception.DatabaseException;
\r
10 import org.simantics.db.layer0.variable.ConstantChildVariable;
\r
11 import org.simantics.db.layer0.variable.ExtendedGraphChildVariable;
\r
12 import org.simantics.db.layer0.variable.Variable;
\r
13 import org.simantics.db.layer0.variable.VariableSpaceManipulator;
\r
14 import org.simantics.db.layer0.variable.Variables;
\r
15 import org.simantics.layer0.Layer0;
\r
16 import org.simantics.spreadsheet.Range;
\r
17 import org.simantics.spreadsheet.SheetVariables;
\r
18 import org.simantics.spreadsheet.common.matrix.VariantMatrix;
\r
19 import org.simantics.spreadsheet.util.SpreadsheetUtils;
\r
21 public class SpreadsheetVariable extends ExtendedGraphChildVariable {
\r
23 // final private Collection<Pair<StringCellParser, GraphCellCreator>> creators = new ArrayList<Pair<StringCellParser, GraphCellCreator>>();
\r
25 public SpreadsheetVariable(Variable parent, Resource resource) throws DatabaseException {
\r
27 super(parent, resource);
\r
29 // creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.MATRIX_PARSER, new MatrixCellCreator(resource)));
\r
30 // creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.EXPRESSION_PARSER, new ExpressionCellCreator(resource)));
\r
31 // creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.COMMAND_PARSER, new CommandCellCreator(resource)));
\r
32 // creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.RESOURCE_ARRAY_PARSER, new ResourceArrayCellCreator(resource)));
\r
33 // creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.TEXT_PARSER, new TextCellCreator(resource)));
\r
37 @SuppressWarnings("unchecked")
\r
38 protected <T> T tryAdapt(ReadGraph graph, Class<T> clazz) throws DatabaseException {
\r
39 if(VariableSpaceManipulator.class == clazz) {
\r
41 return (T)new VariableSpaceManipulator() {
\r
44 public void apply(WriteGraph graph, Modification modification) throws DatabaseException {
\r
46 Layer0 L0 = Layer0.getInstance(graph);
\r
47 for(String name : modification.removedChildren) {
\r
48 Variable child = getChild(graph, name);
\r
49 Resource represents = child.getRepresents(graph);
\r
50 graph.deny(represents, L0.PartOf);
\r
53 for(ChildCreationData data : modification.newChildren) {
\r
54 Resource container = getRepresents(graph);
\r
55 Resource cell = graph.newResource();
\r
56 Resource type = graph.getResource(data.type);
\r
57 graph.claim(cell, L0.InstanceOf, null, type);
\r
58 graph.addLiteral(cell, L0.HasName, L0.NameOf, L0.String, data.name, Bindings.STRING);
\r
59 for(PropertyCreationData p : data.properties) {
\r
60 Resource property = graph.getResource(p.name);
\r
61 graph.claimLiteral(cell, property, p.value.getValue());
\r
63 graph.claim(cell, L0.PartOf, container);
\r
76 public <T> T adapt(ReadGraph graph, Class<T> clazz) throws DatabaseException {
\r
77 T t = tryAdapt(graph, clazz);
\r
78 return t != null ? t : super.adapt(graph, clazz);
\r
82 public <T> T adaptPossible(ReadGraph graph, Class<T> clazz) throws DatabaseException {
\r
83 T t = tryAdapt(graph, clazz);
\r
84 return t != null ? t : super.adaptPossible(graph, clazz);
\r
87 final String[] propertyNames = { SheetVariables.CONTENT, Variables.LABEL, "immutable" };
\r
88 final Binding[] bindings = { Bindings.VARIANT, Bindings.STRING, Bindings.BOOLEAN};
\r
91 public Variable getPossibleSpecialChild(ReadGraph graph, String name) throws DatabaseException {
\r
92 if(name.contains(":")) {
\r
93 Range range = SpreadsheetUtils.decodeRange(name, 0, 0);
\r
95 VariantMatrix matrix = new VariantMatrix(range.height(),range.width());
\r
97 for(int x=range.startColumn;x<=range.endColumn;x++) {
\r
98 for(int y=range.startRow;y<=range.endRow;y++) {
\r
99 String location = SpreadsheetUtils.cellName(y,x);
\r
100 Variable child = getPossibleChild(graph, location);
\r
101 Variant value = null;
\r
103 value = child.getPossiblePropertyValue(graph, SheetVariables.CONTENT, Bindings.VARIANT);
\r
104 matrix.set(y-range.startRow, x-range.startColumn, value);
\r
108 return new ConstantChildVariable(this, name, propertyNames, bindings, new Object[] {
\r
109 Variant.ofInstance(matrix), null, name, false
\r
113 return super.getPossibleSpecialChild(graph, name);
\r