]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.selectionview/src/org/simantics/selectionview/DisplayValueVariableAdapter.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.selectionview / src / org / simantics / selectionview / DisplayValueVariableAdapter.java
1 package org.simantics.selectionview;\r
2 \r
3 import java.io.IOException;\r
4 \r
5 import org.simantics.common.format.Formatter;\r
6 import org.simantics.databoard.Bindings;\r
7 import org.simantics.databoard.Datatypes;\r
8 import org.simantics.databoard.adapter.AdaptException;\r
9 import org.simantics.databoard.binding.Binding;\r
10 import org.simantics.databoard.binding.NumberBinding;\r
11 import org.simantics.databoard.binding.StringBinding;\r
12 import org.simantics.databoard.binding.error.BindingConstructionException;\r
13 import org.simantics.databoard.binding.error.BindingException;\r
14 import org.simantics.databoard.binding.mutable.MutableStringBinding;\r
15 import org.simantics.databoard.parser.DataValuePrinter;\r
16 import org.simantics.databoard.parser.repository.DataTypeSyntaxError;\r
17 import org.simantics.databoard.parser.repository.DataValueRepository;\r
18 import org.simantics.databoard.primitives.MutableString;\r
19 import org.simantics.databoard.type.Datatype;\r
20 import org.simantics.databoard.util.ObjectUtils;\r
21 import org.simantics.db.ReadGraph;\r
22 import org.simantics.db.Resource;\r
23 import org.simantics.db.WriteGraph;\r
24 import org.simantics.db.common.CommentMetadata;\r
25 import org.simantics.db.common.adaption.SimpleContextualAdapter;\r
26 import org.simantics.db.exception.DatabaseException;\r
27 import org.simantics.db.layer0.util.Layer0Utils;\r
28 import org.simantics.db.layer0.variable.ModelledVariablePropertyDescriptor;\r
29 import org.simantics.db.layer0.variable.StandardGraphPropertyVariable;\r
30 import org.simantics.db.layer0.variable.Variable;\r
31 import org.simantics.db.layer0.variable.Variables;\r
32 import org.simantics.layer0.Layer0;\r
33 import org.simantics.modeling.ModelingResources;\r
34 \r
35 public class DisplayValueVariableAdapter extends SimpleContextualAdapter<Variable, ModelledVariablePropertyDescriptor> {\r
36         \r
37         final String key;\r
38         \r
39         public DisplayValueVariableAdapter() {\r
40                 key = SelectionViewResources.URIs.HasDisplayValue;\r
41         }\r
42 \r
43         public DisplayValueVariableAdapter(String key) {\r
44                 this.key = key;\r
45         }\r
46 \r
47         class Impl extends StandardGraphPropertyVariable {\r
48 \r
49                 private Datatype datatype;\r
50 \r
51                 public Impl(ReadGraph graph, Variable parent, Resource parentResource, Datatype datatype) throws DatabaseException {\r
52                         super(graph, parent, null, parentResource, graph.getResource(key));\r
53                         this.datatype = datatype;\r
54                 }\r
55                 \r
56                 @SuppressWarnings("unchecked")\r
57                 @Override\r
58                 public <T> T getValue(ReadGraph graph) throws DatabaseException {\r
59                         return (T)standardGetDisplayValue1(graph, this);\r
60                 }\r
61                 \r
62                 @SuppressWarnings("unchecked")\r
63                 @Override\r
64                 public <T> T getValue(ReadGraph graph, Binding binding) throws DatabaseException {\r
65                         return (T)standardGetDisplayValue2(graph, this, binding);\r
66                 }\r
67                 \r
68                 @Override\r
69                 public Datatype getDatatype(ReadGraph graph) throws DatabaseException {\r
70                         return datatype;\r
71                 }\r
72                         \r
73                 @Override\r
74                 public void setValue(WriteGraph graph, Object value) throws DatabaseException {\r
75                         standardSetDisplayValue2(graph, this, value);\r
76                 }\r
77                 \r
78 \r
79                 @Override\r
80                 public void setValue(WriteGraph graph, Object _value, Binding _binding) throws DatabaseException {\r
81                         standardSetDisplayValue3(graph, this, _value, _binding);\r
82                 }\r
83                 \r
84         }\r
85         \r
86         public static boolean isPrimitive(Datatype dt) {\r
87                 if(Datatypes.STRING.equals(dt)) return true;\r
88                 else return false;\r
89         }\r
90 \r
91         private static String possibleExpression(ReadGraph graph, Variable variable) throws DatabaseException {\r
92                 \r
93                 Layer0 L0 = Layer0.getInstance(graph);\r
94                 ModelingResources MOD = ModelingResources.getInstance(graph);\r
95                 Resource object = variable.getPossibleRepresents(graph);\r
96                 if(object != null && graph.isInstanceOf(object, MOD.SCLValue)) {\r
97                         String expression = graph.getPossibleRelatedValue(object, L0.SCLValue_expression);\r
98                         if (expression != null)\r
99                                 return "=" + expression;\r
100                 }\r
101                 return null;\r
102                 \r
103         }\r
104 \r
105         @Override\r
106         public Variable adapt(ReadGraph graph, Resource source, ModelledVariablePropertyDescriptor context) throws DatabaseException {\r
107                 \r
108 //      String value = getDisplayValue(graph, context.getVariable());\r
109         return new Impl(graph, context.getVariable(), context.getSubject(), Datatypes.STRING);\r
110                 \r
111         }\r
112 \r
113     public static Object standardGetDisplayValue1(ReadGraph graph, Variable property_) throws DatabaseException {\r
114 \r
115         Variable property = property_.getParent(graph); \r
116         \r
117         String expression = possibleExpression(graph, property);\r
118         if(expression != null) return expression;\r
119         \r
120         Object value = property.getValue(graph);\r
121 \r
122         Resource formatter = property.getPossiblePropertyValue(graph, Variables.FORMATTER);\r
123         if(formatter != null) {\r
124                 Formatter fmt = graph.adaptContextual(formatter, property, Variable.class, Formatter.class);\r
125                 value = fmt.format(value);\r
126         } else {\r
127 \r
128                 Datatype dt = property.getPossibleDatatype(graph);\r
129                 if(dt != null) {\r
130                         if(!isPrimitive(dt)) {\r
131                                 Binding binding = Bindings.getBinding(dt);\r
132                                 try {\r
133                                         value = DataValuePrinter.writeValueSingleLine(binding, value);\r
134                                 } catch (IOException e) {\r
135                                         e.printStackTrace();\r
136                                 } catch (BindingException e) {\r
137                                         e.printStackTrace();\r
138                                 }\r
139                         }\r
140                 }\r
141 \r
142         }\r
143 \r
144         return value != null ? value.toString() : "null";\r
145         \r
146     }\r
147 \r
148     public static Object standardGetDisplayValue2(ReadGraph graph, Variable property, Binding binding) throws DatabaseException {\r
149         \r
150                 try {\r
151                         return Bindings.adapt(standardGetDisplayValue1(graph, property), Bindings.STRING, binding);\r
152                 } catch (AdaptException e) {\r
153                         throw new DatabaseException(e);\r
154                 }\r
155         \r
156     }\r
157 \r
158     public static void standardSetDisplayValue2(WriteGraph graph, Variable property_, Object _value) throws DatabaseException {\r
159                         \r
160                 try {\r
161                         Binding binding = Bindings.getBinding(_value.getClass());\r
162                         standardSetDisplayValue3(graph, property_, _value, binding);\r
163                 } catch (BindingConstructionException e) {\r
164                         throw new DatabaseException(e);\r
165                 }\r
166 \r
167     }\r
168 \r
169     public static void standardSetDisplayValue3(WriteGraph graph, Variable property_, Object _value, Binding binding_) throws DatabaseException {\r
170 \r
171         try {\r
172                 \r
173                 Variable parent = property_.getParent(graph);\r
174                 \r
175                         if(!(_value instanceof String)) throw new DatabaseException("setValue for HasDisplayValue only accepts String (got " + _value.getClass().getSimpleName() + ")");\r
176 \r
177                         String text = (String)_value;\r
178                         if(text.startsWith("=")) {\r
179                             Layer0Utils.setExpression(graph, parent, text, ModelingResources.getInstance(graph).SCLValue);\r
180                                 return;\r
181                         }\r
182 \r
183                 String parsedLabel = (String)_value;\r
184             Object value = parsedLabel;\r
185                 \r
186             Datatype type = parent.getPossibleDatatype(graph);\r
187             if (type != null) {\r
188 \r
189                     Binding binding = Bindings.getBinding(type);\r
190 \r
191                     if (binding instanceof StringBinding) {\r
192                         \r
193                         if (binding instanceof MutableStringBinding)\r
194                             value = new MutableString(parsedLabel);\r
195                         else\r
196                             value = parsedLabel;\r
197                         \r
198                     } else {\r
199                         \r
200                         if (binding instanceof NumberBinding) {\r
201                             parsedLabel = parsedLabel.replace(",", ".");\r
202                         }\r
203 \r
204                         value = binding.parseValue(parsedLabel, new DataValueRepository());\r
205                     }\r
206 \r
207                     //System.out.println("VariableWrite " + ObjectUtils.toString(value));\r
208                     parent.setValue(graph, value, binding);\r
209                     \r
210             } else {\r
211 \r
212                 parent.setValue(graph, value);\r
213                 \r
214             }\r
215 \r
216 \r
217             // Add a comment to metadata.\r
218             CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
219             graph.addMetadata(cm.add("Set value " + ObjectUtils.toString(value)));\r
220             \r
221         } catch (DataTypeSyntaxError e) {\r
222             throw new DatabaseException(e);\r
223         } catch (BindingException e) {\r
224             throw new DatabaseException(e);\r
225         }\r
226         \r
227     }\r
228 \r
229     public static Datatype standardGetDisplayValueDatatype(ReadGraph graph, Variable property_) throws DatabaseException {\r
230         return Datatypes.STRING;\r
231     }\r
232         \r
233 }\r