* Bug #11657 fixed - Setting the callback_type property of an uicontrol was not
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / SwingViewWidget.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - DIGITEO - Bruno JOFRET
4  * Copyright (C) 2011 - DIGITEO - Vincent COUVERT
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;
15
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACK__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACKTYPE__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CHILDREN__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PARENT__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POSITION__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_STYLE__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TAG__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_USER_DATA__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_BACKGROUNDCOLOR__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ENABLE__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTANGLE__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTNAME__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTSIZE__;
29 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTUNITS__;
30 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTWEIGHT__;
31 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FOREGROUNDCOLOR__;
32 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_HORIZONTALALIGNMENT__;
33 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LISTBOXTOP__;
34 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_MAX__;
35 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_MIN__;
36 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_RELIEF__;
37 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SLIDERSTEP__;
38 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING__;
39 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING_COLNB__;
40 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TOOLTIPSTRING__;
41 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_UNITS__;
42 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE__;
43 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VERTICALALIGNMENT__;
44 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VALID__;
45 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VISIBLE__;
46
47 import java.awt.Color;
48 import java.awt.Font;
49
50 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
51 import org.scilab.modules.graphic_objects.graphicObject.CallBack;
52 import org.scilab.modules.gui.bridge.checkbox.SwingScilabCheckBox;
53 import org.scilab.modules.gui.bridge.listbox.SwingScilabListBox;
54 import org.scilab.modules.gui.bridge.popupmenu.SwingScilabPopupMenu;
55 import org.scilab.modules.gui.bridge.radiobutton.SwingScilabRadioButton;
56 import org.scilab.modules.gui.bridge.slider.SwingScilabSlider;
57 import org.scilab.modules.gui.bridge.uiimage.SwingScilabUiImage;
58 import org.scilab.modules.gui.bridge.uitable.SwingScilabUiTable;
59 import org.scilab.modules.gui.events.callback.CommonCallBack;
60 import org.scilab.modules.gui.utils.Position;
61 import org.scilab.modules.gui.utils.Size;
62 import org.scilab.modules.gui.utils.UnitsConverter;
63 import org.scilab.modules.gui.utils.UnitsConverter.UicontrolUnits;
64 import org.scilab.modules.gui.widget.Widget;
65
66 /**
67  * @author Bruno JOFRET
68  * @author Vincent COUVERT
69  */
70 public final class SwingViewWidget {
71
72     private static final String OBLIQUEFONT = "oblique";
73     private static final String ITALICFONT = "italic";
74     private static final String BOLDFONT = "bold";
75     private static final int COLORS_COEFF = 255;
76     private static final int X_INDEX = 0;
77     private static final int Y_INDEX = 1;
78     private static final int WIDTH_INDEX = 2;
79     private static final int HEIGHT_INDEX = 3;
80
81     /**
82      * Constructor
83      */
84     private SwingViewWidget() {
85         throw new UnsupportedOperationException();
86     }
87
88     /**
89      * Update the component in the view
90      * @param uiControl the component
91      * @param property the property name
92      * @param value the property value
93      */
94     public static void update(Widget uiControl, String property, Object value) {
95         String uid = ((SwingViewObject) uiControl).getId();
96         if (property.equals(__GO_UI_BACKGROUNDCOLOR__)) {
97             Double[] allColors = ((Double[]) value);
98             uiControl.setBackground(new Color((int) (allColors[0] * COLORS_COEFF),
99                                               (int) (allColors[1] * COLORS_COEFF),
100                                               (int) (allColors[2] * COLORS_COEFF)));
101         } else if (property.equals(__GO_CALLBACK__)) {
102             int cbType = (Integer) GraphicController.getController().getProperty(uid, __GO_CALLBACKTYPE__);
103             uiControl.setCallback(CommonCallBack.createCallback((String) value, cbType, uid));
104         } else if (property.equals(__GO_CALLBACKTYPE__)) {
105             String cbString = (String) GraphicController.getController().getProperty(uid, __GO_CALLBACK__);
106             if ((Integer) value == CallBack.UNTYPED) { /* Deactivate callback */
107                 uiControl.setCallback(null);
108             } else {
109                 uiControl.setCallback(CommonCallBack.createCallback(cbString, (Integer) value, uid));
110             }
111         } else if (property.equals(__GO_CHILDREN__)) {
112             /* Nothing to do */
113         } else if (property.equals(__GO_UI_ENABLE__)) {
114             uiControl.setEnabled(((Boolean) value).booleanValue());
115         } else if (property.equals(__GO_UI_FONTANGLE__)) {
116             Font font = uiControl.getFont();
117             if (font != null) {
118                 String angle = (String) value;
119
120                 if (angle.equalsIgnoreCase(ITALICFONT) || angle.equalsIgnoreCase(OBLIQUEFONT)) {
121                     if (font.isBold()) {
122                         font = new Font(font.getName(), Font.ITALIC + Font.BOLD, font.getSize());
123                     } else {
124                         font = new Font(font.getName(), Font.ITALIC, font.getSize());
125                     }
126                 } else {
127                     if (font.isBold()) {
128                         font = new Font(font.getName(), Font.BOLD, font.getSize());
129                     } else {
130                         font = new Font(font.getName(), Font.PLAIN, font.getSize());
131                     }
132                 }
133
134                 uiControl.setFont(font);
135             }
136         } else if (property.equals(__GO_UI_FONTNAME__)) {
137             Font font = uiControl.getFont();
138             if (font != null) {
139                 String name = (String) value;
140
141                 font = new Font(name, font.getStyle(), font.getSize());
142
143                 uiControl.setFont(font);
144             }
145         } else if (property.equals(__GO_UI_FONTSIZE__)) {
146             UicontrolUnits fontUnitsProperty = UnitsConverter.stringToUnitsEnum((String) GraphicController.getController()
147                                                .getProperty(uid, __GO_UI_FONTUNITS__));
148             Double dblFontSize = UnitsConverter.convertToPoint((Double) value, fontUnitsProperty, uiControl, false);
149             Font font = uiControl.getFont();
150             if (font != null) {
151                 int size = dblFontSize.intValue();
152                 font = new Font(font.getName(), font.getStyle(), size);
153                 uiControl.setFont(font);
154             }
155         } else if (property.equals(__GO_UI_FONTUNITS__)) {
156             /* Nothing to do here, this property is used when setting position */
157         } else if (property.equals(__GO_UI_FONTWEIGHT__)) {
158             Font font = uiControl.getFont();
159             if (font != null) {
160                 String weight = (String) value;
161
162                 if (weight.equalsIgnoreCase(BOLDFONT)) {
163                     if (font.isItalic()) {
164                         font = new Font(font.getName(), Font.ITALIC + Font.BOLD, font.getSize());
165                     } else {
166                         font = new Font(font.getName(), Font.BOLD, font.getSize());
167                     }
168                 } else {
169                     if (font.isItalic()) {
170                         font = new Font(font.getName(), Font.ITALIC, font.getSize());
171                     } else {
172                         font = new Font(font.getName(), Font.PLAIN, font.getSize());
173                     }
174                 }
175
176                 uiControl.setFont(font);
177             }
178         } else if (property.equals(__GO_UI_FOREGROUNDCOLOR__)) {
179             Double[] allColors = ((Double[]) value);
180             uiControl.setForeground(new Color((int) (allColors[0] * COLORS_COEFF),
181                                               (int) (allColors[1] * COLORS_COEFF),
182                                               (int) (allColors[2] * COLORS_COEFF)));
183         } else if (property.equals(__GO_UI_HORIZONTALALIGNMENT__)) {
184             uiControl.setHorizontalAlignment((String) value);
185         } else if (property.equals(__GO_UI_LISTBOXTOP__)) {
186             if (uiControl instanceof SwingScilabListBox) {
187                 Integer[] listboxtopValue = ((Integer[]) value);
188                 if (listboxtopValue.length > 0) {
189                     ((SwingScilabListBox) uiControl).setListBoxTop(listboxtopValue[0]);
190                 }
191             }
192         } else if (property.equals(__GO_UI_MAX__)) {
193             double maxValue = ((Double) value);
194             Double[] allValues = (Double[]) GraphicController.getController().getProperty(uid, __GO_UI_VALUE__);
195             if ((allValues == null) || (allValues.length == 0)) {
196                 return;
197             }
198             double uicontrolValue = allValues[0];
199             if (uiControl instanceof SwingScilabSlider) {
200                 // Update the slider properties
201                 double minValue = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MIN__);
202                 ((SwingScilabSlider) uiControl).setMaximumValue(maxValue);
203                 Double[] sliderStep = ((Double[]) GraphicController.getController().getProperty(uid, __GO_UI_SLIDERSTEP__));
204                 double minorSliderStep = sliderStep[0].doubleValue();
205                 double majorSliderStep = sliderStep[1].doubleValue();
206                 if (minValue <= maxValue) {
207                     ((SwingScilabSlider) uiControl).setMinorTickSpacing((int) (minorSliderStep * (maxValue - minValue)));
208                     ((SwingScilabSlider) uiControl).setMajorTickSpacing((int) (majorSliderStep * (maxValue - minValue)));
209                 }
210             } else if (uiControl instanceof SwingScilabListBox) {
211                 // Enable/Disable multiple selection
212                 double minValue = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MIN__);
213                 ((SwingScilabListBox) uiControl).setMultipleSelectionEnabled(maxValue - minValue > 1);
214             } else if (uiControl instanceof SwingScilabCheckBox) {
215                 // Check/Uncheck the CheckBox
216                 ((SwingScilabCheckBox) uiControl).setChecked(maxValue == uicontrolValue);
217             } else if (uiControl instanceof SwingScilabRadioButton) {
218                 // Check/Uncheck the RadioButton
219                 ((SwingScilabRadioButton) uiControl).setChecked(maxValue == uicontrolValue);
220             }
221         } else if (property.equals(__GO_UI_MIN__)) {
222             double minValue = ((Double) value);
223             if (uiControl instanceof SwingScilabSlider) {
224                 // Update the slider properties
225                 double maxValue = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__);
226                 ((SwingScilabSlider) uiControl).setMinimumValue(minValue);
227                 Double[] sliderStep = ((Double[]) GraphicController.getController().getProperty(uid, __GO_UI_SLIDERSTEP__));
228                 double minorSliderStep = sliderStep[0].doubleValue();
229                 double majorSliderStep = sliderStep[1].doubleValue();
230                 if (minValue <= maxValue) {
231                     ((SwingScilabSlider) uiControl).setMinorTickSpacing((int) (minorSliderStep * (maxValue - minValue)));
232                     ((SwingScilabSlider) uiControl).setMajorTickSpacing((int) (majorSliderStep * (maxValue - minValue)));
233                 }
234             } else if (uiControl instanceof SwingScilabListBox) {
235                 // Enable/Disable multiple selection
236                 double maxValue = (Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__);
237                 ((SwingScilabListBox) uiControl).setMultipleSelectionEnabled(maxValue - minValue > 1);
238             }
239         } else if (property.equals(__GO_POSITION__)) {
240             /* Convert value according to units */
241             UicontrolUnits unitsProperty = UnitsConverter.stringToUnitsEnum((String) GraphicController
242                                            .getController().getProperty(uid, __GO_UI_UNITS__));
243             Double[] dblValues = UnitsConverter.convertPositionToPixels((Double[]) value, unitsProperty, uiControl);
244             /* Set dimensions before position because position is adjusted according to size */
245             uiControl.setDims(new Size(dblValues[WIDTH_INDEX].intValue(), dblValues[HEIGHT_INDEX].intValue()));
246             uiControl.setPosition(new Position(dblValues[X_INDEX].intValue(), dblValues[Y_INDEX].intValue()));
247             /* Manage sliders orientation */
248             if (uiControl instanceof SwingScilabSlider) {
249                 if (dblValues[WIDTH_INDEX].intValue() > dblValues[HEIGHT_INDEX].intValue()) {
250                     ((SwingScilabSlider) uiControl).setHorizontal();
251                 } else {
252                     ((SwingScilabSlider) uiControl).setVertical();
253                 }
254             }
255         } else if (property.equals(__GO_UI_RELIEF__)) {
256             uiControl.setRelief((String) value);
257         } else if (property.equals(__GO_UI_SLIDERSTEP__)) {
258             Double[] sliderStep = ((Double[]) value);
259             if (uiControl instanceof SwingScilabSlider) {
260                 // Update the slider properties
261                 double minorSliderStep = sliderStep[0].doubleValue();
262                 double majorSliderStep = sliderStep[1].doubleValue();
263                 ((SwingScilabSlider) uiControl).setMinorTickSpacing(minorSliderStep);
264                 ((SwingScilabSlider) uiControl).setMajorTickSpacing(majorSliderStep);
265             }
266         } else if (property.equals(__GO_STYLE__)) {
267             /* Nothing to do unless we want to change style interactively */
268         } else if (property.equals(__GO_UI_STRING__)) {
269             if (uiControl instanceof SwingScilabUiTable) {
270                 // Update column names
271                 String[] stringValue = (String[]) value;
272                 int colNb = ((Integer) GraphicController.getController().getProperty(uid, __GO_UI_STRING_COLNB__));
273                 String[] colNames = new String[colNb - 1];
274                 for (int k = 1; k < colNb; k++) {
275                     colNames[k - 1] = stringValue[k * (stringValue.length / colNb)];
276                 }
277                 ((SwingScilabUiTable) uiControl).setColumnNames(colNames);
278                 // Update row names
279                 String[] rowNames = new String[stringValue.length / colNb - 1];
280                 for (int k = 1; k < stringValue.length / colNb; k++) {
281                     rowNames[k - 1] = stringValue[k];
282                 }
283                 ((SwingScilabUiTable) uiControl).setRowNames(rowNames);
284                 // Update data
285                 String[] tableData = new String[rowNames.length * colNames.length];
286                 int kData = 0;
287                 for (int kCol = 1; kCol <= colNames.length; kCol++) {
288                     for (int kRow = 1; kRow <= rowNames.length; kRow++) {
289                         tableData[kData++] = stringValue[kCol * (stringValue.length / colNb) + kRow];
290                     }
291                 }
292                 if (tableData.length != 0) {
293                     ((SwingScilabUiTable) uiControl).setData(tableData);
294                 }
295             } else if (uiControl instanceof SwingScilabListBox) {
296                 // Listboxes manage string vectors
297                 ((SwingScilabListBox) uiControl).setText((String[]) value);
298             } else if (uiControl instanceof SwingScilabPopupMenu) {
299                 // Popupmenus manage string vectors
300                 ((SwingScilabPopupMenu) uiControl).setText((String[]) value);
301             } else {
302                 uiControl.setText(((String[]) value)[0]);
303             }
304         } else if (property.equals(__GO_UI_TOOLTIPSTRING__)) {
305             String[] tooltipString = ((String[]) value);
306             String tooltipText = tooltipString[0];
307             if (tooltipString.length > 1) {
308                 tooltipText = "<html>" + tooltipText;
309                 for (int kString = 1; kString < tooltipString.length; kString++) {
310                     tooltipText = tooltipText + "<br>" + tooltipString[kString];
311                 }
312                 tooltipText = tooltipText + "</html>";
313             }
314             if (tooltipText.equals("")) {
315                 uiControl.setToolTipText(null);
316             } else {
317                 uiControl.setToolTipText(tooltipText);
318             }
319         } else if (property.equals(__GO_UI_STRING_COLNB__)) {
320             /* Nothing to do */
321         } else if (property.equals(__GO_TAG__)) {
322             /* Nothing to do */
323         } else if (property.equals(__GO_USER_DATA__)) {
324             /* Nothing to do here */
325         } else if (property.equals(__GO_UI_UNITS__)) {
326             /* Nothing to do here, this property is used when setting position */
327         } else if (property.equals(__GO_VALID__)) {
328             /* Nothing to do */
329         } else if (property.equals(__GO_UI_VALUE__)) {
330
331             Double[] doubleValue = ((Double[]) value);
332             if (doubleValue.length == 0) {
333                 return;
334             }
335             int[] intValue = new int[doubleValue.length];
336             for (int k = 0; k < doubleValue.length; k++) {
337                 intValue[k] = doubleValue[k].intValue();
338             }
339
340             if (uiControl instanceof SwingScilabListBox) {
341                 // Update selected items in the listbox
342                 ((SwingScilabListBox) uiControl).setSelectedIndices(intValue);
343             } else if (uiControl instanceof SwingScilabPopupMenu) {
344                 // Update selected items in the popupmenu
345                 ((SwingScilabPopupMenu) uiControl).setUserSelectedIndex(intValue[0]);
346             } else if (uiControl instanceof SwingScilabCheckBox) {
347                 // Check the checkbox if the value is equal to MAX property
348                 double maxValue = ((Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__)).intValue();
349                 ((SwingScilabCheckBox) uiControl).setChecked(maxValue == intValue[0]);
350             } else if (uiControl instanceof SwingScilabRadioButton) {
351                 // Check the radiobutton if the value is equal to MAX property
352                 double maxValue = ((Double) GraphicController.getController().getProperty(uid, __GO_UI_MAX__)).intValue();
353                 ((SwingScilabRadioButton) uiControl).setChecked(maxValue == intValue[0]);
354             } else if (uiControl instanceof SwingScilabSlider) {
355                 // Update the slider value
356                 ((SwingScilabSlider) uiControl).setUserValue(doubleValue[0]);
357             } else if (uiControl instanceof SwingScilabUiImage) {
358                 // Update the image parameters
359                 double[] imageParams = new double[5];
360                 if (doubleValue.length < 1) {
361                     imageParams[0] = 1.0;
362                 } else {
363                     imageParams[0] = doubleValue[0];
364                 }
365                 if (doubleValue.length < 2) {
366                     imageParams[1] = 1.0;
367                 } else {
368                     imageParams[1] = doubleValue[1];
369                 }
370                 if (doubleValue.length < 3) {
371                     imageParams[2] = 0.0;
372                 } else {
373                     imageParams[2] = doubleValue[2];
374                 }
375                 if (doubleValue.length < 4) {
376                     imageParams[3] = 0.0;
377                 } else {
378                     imageParams[3] = doubleValue[3];
379                 }
380                 if (doubleValue.length < 5) {
381                     imageParams[4] = 0.0;
382                 } else {
383                     imageParams[4] = doubleValue[4];
384                 }
385                 double[] scale = new double[2];
386                 scale[0] = imageParams[0];
387                 scale[1] = imageParams[1];
388                 ((SwingScilabUiImage) uiControl).setScale(scale);
389                 double[] shear = new double[2];
390                 shear[0] = imageParams[2];
391                 shear[1] = imageParams[3];
392                 ((SwingScilabUiImage) uiControl).setShear(shear);
393                 ((SwingScilabUiImage) uiControl).setRotate(imageParams[4]);
394             }
395         } else if (property.equals(__GO_UI_VERTICALALIGNMENT__)) {
396             uiControl.setVerticalAlignment((String) value);
397         } else if (property.equals(__GO_VISIBLE__)) {
398             uiControl.setVisible(((Boolean) value).booleanValue());
399         } else if (property.equals(__GO_PARENT__)) {
400             /* Update position */
401             SwingViewWidget.update(uiControl, __GO_POSITION__,
402                                    (Double[]) GraphicController.getController()
403                                    .getProperty(uid, __GO_POSITION__));
404         } else {
405             System.err.println("[SwingScilabWidget.update] Property not mapped: " + property);
406         }
407     }
408 }
409