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