* Bug #11489 fixed - 'SliderStep' property was ignored for uicontrols.
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / slider / SwingScilabSlider.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Vincent Couvert
4  * Copyright (C) 2007 - INRIA - Marouane BEN JELLOUL
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.bridge.slider;
15
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_MAX__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_MIN__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE__;
19
20 import java.awt.event.AdjustmentEvent;
21 import java.awt.event.AdjustmentListener;
22
23 import javax.swing.JScrollBar;
24 import javax.swing.SwingUtilities;
25
26 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
27 import org.scilab.modules.gui.SwingViewWidget;
28 import org.scilab.modules.gui.SwingViewObject;
29 import org.scilab.modules.gui.events.callback.CommonCallBack;
30 import org.scilab.modules.gui.menubar.MenuBar;
31 import org.scilab.modules.gui.slider.SimpleSlider;
32 import org.scilab.modules.gui.textbox.TextBox;
33 import org.scilab.modules.gui.toolbar.ToolBar;
34 import org.scilab.modules.gui.utils.Position;
35 import org.scilab.modules.gui.utils.PositionConverter;
36 import org.scilab.modules.gui.utils.ScilabRelief;
37 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
38 import org.scilab.modules.gui.utils.Size;
39
40 /**
41  * Swing implementation for Scilab Slider in GUIs
42  * @author Vincent COUVERT
43  * @author Marouane BEN JELLOUL
44  */
45 public class SwingScilabSlider extends JScrollBar implements SwingViewObject, SimpleSlider {
46
47     private static final long serialVersionUID = -4262320156090829309L;
48
49     private static final int MIN_KNOB_SIZE = 40;
50
51     private static final int MINIMUM_VALUE = 0;
52     private static final int MAXIMUM_VALUE = 10000;
53
54     private String uid;
55
56     private CommonCallBack callback;
57
58     private AdjustmentListener adjustmentListener;
59
60     /**
61      * Constructor
62      */
63     public SwingScilabSlider() {
64         super();
65         // needed to have slider working with GLCanvas
66         setOpaque(true);
67         setMinimum(MINIMUM_VALUE);
68         setMaximum(MAXIMUM_VALUE + getVisibleAmount());
69         adjustmentListener = new AdjustmentListener() {
70             public void adjustmentValueChanged(AdjustmentEvent arg0) {
71                 updateModel();
72                 if (callback != null) {
73                     callback.actionPerformed(null);
74                 }
75             }
76         };
77         addAdjustmentListener(adjustmentListener);
78     }
79
80     /**
81      * Draws a swing Scilab Slider
82      * @see org.scilab.modules.gui.UIElement#draw()
83      */
84     public void draw() {
85         this.setVisible(true);
86         this.doLayout();
87     }
88
89     /**
90      * Gets the dimensions (width and height) of a swing Scilab Slider
91      * @return the dimensions of the Slider
92      * @see org.scilab.modules.gui.uielement.UIElement#getDims()
93      */
94     public Size getDims() {
95         return new Size(super.getSize().width, super.getSize().height);
96     }
97
98     /**
99      * Gets the position (X-coordinate and Y-coordinate) of a swing Scilab Slider
100      * @return the position of the Slider
101      * @see org.scilab.modules.gui.uielement.UIElement#getPosition()
102      */
103     public Position getPosition() {
104         return PositionConverter.javaToScilab(getLocation(), getSize(), getParent());
105     }
106
107     /**
108      * Sets the dimensions (width and height) of a swing Scilab Slider
109      * @param newSize the dimensions to set to the Slider
110      * @see org.scilab.modules.gui.uielement.UIElement#setDims(org.scilab.modules.gui.utils.Size)
111      */
112     public void setDims(Size newSize) {
113         super.setSize(newSize.getWidth(), newSize.getHeight());
114         super.doLayout(); // Usefull in case of resize
115     }
116
117     /**
118      * Sets the position (X-coordinate and Y-coordinate) of a swing Scilab Slider
119      * @param newPosition the position to set to the Slider
120      * @see org.scilab.modules.gui.uielement.UIElement#setPosition(org.scilab.modules.gui.utils.Position)
121      */
122     public void setPosition(Position newPosition) {
123         Position javaPosition = PositionConverter.scilabToJava(newPosition, getDims(), getParent());
124         setLocation(javaPosition.getX(), javaPosition.getY());
125     }
126
127     /**
128      * Add a callback to the Slider
129      * @param cb the callback to set.
130      */
131     public void setCallback(CommonCallBack cb) {
132         /* Create a callback */
133         callback = cb;
134     }
135
136     /**
137      * Setter for MenuBar
138      * @param menuBarToAdd the MenuBar associated to the Tab.
139      */
140     public void addMenuBar(MenuBar menuBarToAdd) {
141         /* Unimplemented for CheckBoxes */
142         throw new UnsupportedOperationException();
143     }
144
145     /**
146      * Setter for ToolBar
147      * @param toolBarToAdd the ToolBar associated to the Tab.
148      */
149     public void addToolBar(ToolBar toolBarToAdd) {
150         /* Unimplemented for CheckBoxes */
151         throw new UnsupportedOperationException();
152     }
153
154     /**
155      * Getter for MenuBar
156      * @return MenuBar: the MenuBar associated to the Tab.
157      */
158     public MenuBar getMenuBar() {
159         /* Unimplemented for CheckBoxes */
160         throw new UnsupportedOperationException();
161     }
162
163     /**
164      * Getter for ToolBar
165      * @return ToolBar: the ToolBar associated to the Tab.
166      */
167     public ToolBar getToolBar() {
168         /* Unimplemented for CheckBoxes */
169         throw new UnsupportedOperationException();
170     }
171
172     /**
173      * Get the text of the Slider
174      * @return the text
175      * @see org.scilab.modules.gui.widget.Widget#getText()
176      */
177     public String getText() {
178         return this.getName();
179     }
180
181     /**
182      * Set the text of the Slider
183      * @param text the text to set to the Slider
184      * @see org.scilab.modules.gui.widget.Widget#setText(java.lang.String)
185      */
186     public void setText(String text) {
187         this.setName(text);
188     }
189
190     /**
191      * Set the horizontal alignment for the Slider text
192      * @param alignment the value for the alignment (See ScilabAlignment.java)
193      */
194     public void setHorizontalAlignment(String alignment) {
195         // Nothing to do here
196     }
197
198     /**
199      * Set the vertical alignment for the Slider text
200      * @param alignment the value for the alignment (See ScilabAlignment.java)
201      */
202     public void setVerticalAlignment(String alignment) {
203         // Nothing to do here
204     }
205
206     /**
207      * Set the minimum value of a Slider
208      * @param value the minimum value
209      */
210     public void setMinimumValue(double value) {
211         updateModel(); /* Update the model according to the knob position */
212     }
213
214     /**
215      * Set the maximum value of a Slider
216      * @param value the maximum value
217      */
218     public void setMaximumValue(double value) {
219         updateModel(); /* Update the model according to the knob position */
220     }
221
222     /**
223      * Set the Relief of the Slider
224      * @param reliefType the type of the relief to set (See ScilabRelief.java)
225      */
226     public void setRelief(String reliefType) {
227         setBorder(ScilabRelief.getBorderFromRelief(reliefType));
228     }
229
230     /**
231      * Set the major tick spacing for a Slider
232      * @param space the increment value
233      */
234     public void setMajorTickSpacing(double space) {
235         /* Remove the listener to avoid the callback to be executed */
236         removeAdjustmentListener(adjustmentListener);
237
238         double userMin = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MIN__);
239         double userMax = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__);
240         setBlockIncrement((int) (space * (MAXIMUM_VALUE - MINIMUM_VALUE) / (userMax - userMin)));
241         int oldMax = getMaximum() - getVisibleAmount();
242         setVisibleAmount(Math.max((int) ((MAXIMUM_VALUE - MINIMUM_VALUE) / space), MIN_KNOB_SIZE));
243         setMaximum(oldMax + getVisibleAmount());
244
245         /* Put back the listener */
246         addAdjustmentListener(adjustmentListener);
247     }
248
249     /**
250      * Set the minor tick spacing for a Slider
251      * @param space the increment value
252      */
253     public void setMinorTickSpacing(double space) {
254         /* Remove the listener to avoid the callback to be executed */
255         removeAdjustmentListener(adjustmentListener);
256
257         double userMin = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MIN__);
258         double userMax = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__);
259         setUnitIncrement((int) (space * (MAXIMUM_VALUE - MINIMUM_VALUE) / (userMax - userMin)));
260
261         /* Put back the listener */
262         addAdjustmentListener(adjustmentListener);
263     }
264
265     /**
266      * Set the slider orientation to vertical
267      */
268     public void setVertical() {
269         setOrientation(JScrollBar.VERTICAL);
270     }
271
272     /**
273      * Set the slider orientation to horizontal
274      */
275     public void setHorizontal() {
276         setOrientation(JScrollBar.HORIZONTAL);
277     }
278
279     /**
280      * Destroy the Slider
281      */
282     public void destroy() {
283         ScilabSwingUtilities.removeFromParent(this);
284     }
285
286     /**
287      * Setter for InfoBar
288      * @param infoBarToAdd the InfoBar associated to the Slider.
289      */
290     public void addInfoBar(TextBox infoBarToAdd) {
291         /* Unimplemented for Sliders */
292         throw new UnsupportedOperationException();
293     }
294
295     /**
296      * Getter for InfoBar
297      * @return the InfoBar associated to the Slider.
298      */
299     public TextBox getInfoBar() {
300         /* Unimplemented for Sliders */
301         throw new UnsupportedOperationException();
302     }
303
304     /**
305      * Set the current value of the Slider
306      * @param value the new value
307      */
308     public void setUserValue(double value) {
309         if (!SwingUtilities.isEventDispatchThread()) { /* Avoid double-update when Model is updated from the callback */
310             /* Remove the listener to avoid the callback to be executed */
311             removeAdjustmentListener(adjustmentListener);
312
313             double userMin = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MIN__);
314             double userMax = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__);
315             super.setValue(MINIMUM_VALUE + (int) ((value - userMin) * (MAXIMUM_VALUE - MINIMUM_VALUE) / (userMax - userMin)));
316
317             /* Put back the listener */
318             addAdjustmentListener(adjustmentListener);
319         }
320     }
321
322     /**
323      * Set the UID
324      * @param id the UID
325      */
326     public void setId(String id) {
327         uid = id;
328     }
329
330     /**
331      * Get the UID
332      * @return the UID
333      */
334     public String getId() {
335         return uid;
336     }
337
338     /**
339      * Generic update method
340      * @param property property name
341      * @param value property value
342      */
343     public void update(int property, Object value) {
344         SwingViewWidget.update(this, property, value);
345     }
346
347     /**
348      * Update values in the model when needed
349      */
350     private void updateModel() {
351         Double[] value = new Double[1];
352         double userMin = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MIN__);
353         double userMax = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__);
354         value[0] = userMin + ((getValue() - MINIMUM_VALUE) * (userMax - userMin) / (MAXIMUM_VALUE - MINIMUM_VALUE));
355         GraphicController.getController().setProperty(uid, __GO_UI_VALUE__, value);
356     }
357 }