]> gerrit.simantics Code Review - simantics/sysdyn.git/blob
74673a038347fc1eb2bbc10c467fde72d6d2476e
[simantics/sysdyn.git] /
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
3  * 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.jfreechart.chart.properties;\r
13 \r
14 import org.eclipse.core.runtime.ListenerList;\r
15 import org.eclipse.swt.events.ModifyEvent;\r
16 import org.eclipse.swt.events.ModifyListener;\r
17 import org.eclipse.swt.widgets.Composite;\r
18 import org.eclipse.swt.widgets.Spinner;\r
19 import org.simantics.browsing.ui.common.ErrorLogger;\r
20 import org.simantics.browsing.ui.swt.widgets.impl.ReadFactory;\r
21 import org.simantics.browsing.ui.swt.widgets.impl.TextModifyListener;\r
22 import org.simantics.browsing.ui.swt.widgets.impl.TrackedModifyEvent;\r
23 import org.simantics.browsing.ui.swt.widgets.impl.Widget;\r
24 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;\r
25 import org.simantics.db.management.ISessionContext;\r
26 import org.simantics.db.procedure.Listener;\r
27 import org.simantics.utils.ui.SWTUtils;\r
28 \r
29 /**\r
30  * Class for implementing Widget behavior for SWT Spinner in Simantics.\r
31  * \r
32  * @author Teemu Lempinen\r
33  *\r
34  */\r
35 public class TrackedSpinner implements Widget {\r
36 \r
37     private Spinner         spinner;\r
38     private ListenerList    modifyListeners;\r
39     private ReadFactory<?, Integer> selectionFactory;\r
40 \r
41 \r
42     public TrackedSpinner(Composite parent, WidgetSupport support, int style) {\r
43         spinner = new Spinner(parent, style);\r
44         support.register(this);\r
45         \r
46         // Add a ModifyListener that uses all listeners in modifyListeners -list\r
47         spinner.addModifyListener(new ModifyListener() {\r
48             \r
49             @Override\r
50             public void modifyText(ModifyEvent e) {\r
51                 if (modifyListeners != null) {\r
52                     TrackedModifyEvent event = new TrackedModifyEvent(spinner, spinner.getText());\r
53                     for (Object o : modifyListeners.getListeners()) {\r
54                         ((TextModifyListener) o).modifyText(event);\r
55                     }\r
56                 }                \r
57             }\r
58         });\r
59     }\r
60 \r
61     @Override\r
62     public void setInput(ISessionContext context, Object input) {\r
63 \r
64         // Update all modifyListeners\r
65         if (modifyListeners != null) {\r
66             for (Object o : modifyListeners.getListeners()) {\r
67                 if(o instanceof Widget) {\r
68                     ((Widget) o).setInput(context, input);\r
69                 }\r
70             }\r
71         }\r
72 \r
73         if (selectionFactory != null) {\r
74             // Get a value for the spinner\r
75             selectionFactory.listen(context, input, new Listener<Integer>() {\r
76                 @Override\r
77                 public void exception(Throwable t) {\r
78                     ErrorLogger.defaultLogError(t);\r
79                 }\r
80                 @Override\r
81                 public void execute(final Integer selection) {\r
82                     SWTUtils.asyncExec(spinner, new Runnable() {\r
83                         @Override\r
84                         public void run() {\r
85                             if(isDisposed()) return;\r
86                             spinner.setSelection(selection);\r
87                         }\r
88                     });\r
89                 }\r
90                 @Override\r
91                 public boolean isDisposed() {\r
92                     return spinner.isDisposed();\r
93                 }\r
94             });\r
95         }\r
96 \r
97     }\r
98     \r
99     /**\r
100      * Set a selection factory for the spinner\r
101      * \r
102      * @param selectionFactory ReadFactory<?, Integer> SelectionFactory\r
103      */\r
104     public void setSelectionFactory(ReadFactory<?, Integer> selectionFactory) {\r
105         this.selectionFactory = selectionFactory;\r
106     }\r
107     \r
108     /**\r
109      * Add a modifyListener for the spinner\r
110      * @param listener TextModifyListener\r
111      */\r
112     public synchronized void addModifyListener(TextModifyListener listener) {\r
113         if (modifyListeners == null) {\r
114             modifyListeners = new ListenerList(ListenerList.IDENTITY);\r
115         }\r
116         modifyListeners.add(listener);\r
117     }\r
118 \r
119     /**\r
120      * Remove modifyListener from the spinner\r
121      * \r
122      * @param listener TextModifyListener\r
123      */\r
124     public synchronized void removeModifyListener(TextModifyListener listener) {\r
125         if (modifyListeners == null)\r
126             return;\r
127         modifyListeners.remove(listener);\r
128     }\r
129 \r
130     /**\r
131      * Get the SWT Spinner of this TrackedSpinner widget\r
132      * @return\r
133      */\r
134     public Spinner getWidget() {\r
135         return spinner;\r
136     }\r
137     \r
138     /**\r
139      * Set minimum value \r
140      * @param value int minimum value\r
141      */\r
142     public void setMinimum(int value) {\r
143         spinner.setMinimum(value);\r
144     }\r
145     \r
146     /**\r
147      * Set maximum value\r
148      * @param value int maximum value\r
149      */\r
150     public void setMaximum(int value) {\r
151         spinner.setMaximum(value);\r
152     }\r
153     \r
154     /**\r
155      * Sets the receiver's selection, minimum value, maximum value, digits, increment and page increment all at once. \r
156      * \r
157      * @param selection the new selection value\r
158      * @param minimum the new minimum value\r
159      * @param maximum the new maximum value\r
160      * @param digits the new digits value\r
161      * @param increment the new increment value\r
162      * @param pageIncrement the new pageIncrement value\r
163      */\r
164     public void setValues(int selection, int  minimum, int  maximum, int digits, int increment, int pageIncrement) {\r
165         spinner.setValues(selection, minimum, maximum, digits, increment, pageIncrement);\r
166     }\r
167     \r
168     /**\r
169      * Sets the selection, which is the receiver's position, to the argument.\r
170      * If the argument is not within the range specified by minimum and maximum, \r
171      * it will be adjusted to fall within this range.\r
172      * \r
173      * @param value\r
174      */\r
175     public void setSelection(int value) {\r
176         spinner.setSelection(value);\r
177     }\r
178 \r
179 }\r