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