]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/Combo2.java
8a7066a531c20f931b7031e77b9c2e136310add8
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / widgets / Combo2.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2012 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.swt.widgets;\r
13 \r
14 import java.util.List;\r
15 import java.util.concurrent.CopyOnWriteArrayList;\r
16 \r
17 import org.eclipse.swt.events.ModifyListener;\r
18 import org.eclipse.swt.widgets.Composite;\r
19 import org.eclipse.swt.widgets.Control;\r
20 import org.eclipse.swt.widgets.Display;\r
21 import org.simantics.Simantics;\r
22 import org.simantics.browsing.ui.swt.widgets.impl.Widget;\r
23 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;\r
24 import org.simantics.db.ReadGraph;\r
25 import org.simantics.db.common.request.ParametrizedRead;\r
26 import org.simantics.db.common.request.UniqueRead;\r
27 import org.simantics.db.exception.DatabaseException;\r
28 import org.simantics.db.management.ISessionContext;\r
29 import org.simantics.db.procedure.Listener;\r
30 import org.simantics.utils.datastructures.Pair;\r
31 \r
32 public class Combo2 extends WidgetImpl {\r
33 \r
34         private WidgetSupport support;\r
35     private final CopyOnWriteArrayList<ModifyListener> modifyListeners = new CopyOnWriteArrayList<ModifyListener>();\r
36     private List<Pair<String, Object>> itemList;\r
37 \r
38     final private Display display;\r
39     final private org.eclipse.swt.widgets.Combo combo;\r
40 \r
41     public Combo2(Composite parent, WidgetSupport support, int style) {\r
42         super(support);\r
43         this.display = parent.getDisplay();\r
44         combo = new org.eclipse.swt.widgets.Combo(parent, style);\r
45         combo.setData("org.simantics.browsing.ui.widgets.Combo", this);\r
46         support.register(this);\r
47     }\r
48 \r
49     public void setAvailable(List<Pair<String, Object>> items) {\r
50 \r
51         itemList = items;\r
52         for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
53         combo.setData(items);\r
54         combo.clearSelection();\r
55         try {\r
56             combo.removeAll();\r
57         } catch (Throwable t) {\r
58             t.printStackTrace();\r
59         }\r
60         if (items != null) {\r
61             int index = 0;\r
62             for(Pair<String, Object> key : items) {\r
63                 combo.add(key.first);\r
64                 combo.setData(key.first, index++);\r
65             }\r
66             String selectionKey = (String)combo.getData("_SelectionKey");\r
67             if(selectionKey != null) {\r
68                 Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
69                 if(selectionIndex != null) combo.select(selectionIndex);\r
70             }\r
71         }\r
72         for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
73         \r
74     }\r
75     \r
76     public <T> void setAvailable(final ParametrizedRead<T, List<Pair<String, Object>>> read) {\r
77         \r
78         Simantics.getSession().async(new UniqueRead<List<Pair<String, Object>>>() {\r
79 \r
80                         @Override\r
81                         public List<Pair<String, Object>> perform(ReadGraph graph) throws DatabaseException {\r
82                                 T input = support.getInput(graph);\r
83                                 return graph.syncRequest(read.get(input));\r
84                         }\r
85                 \r
86         }, new Listener<List<Pair<String, Object>>>() {\r
87 \r
88             @Override\r
89             public void exception(Throwable t) {\r
90                 t.printStackTrace();\r
91             }\r
92 \r
93             @Override\r
94             public void execute(final List<Pair<String, Object>> items) {\r
95                 if(isDisposed()) return;\r
96                 display.asyncExec(new Runnable() {\r
97 \r
98                     @Override\r
99                     public void run() {\r
100                         if(isDisposed()) return;\r
101                         itemList = items;\r
102                         for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
103                         combo.setData(items);\r
104                         combo.clearSelection();\r
105                         try {\r
106                             combo.removeAll();\r
107                         } catch (Throwable t) {\r
108                             t.printStackTrace();\r
109                         }\r
110                         if (items != null) {\r
111                             int index = 0;\r
112                             for(Pair<String, Object> key : items) {\r
113                                 combo.add(key.first);\r
114                                 combo.setData(key.first, index++);\r
115                             }\r
116                             String selectionKey = (String)combo.getData("_SelectionKey");\r
117                             if(selectionKey != null) {\r
118                                 Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
119                                 if(selectionIndex != null) combo.select(selectionIndex);\r
120                             }\r
121                         }\r
122                         for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
123                     }\r
124 \r
125                 });\r
126             }\r
127 \r
128             @Override\r
129             public boolean isDisposed() {\r
130                 return combo.isDisposed();\r
131             }\r
132 \r
133         });\r
134         \r
135     }\r
136 \r
137     public void setSelection(String selectionKey) {\r
138 \r
139         if(selectionKey == null) return;\r
140         for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
141         combo.setData("_SelectionKey", selectionKey);\r
142         Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
143         if(selectionIndex != null) combo.select(selectionIndex);\r
144         for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
145         \r
146     }\r
147 \r
148     public <T> void setSelection(final ParametrizedRead<T, String> read) {\r
149         \r
150         Simantics.getSession().async(new UniqueRead<String>() {\r
151 \r
152                         @Override\r
153                         public String perform(ReadGraph graph) throws DatabaseException {\r
154                                 T input = support.getInput(graph);\r
155                                 return graph.syncRequest(read.get(input));\r
156                         }\r
157                 \r
158         }, new Listener<String>() {\r
159 \r
160             @Override\r
161             public void exception(Throwable t) {\r
162                 t.printStackTrace();\r
163             }\r
164 \r
165             @Override\r
166             public void execute(final String selectionKey) {\r
167                 if(isDisposed()) return;\r
168                 display.asyncExec(new Runnable() {\r
169 \r
170                     @Override\r
171                     public void run() {\r
172                         if(isDisposed()) return;\r
173                         if(selectionKey == null) return;\r
174                         for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
175                         combo.setData("_SelectionKey", selectionKey);\r
176                         Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
177                         if(selectionIndex != null) combo.select(selectionIndex);\r
178                         for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
179                     }\r
180 \r
181                 });\r
182             }\r
183 \r
184             @Override\r
185             public boolean isDisposed() {\r
186                 return combo.isDisposed();\r
187             }\r
188 \r
189         });\r
190         \r
191     }\r
192 \r
193     public org.eclipse.swt.widgets.Combo getWidget() {\r
194         return combo;\r
195     }\r
196 \r
197     @Override\r
198     public Control getControl() {\r
199         return combo;\r
200     }\r
201 \r
202 //    private AtomicBoolean inputDisposed;\r
203 \r
204     @Override\r
205     public void setInput(ISessionContext context, Object input) {\r
206 \r
207 //        if (this.inputDisposed != null)\r
208 //            this.inputDisposed.set(true);\r
209 //        final AtomicBoolean inputDisposed = this.inputDisposed = new AtomicBoolean(false);\r
210 \r
211         if (modifyListeners != null) {\r
212             for (ModifyListener listener : modifyListeners) {\r
213                 if(listener instanceof Widget) {\r
214                     ((Widget) listener).setInput(context, input);\r
215                 }\r
216             }\r
217         }\r
218 \r
219 //        if(itemFactory != null) {\r
220 //            itemFactory.listen(context, input, new Listener<Map<String, Object>>() {\r
221 //\r
222 //                @Override\r
223 //                public void exception(Throwable t) {\r
224 //                    t.printStackTrace();\r
225 //                }\r
226 //\r
227 //                @Override\r
228 //                public void execute(final Map<String, Object> items) {\r
229 //                    if(isDisposed()) return;\r
230 //                    display.asyncExec(new Runnable() {\r
231 //\r
232 //                        @Override\r
233 //                        public void run() {\r
234 //                            if(isDisposed()) return;\r
235 ////                            System.out.println("Combo received new items: " + items.size());\r
236 //                            for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
237 //                            combo.setData(items);\r
238 //                            combo.clearSelection();\r
239 //                            try {\r
240 //                                combo.removeAll();\r
241 //                            } catch (Throwable t) {\r
242 //                                t.printStackTrace();\r
243 //                            }\r
244 //                            int index = 0;\r
245 //                            for(String key : items.keySet()) {\r
246 ////                                System.out.println("-" + key);\r
247 //                                combo.add(key);\r
248 //                                combo.setData(key, index++);\r
249 //                            }\r
250 //                            String selectionKey = (String)combo.getData("_SelectionKey");\r
251 //                            if(selectionKey != null) {\r
252 //                                Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
253 //                                if(selectionIndex != null) combo.select(selectionIndex);\r
254 //                            }\r
255 //                            for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
256 //                            //label.setSize(200, 20);\r
257 ////                            label.getParent().layout();\r
258 ////                            label.getParent().getParent().layout();\r
259 //                        }\r
260 //\r
261 //                    });\r
262 //                }\r
263 //\r
264 //                @Override\r
265 //                public boolean isDisposed() {\r
266 //                    return combo.isDisposed() || inputDisposed.get();\r
267 //                }\r
268 //\r
269 //            });\r
270 //        }\r
271 //\r
272 //        if(itemFactory2 != null) {\r
273 //            itemFactory2.listen(context, input, new Listener<List<Pair<String, Object>>>() {\r
274 //\r
275 //                @Override\r
276 //                public void exception(Throwable t) {\r
277 //                    t.printStackTrace();\r
278 //                }\r
279 //\r
280 //                @Override\r
281 //                public void execute(final List<Pair<String, Object>> items) {\r
282 //                    if(isDisposed()) return;\r
283 //                    display.asyncExec(new Runnable() {\r
284 //\r
285 //                        @Override\r
286 //                        public void run() {\r
287 //                            if(isDisposed()) return;\r
288 ////                            System.out.println("Combo received new items: " + items.size());\r
289 //                            itemList = items;\r
290 //                            for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
291 //                            combo.setData(items);\r
292 //                            combo.clearSelection();\r
293 //                            try {\r
294 //                                combo.removeAll();\r
295 //                            } catch (Throwable t) {\r
296 //                                t.printStackTrace();\r
297 //                            }\r
298 //                            if (items != null) {\r
299 //                                int index = 0;\r
300 //                                for(Pair<String, Object> key : items) {\r
301 ////                                    System.out.println("-" + key);\r
302 //                                    combo.add(key.first);\r
303 //                                    combo.setData(key.first, index++);\r
304 //                                }\r
305 //                                String selectionKey = (String)combo.getData("_SelectionKey");\r
306 //                                if(selectionKey != null) {\r
307 //                                    Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
308 //                                    if(selectionIndex != null) combo.select(selectionIndex);\r
309 //                                }\r
310 //                            }\r
311 //                            for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
312 //                            //label.setSize(200, 20);\r
313 ////                                                    label.getParent().layout();\r
314 ////                                                    label.getParent().getParent().layout();\r
315 //                        }\r
316 //\r
317 //                    });\r
318 //                }\r
319 //\r
320 //                @Override\r
321 //                public boolean isDisposed() {\r
322 //                    return combo.isDisposed() || inputDisposed.get();\r
323 //                }\r
324 //\r
325 //            });\r
326 //        }\r
327 //\r
328 //        if(selectionFactory != null) {\r
329 //            selectionFactory.listen(context, input, new Listener<String>() {\r
330 //\r
331 //                @Override\r
332 //                public void exception(Throwable t) {\r
333 //                    t.printStackTrace();\r
334 //                }\r
335 //\r
336 //                @Override\r
337 //                public void execute(final String selectionKey) {\r
338 //                    if(isDisposed()) return;\r
339 //                    display.asyncExec(new Runnable() {\r
340 //\r
341 //                        @Override\r
342 //                        public void run() {\r
343 //                            if(isDisposed()) return;\r
344 //                            if(selectionKey == null) return;\r
345 ////                            System.out.println("Combo received new selection key: " + selectionKey);\r
346 //                            for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);\r
347 //                            combo.setData("_SelectionKey", selectionKey);\r
348 //                            Integer selectionIndex = (Integer)combo.getData(selectionKey);\r
349 //                            if(selectionIndex != null) combo.select(selectionIndex);\r
350 //                            for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);\r
351 //                        }\r
352 //\r
353 //                    });\r
354 //                }\r
355 //\r
356 //                @Override\r
357 //                public boolean isDisposed() {\r
358 //                    return combo.isDisposed() || inputDisposed.get();\r
359 //                }\r
360 //\r
361 //            });\r
362 //        }\r
363 \r
364     }\r
365 \r
366     public synchronized void addModifyListener(ModifyListener listener) {\r
367         modifyListeners.add(listener);\r
368         combo.addModifyListener(listener);\r
369     }\r
370 \r
371     /**\r
372      * @param index\r
373      * @return\r
374      * @throws IndexOutOfBoundsException if index is outside widget bounds\r
375      */\r
376     @SuppressWarnings("unchecked")\r
377     public <T> Pair<String, T> getData(int index) {\r
378 //        if (itemFactory != null)\r
379 //            new IllegalStateException("this method is only useful when used with Combo.setItemFactory2").printStackTrace();\r
380         if (index == -1)\r
381             return null;\r
382         return (Pair<String, T>) itemList.get(index);\r
383     }\r
384 \r
385     /**\r
386      * @return selected combo list item or <code>null</code> if no item is\r
387      *         selected\r
388      */\r
389     public <T> Pair<String, T> getSelectedData() {\r
390         return getData(combo.getSelectionIndex());\r
391     }\r
392 \r
393 }\r