]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/Scale.java
3a32a35c1c54076cf2e052fb9733e7ba04d771cb
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / widgets / Scale.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.concurrent.CopyOnWriteArrayList;\r
15 \r
16 import org.eclipse.swt.events.SelectionListener;\r
17 import org.eclipse.swt.widgets.Composite;\r
18 import org.eclipse.swt.widgets.Control;\r
19 import org.eclipse.swt.widgets.Display;\r
20 import org.simantics.browsing.ui.swt.widgets.impl.ReadFactory;\r
21 import org.simantics.browsing.ui.swt.widgets.impl.Widget;\r
22 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;\r
23 import org.simantics.db.management.ISessionContext;\r
24 import org.simantics.db.procedure.Listener;\r
25 \r
26 public class Scale extends WidgetImpl {\r
27 \r
28     private ReadFactory<?, Integer> selectionFactory;\r
29     private final CopyOnWriteArrayList<SelectionListener> selectionListeners = new CopyOnWriteArrayList<SelectionListener>();\r
30 \r
31     final private Display display;\r
32     final private org.eclipse.swt.widgets.Scale scale;\r
33 \r
34     public Scale(Composite parent, WidgetSupport support, int style) {\r
35         super(support);\r
36         this.display = parent.getDisplay();\r
37         scale = new org.eclipse.swt.widgets.Scale(parent, style);\r
38         scale.setData("org.simantics.browsing.ui.widgets.Scale", this);\r
39         support.register(this);\r
40     }\r
41 \r
42     public void setSelectionFactory(ReadFactory<?, Integer> selectionFactory) {\r
43         this.selectionFactory = selectionFactory;\r
44     }\r
45 \r
46     public org.eclipse.swt.widgets.Scale getWidget() {\r
47         return scale;\r
48     }\r
49 \r
50     @Override\r
51     public Control getControl() {\r
52         return scale;\r
53     }\r
54 \r
55     @Override\r
56     public void setInput(ISessionContext context, Object input) {\r
57 \r
58         if (selectionListeners != null) {\r
59             for (SelectionListener listener : selectionListeners) {\r
60                 if(listener instanceof Widget) {\r
61                     ((Widget) listener).setInput(context, input);\r
62                 }\r
63             }\r
64         }\r
65 \r
66         if(selectionFactory != null) {\r
67             selectionFactory.listen(context, input, new Listener<Integer>() {\r
68 \r
69                 @Override\r
70                 public void exception(Throwable t) {\r
71                     t.printStackTrace();\r
72                 }\r
73 \r
74                 @Override\r
75                 public void execute(final Integer selection) {\r
76                     if(isDisposed()) return;\r
77                     display.asyncExec(new Runnable() {\r
78 \r
79                         @Override\r
80                         public void run() {\r
81                             if(isDisposed()) return;\r
82                             if(selection == null) return;\r
83                             for(SelectionListener listener : selectionListeners) scale.removeSelectionListener(listener);\r
84                             scale.setSelection(selection);\r
85                             for(SelectionListener listener : selectionListeners) scale.addSelectionListener(listener);\r
86                         }\r
87 \r
88                     });\r
89                 }\r
90 \r
91                 @Override\r
92                 public boolean isDisposed() {\r
93                     return scale.isDisposed();\r
94                 }\r
95 \r
96             });\r
97         }\r
98 \r
99     }\r
100 \r
101     public synchronized void addSelectionListener(SelectionListener listener) {\r
102         selectionListeners.add(listener);\r
103         scale.addSelectionListener(listener);\r
104     }\r
105 \r
106 }\r