]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/adapter/SpreadsheetVariable.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / adapter / SpreadsheetVariable.java
1 package org.simantics.spreadsheet.graph.adapter;\r
2 \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
20 \r
21 public class SpreadsheetVariable extends ExtendedGraphChildVariable {\r
22 \r
23 //    final private Collection<Pair<StringCellParser, GraphCellCreator>> creators = new ArrayList<Pair<StringCellParser, GraphCellCreator>>(); \r
24         \r
25         public SpreadsheetVariable(Variable parent, Resource resource) throws DatabaseException {\r
26                 \r
27                 super(parent, resource);\r
28                 \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
34             \r
35         }\r
36         \r
37     @SuppressWarnings("unchecked")\r
38     protected <T> T tryAdapt(ReadGraph graph, Class<T> clazz) throws DatabaseException {\r
39                 if(VariableSpaceManipulator.class == clazz) {\r
40                         \r
41                         return (T)new VariableSpaceManipulator() {\r
42 \r
43                                 @Override\r
44                                 public void apply(WriteGraph graph, Modification modification) throws DatabaseException {\r
45                                         \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
51                                         }\r
52                                         \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
62                                                 }\r
63                                                 graph.claim(cell, L0.PartOf, container);\r
64                                                 \r
65                                         }\r
66                                         \r
67                                 }\r
68                                 \r
69                         };\r
70                         \r
71                 }\r
72                 return null;\r
73         }\r
74 \r
75         @Override\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
79         }\r
80 \r
81         @Override\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
85         }\r
86 \r
87         final String[] propertyNames = { SheetVariables.CONTENT, Variables.LABEL, "immutable" }; \r
88         final Binding[] bindings = { Bindings.VARIANT, Bindings.STRING, Bindings.BOOLEAN};\r
89         \r
90         @Override\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
94                         \r
95                         VariantMatrix matrix = new VariantMatrix(range.height(),range.width());\r
96                         \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
102                                         if(child != null)\r
103                                             value = child.getPossiblePropertyValue(graph, SheetVariables.CONTENT, Bindings.VARIANT);\r
104                                         matrix.set(y-range.startRow, x-range.startColumn, value);\r
105                                 }\r
106                         }\r
107                         \r
108                         return new ConstantChildVariable(this, name, propertyNames, bindings, new Object[] {\r
109                                         Variant.ofInstance(matrix), null, name, false\r
110                         });\r
111                         \r
112                 } else {\r
113                         return super.getPossibleSpecialChild(graph, name);\r
114                 }\r
115         }\r
116         \r
117 }\r