]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/adapter/StringArrayCells.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / adapter / StringArrayCells.java
1 package org.simantics.spreadsheet.graph.adapter;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.Collections;\r
6 \r
7 import org.simantics.databoard.Bindings;\r
8 import org.simantics.databoard.binding.Binding;\r
9 import org.simantics.db.ReadGraph;\r
10 import org.simantics.db.Resource;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.db.layer0.variable.ConstantChildVariable;\r
13 import org.simantics.db.layer0.variable.Variable;\r
14 import org.simantics.db.layer0.variable.VariableFactory;\r
15 import org.simantics.db.layer0.variable.Variables;\r
16 import org.simantics.spreadsheet.resource.SpreadsheetResource;\r
17 import org.simantics.spreadsheet.util.SpreadsheetUtils;\r
18 \r
19 public class StringArrayCells implements VariableFactory {\r
20 \r
21         private Resource configuration;\r
22         \r
23         public StringArrayCells(Resource configuration) {\r
24                 this.configuration = configuration;\r
25         }\r
26 \r
27         final String[] propertyNames = { Variables.LABEL, "immutable" }; \r
28         final Binding[] bindings = { Bindings.STRING, Bindings.BOOLEAN };\r
29         \r
30         private Collection<Variable> toVariables(ReadGraph graph, Variable variable, String[] data, int width) throws DatabaseException {\r
31 \r
32                 SpreadsheetResource sr = SpreadsheetResource.getInstance(graph);\r
33                 String location = graph.getPossibleRelatedValue(configuration, sr.HasLocation, Bindings.STRING);\r
34                 if(location == null) return Collections.emptyList();\r
35                 \r
36                 int rows = data.length / width;\r
37                 \r
38                 ArrayList<Variable> result = new ArrayList<Variable>();\r
39                 for(int offset=0,i=0;i<rows;i++) {\r
40                         for(int j=0;j<width;j++) {\r
41                                 String value = data[offset++];\r
42                                 String valueLocation = SpreadsheetUtils.offset(location, i, j);\r
43                                 result.add(new ConstantChildVariable(variable, valueLocation, propertyNames, bindings, new Object[] { value, true }));\r
44                         }\r
45                 }\r
46                 return result;\r
47 \r
48         }\r
49         \r
50         private Collection<Variable> error(ReadGraph graph, Variable variable, String message) throws DatabaseException {\r
51 \r
52                 SpreadsheetResource sr = SpreadsheetResource.getInstance(graph);\r
53                 String location = graph.getPossibleRelatedValue(configuration, sr.HasLocation, Bindings.STRING);\r
54                 if(location == null) return Collections.emptyList();\r
55                 \r
56                 return Collections.<Variable>singletonList(new ConstantChildVariable(variable, location, propertyNames, bindings, new Object[] { message })); \r
57 \r
58         }\r
59         \r
60         @Override\r
61         public Collection<Variable> evaluate(ReadGraph graph, Variable variable) throws DatabaseException {\r
62                 \r
63                 SpreadsheetResource sr = SpreadsheetResource.getInstance(graph);\r
64                 String[] data = graph.getPossibleRelatedValue(configuration, sr.StringArrayCell_HasStringArray, Bindings.STRING_ARRAY);\r
65                 if(data == null) return error(graph, variable, "No string array data.");\r
66                 Integer width = graph.getPossibleRelatedValue(configuration, sr.StringArrayCell_HasWidth, Bindings.INTEGER);\r
67                 if(width == null) return error(graph, variable, "Invalid width for string array.");\r
68                         \r
69                 return toVariables(graph, variable, data, width);\r
70                 \r
71         }\r
72         \r
73 }\r