]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/EnumerationVariableModifier2.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.graph.impl / src / org / simantics / browsing / ui / graph / impl / EnumerationVariableModifier2.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.browsing.ui.graph.impl;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collections;\r
16 import java.util.HashSet;\r
17 import java.util.List;\r
18 import java.util.Set;\r
19 \r
20 import org.simantics.browsing.ui.content.Labeler.EnumerationModifier;\r
21 import org.simantics.databoard.Bindings;\r
22 import org.simantics.db.ReadGraph;\r
23 import org.simantics.db.RequestProcessor;\r
24 import org.simantics.db.Resource;\r
25 import org.simantics.db.Session;\r
26 import org.simantics.db.UndoContext;\r
27 import org.simantics.db.VirtualGraph;\r
28 import org.simantics.db.WriteGraph;\r
29 import org.simantics.db.common.request.ObjectsWithType;\r
30 import org.simantics.db.common.request.WriteRequest;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.db.layer0.variable.Variable;\r
33 import org.simantics.db.layer0.variable.Variables;\r
34 import org.simantics.db.request.Read;\r
35 import org.simantics.layer0.Layer0;\r
36 import org.simantics.utils.datastructures.Callback;\r
37 import org.simantics.utils.ui.ErrorLogger;\r
38 \r
39 /**\r
40  * @author Tuukka Lehtonen\r
41  */\r
42 public class EnumerationVariableModifier2 implements EnumerationModifier {\r
43 \r
44     protected final Session      session;\r
45     protected final UndoContext  undoContext;\r
46     protected final Variable     variable;\r
47     protected final Set<String> allowedValues;\r
48     protected final String       defaultValue;\r
49 \r
50     protected Throwable        modifierFailed;\r
51 \r
52     public EnumerationVariableModifier2(RequestProcessor processor, UndoContext undoContext, Variable variable) {\r
53 \r
54         this.session = processor.getSession();\r
55         this.undoContext = undoContext;\r
56         this.variable = variable;\r
57         this.allowedValues = computeAllowedValues(processor, variable);\r
58         this.defaultValue = computeDefaultValue(processor, variable);\r
59         \r
60     }\r
61 \r
62     protected String computeDefaultValue(RequestProcessor processor, final Variable variable) {\r
63         try {\r
64            return processor.syncRequest(new Read<String>() {\r
65                 @Override\r
66                 public String perform(ReadGraph graph) throws DatabaseException {\r
67                         return variable.getPossiblePropertyValue(graph, Variables.LABEL);\r
68                 }\r
69             });\r
70         } catch (DatabaseException e) {\r
71             return "";\r
72         }\r
73     }\r
74     \r
75     protected Set<String> computeAllowedValues(RequestProcessor processor, final Variable variable) {\r
76         try {\r
77            return processor.syncRequest(new Read<Set<String>>() {\r
78                 @Override\r
79                 public Set<String> perform(ReadGraph graph) throws DatabaseException {\r
80 \r
81                         Layer0 L0 = Layer0.getInstance(graph);\r
82                         Set<String> result = new HashSet<String>();\r
83                         Resource literal = variable.getPossibleRepresents(graph);\r
84                         Resource type = graph.getSingleObject(literal, L0.PartOf);\r
85                         for(Resource lit : graph.syncRequest(new ObjectsWithType(type, L0.ConsistsOf, type))) {\r
86                                 String label = graph.getPossibleRelatedValue(lit, L0.HasLabel);\r
87                                 if(label == null) label = graph.getRelatedValue(lit, L0.HasName);\r
88                                 result.add(label);\r
89                         }\r
90                         return result;\r
91                         \r
92                 }\r
93             });\r
94         } catch (DatabaseException e) {\r
95             return Collections.emptySet();\r
96         }\r
97     }\r
98 \r
99     public class Write extends WriteRequest {\r
100 \r
101         final private Variable variable;\r
102         final private String label;\r
103 \r
104         public Write(Variable variable, String label) {\r
105             super((VirtualGraph)null);\r
106             this.variable = variable;\r
107             this.label = label;\r
108         }\r
109 \r
110         @Override\r
111         public void perform(WriteGraph graph) throws DatabaseException {\r
112                 variable.setValue(graph, label, Bindings.STRING);\r
113         }\r
114 \r
115     }\r
116     \r
117     protected void doModify(final String label) {\r
118         session.asyncRequest(new Write(variable, label),\r
119                 new Callback<DatabaseException>() {\r
120             @Override\r
121             public void run(DatabaseException parameter) {\r
122                 if (parameter != null)\r
123                     ErrorLogger.defaultLogError(parameter);\r
124             }\r
125         });\r
126     }\r
127 \r
128     @Override\r
129     public String getValue() {\r
130         return defaultValue;\r
131     }\r
132 \r
133     @Override\r
134     public String isValid(String label) {\r
135         if (modifierFailed != null)\r
136             return "Could not resolve validator for this value, modification denied. Reason: "\r
137             + modifierFailed.getMessage();\r
138         // Validity should already be enforced by the editing UI for\r
139         // enumerations.\r
140         return null;\r
141     }\r
142 \r
143     @Override\r
144     public final void modify(String label) {\r
145         if (modifierFailed != null)\r
146             // Should never end up here, isValid should prevent it.\r
147             throw new Error("modifier failed: " + modifierFailed.getMessage());\r
148         doModify(label);\r
149     }\r
150 \r
151     @Override\r
152     public List<String> getValues() {\r
153         ArrayList<String> result = new ArrayList<String>();\r
154         result.addAll(allowedValues);\r
155         return result;\r
156     }\r
157 \r
158 };\r