]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/adapter/SpreadsheetVariable.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/adapter/SpreadsheetVariable.java
new file mode 100644 (file)
index 0000000..016209a
--- /dev/null
@@ -0,0 +1,117 @@
+package org.simantics.spreadsheet.graph.adapter;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.ConstantChildVariable;\r
+import org.simantics.db.layer0.variable.ExtendedGraphChildVariable;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.VariableSpaceManipulator;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.spreadsheet.Range;\r
+import org.simantics.spreadsheet.SheetVariables;\r
+import org.simantics.spreadsheet.common.matrix.VariantMatrix;\r
+import org.simantics.spreadsheet.util.SpreadsheetUtils;\r
+\r
+public class SpreadsheetVariable extends ExtendedGraphChildVariable {\r
+\r
+//    final private Collection<Pair<StringCellParser, GraphCellCreator>> creators = new ArrayList<Pair<StringCellParser, GraphCellCreator>>(); \r
+       \r
+       public SpreadsheetVariable(Variable parent, Resource resource) throws DatabaseException {\r
+               \r
+               super(parent, resource);\r
+               \r
+//         creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.MATRIX_PARSER, new MatrixCellCreator(resource)));\r
+//         creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.EXPRESSION_PARSER, new ExpressionCellCreator(resource)));\r
+//         creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.COMMAND_PARSER, new CommandCellCreator(resource)));\r
+//         creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.RESOURCE_ARRAY_PARSER, new ResourceArrayCellCreator(resource)));\r
+//         creators.add(new Pair<StringCellParser, GraphCellCreator>(Parsers.TEXT_PARSER, new TextCellCreator(resource)));\r
+           \r
+       }\r
+       \r
+    @SuppressWarnings("unchecked")\r
+    protected <T> T tryAdapt(ReadGraph graph, Class<T> clazz) throws DatabaseException {\r
+               if(VariableSpaceManipulator.class == clazz) {\r
+                       \r
+                       return (T)new VariableSpaceManipulator() {\r
+\r
+                               @Override\r
+                               public void apply(WriteGraph graph, Modification modification) throws DatabaseException {\r
+                                       \r
+                                       Layer0 L0 = Layer0.getInstance(graph);\r
+                                       for(String name : modification.removedChildren) {\r
+                                               Variable child = getChild(graph, name);\r
+                                               Resource represents = child.getRepresents(graph);\r
+                                               graph.deny(represents, L0.PartOf);\r
+                                       }\r
+                                       \r
+                                       for(ChildCreationData data : modification.newChildren) {\r
+                                               Resource container = getRepresents(graph);\r
+                                               Resource cell = graph.newResource();\r
+                                               Resource type = graph.getResource(data.type);\r
+                                               graph.claim(cell, L0.InstanceOf, null, type);\r
+                                               graph.addLiteral(cell, L0.HasName, L0.NameOf, L0.String, data.name, Bindings.STRING);\r
+                                               for(PropertyCreationData p : data.properties) {\r
+                                                       Resource property = graph.getResource(p.name);\r
+                                                       graph.claimLiteral(cell, property, p.value.getValue());\r
+                                               }\r
+                                               graph.claim(cell, L0.PartOf, container);\r
+                                               \r
+                                       }\r
+                                       \r
+                               }\r
+                               \r
+                       };\r
+                       \r
+               }\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public <T> T adapt(ReadGraph graph, Class<T> clazz) throws DatabaseException {\r
+               T t = tryAdapt(graph, clazz);\r
+               return t != null ? t : super.adapt(graph, clazz);\r
+       }\r
+\r
+       @Override\r
+       public <T> T adaptPossible(ReadGraph graph, Class<T> clazz) throws DatabaseException {\r
+               T t = tryAdapt(graph, clazz);\r
+               return t != null ? t : super.adaptPossible(graph, clazz);\r
+       }\r
+\r
+       final String[] propertyNames = { SheetVariables.CONTENT, Variables.LABEL, "immutable" }; \r
+       final Binding[] bindings = { Bindings.VARIANT, Bindings.STRING, Bindings.BOOLEAN};\r
+       \r
+       @Override\r
+       public Variable getPossibleSpecialChild(ReadGraph graph, String name) throws DatabaseException {\r
+               if(name.contains(":")) {\r
+                       Range range = SpreadsheetUtils.decodeRange(name, 0, 0);\r
+                       \r
+                       VariantMatrix matrix = new VariantMatrix(range.height(),range.width());\r
+                       \r
+                       for(int x=range.startColumn;x<=range.endColumn;x++) {\r
+                               for(int y=range.startRow;y<=range.endRow;y++) {\r
+                                       String location = SpreadsheetUtils.cellName(y,x);\r
+                                       Variable child = getPossibleChild(graph, location);\r
+                                       Variant value = null;\r
+                                       if(child != null)\r
+                                           value = child.getPossiblePropertyValue(graph, SheetVariables.CONTENT, Bindings.VARIANT);\r
+                                       matrix.set(y-range.startRow, x-range.startColumn, value);\r
+                               }\r
+                       }\r
+                       \r
+                       return new ConstantChildVariable(this, name, propertyNames, bindings, new Object[] {\r
+                                       Variant.ofInstance(matrix), null, name, false\r
+                       });\r
+                       \r
+               } else {\r
+                       return super.getPossibleSpecialChild(graph, name);\r
+               }\r
+       }\r
+       \r
+}\r