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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.browsing.ui.swt.widgets;
\r
14 import java.util.List;
\r
15 import java.util.concurrent.CopyOnWriteArrayList;
\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
32 public class Combo2 extends WidgetImpl {
\r
34 private WidgetSupport support;
\r
35 private final CopyOnWriteArrayList<ModifyListener> modifyListeners = new CopyOnWriteArrayList<ModifyListener>();
\r
36 private List<Pair<String, Object>> itemList;
\r
38 final private Display display;
\r
39 final private org.eclipse.swt.widgets.Combo combo;
\r
41 public Combo2(Composite parent, WidgetSupport support, int style) {
\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
49 public void setAvailable(List<Pair<String, Object>> items) {
\r
52 for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);
\r
53 combo.setData(items);
\r
54 combo.clearSelection();
\r
57 } catch (Throwable t) {
\r
58 t.printStackTrace();
\r
60 if (items != null) {
\r
62 for(Pair<String, Object> key : items) {
\r
63 combo.add(key.first);
\r
64 combo.setData(key.first, index++);
\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
72 for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);
\r
76 public <T> void setAvailable(final ParametrizedRead<T, List<Pair<String, Object>>> read) {
\r
78 Simantics.getSession().async(new UniqueRead<List<Pair<String, Object>>>() {
\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
86 }, new Listener<List<Pair<String, Object>>>() {
\r
89 public void exception(Throwable t) {
\r
90 t.printStackTrace();
\r
94 public void execute(final List<Pair<String, Object>> items) {
\r
95 if(isDisposed()) return;
\r
96 display.asyncExec(new Runnable() {
\r
100 if(isDisposed()) return;
\r
102 for(ModifyListener listener : modifyListeners) combo.removeModifyListener(listener);
\r
103 combo.setData(items);
\r
104 combo.clearSelection();
\r
107 } catch (Throwable t) {
\r
108 t.printStackTrace();
\r
110 if (items != null) {
\r
112 for(Pair<String, Object> key : items) {
\r
113 combo.add(key.first);
\r
114 combo.setData(key.first, index++);
\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
122 for(ModifyListener listener : modifyListeners) combo.addModifyListener(listener);
\r
129 public boolean isDisposed() {
\r
130 return combo.isDisposed();
\r
137 public void setSelection(String selectionKey) {
\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
148 public <T> void setSelection(final ParametrizedRead<T, String> read) {
\r
150 Simantics.getSession().async(new UniqueRead<String>() {
\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
158 }, new Listener<String>() {
\r
161 public void exception(Throwable t) {
\r
162 t.printStackTrace();
\r
166 public void execute(final String selectionKey) {
\r
167 if(isDisposed()) return;
\r
168 display.asyncExec(new Runnable() {
\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
185 public boolean isDisposed() {
\r
186 return combo.isDisposed();
\r
193 public org.eclipse.swt.widgets.Combo getWidget() {
\r
198 public Control getControl() {
\r
202 // private AtomicBoolean inputDisposed;
\r
205 public void setInput(ISessionContext context, Object input) {
\r
207 // if (this.inputDisposed != null)
\r
208 // this.inputDisposed.set(true);
\r
209 // final AtomicBoolean inputDisposed = this.inputDisposed = new AtomicBoolean(false);
\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
219 // if(itemFactory != null) {
\r
220 // itemFactory.listen(context, input, new Listener<Map<String, Object>>() {
\r
223 // public void exception(Throwable t) {
\r
224 // t.printStackTrace();
\r
228 // public void execute(final Map<String, Object> items) {
\r
229 // if(isDisposed()) return;
\r
230 // display.asyncExec(new Runnable() {
\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
240 // combo.removeAll();
\r
241 // } catch (Throwable t) {
\r
242 // t.printStackTrace();
\r
245 // for(String key : items.keySet()) {
\r
246 //// System.out.println("-" + key);
\r
248 // combo.setData(key, index++);
\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
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
265 // public boolean isDisposed() {
\r
266 // return combo.isDisposed() || inputDisposed.get();
\r
272 // if(itemFactory2 != null) {
\r
273 // itemFactory2.listen(context, input, new Listener<List<Pair<String, Object>>>() {
\r
276 // public void exception(Throwable t) {
\r
277 // t.printStackTrace();
\r
281 // public void execute(final List<Pair<String, Object>> items) {
\r
282 // if(isDisposed()) return;
\r
283 // display.asyncExec(new Runnable() {
\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
294 // combo.removeAll();
\r
295 // } catch (Throwable t) {
\r
296 // t.printStackTrace();
\r
298 // if (items != null) {
\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
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
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
321 // public boolean isDisposed() {
\r
322 // return combo.isDisposed() || inputDisposed.get();
\r
328 // if(selectionFactory != null) {
\r
329 // selectionFactory.listen(context, input, new Listener<String>() {
\r
332 // public void exception(Throwable t) {
\r
333 // t.printStackTrace();
\r
337 // public void execute(final String selectionKey) {
\r
338 // if(isDisposed()) return;
\r
339 // display.asyncExec(new Runnable() {
\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
357 // public boolean isDisposed() {
\r
358 // return combo.isDisposed() || inputDisposed.get();
\r
366 public synchronized void addModifyListener(ModifyListener listener) {
\r
367 modifyListeners.add(listener);
\r
368 combo.addModifyListener(listener);
\r
374 * @throws IndexOutOfBoundsException if index is outside widget bounds
\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
382 return (Pair<String, T>) itemList.get(index);
\r
386 * @return selected combo list item or <code>null</code> if no item is
\r
389 public <T> Pair<String, T> getSelectedData() {
\r
390 return getData(combo.getSelectionIndex());
\r