add property layout_options in figure and uicontrol handles
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / uicontrol / Uicontrol.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.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.graphic_objects.uicontrol;
15
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LAYOUT_SET__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LAYOUT__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_MARGINS__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POSITION__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_STYLE__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UICONTROL__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_BACKGROUNDCOLOR__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_BORDER_POSITION__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_CHECKBOX__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_EDIT__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ENABLE__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTANGLE__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTNAME__;
29 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTSIZE__;
30 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTUNITS__;
31 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTWEIGHT__;
32 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FOREGROUNDCOLOR__;
33 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FRAME__;
34 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_GRIDBAG_ANCHOR__;
35 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_GRIDBAG_FILL__;
36 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_GRIDBAG_GRID__;
37 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_GRIDBAG_PADDING__;
38 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_GRIDBAG_WEIGHT__;
39 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_HORIZONTALALIGNMENT__;
40 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_IMAGE__;
41 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LISTBOXTOP_SIZE__;
42 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LISTBOXTOP__;
43 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LISTBOX__;
44 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_MAX__;
45 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_MIN__;
46 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_POPUPMENU__;
47 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_PUSHBUTTON__;
48 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_RADIOBUTTON__;
49 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_RELIEF__;
50 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SLIDERSTEP__;
51 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SLIDER__;
52 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING_COLNB__;
53 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING_SIZE__;
54 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING__;
55 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TABGROUP__;
56 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TABLE__;
57 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TAB__;
58 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TEXT__;
59 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TOOLTIPSTRING_SIZE__;
60 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TOOLTIPSTRING__;
61 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_UNITS__;
62 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE_SIZE__;
63 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE__;
64 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VERTICALALIGNMENT__;
65 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_BORDER_OPT_PADDING__;
66 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_GRID_OPT_GRID__;
67 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_GRID_OPT_PADDING__;
68
69 import java.util.Arrays;
70 import java.util.StringTokenizer;
71
72 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
73 import org.scilab.modules.graphic_objects.graphicObject.Visitor;
74 import org.scilab.modules.graphic_objects.utils.LayoutType;
75
76 import sun.font.EAttribute;
77
78 /**
79  * @author Bruno JOFRET
80  * @author Vincent COUVERT
81  */
82 public class Uicontrol extends GraphicObject {
83
84     public enum BorderLayoutType {
85         SOUTH, NORTH, CENTER, WEST, EAST;
86         public static BorderLayoutType intToEnum(Integer value) {
87             switch (value) {
88                 case 0:
89                     return BorderLayoutType.SOUTH;
90                 case 1:
91                     return BorderLayoutType.NORTH;
92                 default:
93                 case 2:
94                     return BorderLayoutType.CENTER;
95                 case 3:
96                     return BorderLayoutType.WEST;
97                 case 4:
98                     return BorderLayoutType.EAST;
99             }
100         }
101
102         public static BorderLayoutType stringToEnum(String value) {
103             if (value == null || value.equals("")) {
104                 return CENTER;
105             }
106
107             char[] chars = value.toCharArray();
108             if (chars[0] == 'n' || chars[0] == 'N') {
109                 return NORTH;
110             }
111
112             if (chars[0] == 's' || chars[0] == 'S') {
113                 return SOUTH;
114             }
115
116             if (chars[0] == 'e' || chars[0] == 'E') {
117                 return EAST;
118             }
119
120             if (chars[0] == 'w' || chars[0] == 'W') {
121                 return WEST;
122             }
123
124             return CENTER;
125         }
126     }
127
128     public enum FillType {
129         NONE, VERTICAL, HORIZONTAL, BOTH;
130         public static FillType intToEnum(Integer value) {
131             switch (value) {
132                 default:
133                 case 0:
134                     return FillType.NONE;
135                 case 1:
136                     return FillType.VERTICAL;
137                 case 2:
138                     return FillType.HORIZONTAL;
139                 case 3:
140                     return FillType.BOTH;
141             }
142         }
143
144         public static FillType stringToEnum(String value) {
145             if (value == null || value.equals("")) {
146                 return NONE;
147             }
148
149             char[] chars = value.toCharArray();
150             if (chars[0] == 'v' || chars[0] == 'V') {
151                 return VERTICAL;
152             }
153
154             if (chars[0] == 'h' || chars[0] == 'H') {
155                 return HORIZONTAL;
156             }
157
158             if (chars[0] == 'b' || chars[0] == 'B') {
159                 return BOTH;
160             }
161
162             return NONE;
163         }
164     }
165
166     public enum AnchorType {
167         CENTER, UPPER, LOWER, RIGHT, LEFT, UPPER_RIGHT, UPPER_LEFT, LOWER_RIGHT, LOWER_LEFT;
168         //c,e,w,n,s,ne,nw,se,sw
169         public static AnchorType intToEnum(Integer value) {
170             switch (value) {
171                 default:
172                 case 0:
173                     return CENTER;
174                 case 1:
175                     return UPPER;
176                 case 2:
177                     return LOWER;
178                 case 3:
179                     return RIGHT;
180                 case 4:
181                     return LEFT;
182                 case 5:
183                     return UPPER_RIGHT;
184                 case 6:
185                     return UPPER_LEFT;
186                 case 7:
187                     return LOWER_RIGHT;
188                 case 8:
189                     return LOWER_LEFT;
190             }
191         }
192
193         public static AnchorType stringToEnum(String value) {
194             if (value == null || value.equals("")) {
195                 return CENTER;
196             }
197
198             char[] chars = value.toCharArray();
199             if (chars[0] == 'e' || chars[0] == 'E') {
200                 return RIGHT;
201             }
202
203             if (chars[0] == 'w' || chars[0] == 'W') {
204                 return LEFT;
205             }
206
207             if (chars[0] == 'n' || chars[0] == 'N') {
208                 if (chars.length == 1) {
209                     return UPPER;
210                 }
211
212                 if (chars[1] == 'e' || chars[1] == 'E') {
213                     return UPPER_RIGHT;
214                 }
215
216                 if (chars[1] == 'w' || chars[1] == 'W') {
217                     return UPPER_LEFT;
218                 }
219             }
220
221             if (chars[0] == 's' || chars[0] == 'S') {
222                 if (chars.length == 1) {
223                     return LOWER;
224                 }
225
226                 if (chars[1] == 'e' || chars[1] == 'E') {
227                     return LOWER_RIGHT;
228                 }
229
230                 if (chars[1] == 'w' || chars[1] == 'W') {
231                     return LOWER_LEFT;
232                 }
233             }
234
235             return CENTER;
236         }
237     }
238
239     protected static final String FLAT_RELIEF   = "flat";
240     protected static final String RAISED_RELIEF = "raised";
241     protected static final String SUNKEN_RELIEF = "sunken";
242     protected static final String GROOVE_RELIEF = "groove";
243     protected static final String RIDGE_RELIEF  = "ridge";
244     protected static final String SOLID_RELIEF  = "solid";
245
246     private static final double DEFAULT_RED_BACKGROUND = 0.8;
247     private static final double DEFAULT_GREEN_BACKGROUND = 0.8;
248     private static final double DEFAULT_BLUE_BACKGROUND = 0.8;
249
250     private static final double DEFAULT_X = 20.0;
251     private static final double DEFAULT_Y = 40.0;
252     private static final double DEFAULT_WIDTH = 40.0;
253     private static final double DEFAULT_HEIGHT = 20.0;
254
255     private static final double DEFAULTFONTSIZE = 10;
256     private static final String DEFAULTFONTNAME = "helvetica";
257     private static final String DEFAULTFONTWEIGHT = "normal";
258     private static final String DEFAULTFONTANGLE = DEFAULTFONTWEIGHT;
259     private static final String STRING_SEPARATOR = "|";
260
261     private UicontrolStyle style;
262     private Double[] backgroundColor = {DEFAULT_RED_BACKGROUND, DEFAULT_GREEN_BACKGROUND, DEFAULT_BLUE_BACKGROUND};
263     private boolean enable = true;
264     private String fontAngle = DEFAULTFONTANGLE;
265     private String fontName = DEFAULTFONTNAME;
266     private double fontSize = DEFAULTFONTSIZE;
267     private String fontUnits = "points";
268     private String fontWeight = DEFAULTFONTWEIGHT;
269     private Double[] foregroundColor = {0.0, 0.0, 0.0};
270     private String horizontalAlignment = "center";
271     private Integer[] listboxTop;
272     private double max = 1.0;
273     private double min;
274     private Double[] position = {DEFAULT_X, DEFAULT_Y, DEFAULT_WIDTH, DEFAULT_HEIGHT};
275     private String relief = RAISED_RELIEF;
276     private Double[] sliderStep = {0.01, 0.1};
277     private String[] string = {""};
278     private int stringColNb = 1; // Used for tables
279     private String[] tooltipString = {""};
280     private String units = "pixels";
281     private Double[] value;
282     private String verticalAlignment = "middle";
283     private LayoutType layout = LayoutType.NONE;
284     private Double[] margins = new Double[] {0.0, 0.0, 0.0, 0.0};
285     private Integer[] gridbagGrid = new Integer[] {0, 0, 0, 0};
286     private Double[] gridbagWeight = new Double[] {0.0, 0.0};
287     private FillType gridbagFill = FillType.NONE;
288     private AnchorType gridbagAnchor = AnchorType.CENTER;
289     private Integer[] gridbagPadding = new Integer[] {0, 0};
290     private Integer[] gridGrid = new Integer[] {0, 0};
291     private Integer[] gridPadding = new Integer[] {0, 0};
292     private BorderLayoutType borderPosition = BorderLayoutType.CENTER;
293
294     /** layout options */
295     private Integer[] gridOptGrid = new Integer[2];
296     private Integer[] gridOptPadding = new Integer[2];
297     private Integer[] borderOptPadding = new Integer[2];
298
299     /**
300      * All uicontrol properties
301      */
302     private enum UicontrolProperty {
303         STYLE,
304         BACKGROUNDCOLOR,
305         ENABLE,
306         FONTANGLE,
307         FONTNAME,
308         FONTSIZE,
309         FONTUNITS,
310         FONTWEIGHT,
311         FOREGROUNDCOLOR,
312         HORIZONTALALIGNMENT,
313         LISTBOXTOP,
314         LISTBOXTOP_SIZE,
315         MAX,
316         MIN,
317         POSITION,
318         SCALE,
319         SHEAR,
320         SLIDERSTEP,
321         STRING,
322         STRING_SIZE,
323         STRING_COLNB,
324         RELIEF,
325         TOOLTIPSTRING,
326         TOOLTIPSTRING_SIZE,
327         UNITS,
328         VALUE,
329         VALUE_SIZE,
330         VERTICALALIGNMENT,
331         LAYOUT,
332         LAYOUT_SET,
333         MARGINS,
334         GRIDBAG_GRID,
335         GRIDBAG_WEIGHT,
336         GRIDBAG_FILL,
337         GRIDBAG_ANCHOR,
338         GRIDBAG_PADDING,
339         BORDER_POSITION,
340         GRIDOPT_GRID,
341         GRIDOPT_PADDING,
342         BORDEROPT_PADDING
343     };
344
345     /**
346      * All uicontrol styles
347      */
348     private enum UicontrolStyle {
349         CHECKBOX,
350         EDIT,
351         FRAME,
352         IMAGE,
353         LISTBOX,
354         POPUPMENU,
355         PUSHBUTTON,
356         RADIOBUTTON,
357         SLIDER,
358         TABLE,
359         TEXT,
360         TABGROUP,
361         TAB
362     };
363
364     /**
365      * Constructor
366      */
367     public Uicontrol() {
368         super();
369         setVisible(false); /* To avoid to see the object rendered before all its properties to be set (See bug #10346) */
370     }
371
372     /**
373      * Get style as a string
374      * @param style the uicontrol style
375      * @return the uicontrol style as a string
376      */
377     private int styleEnumToInt(UicontrolStyle style) {
378         switch (style) {
379             case CHECKBOX:
380                 return __GO_UI_CHECKBOX__;
381             case EDIT:
382                 return __GO_UI_EDIT__;
383             case FRAME:
384                 return __GO_UI_FRAME__;
385             case IMAGE:
386                 return __GO_UI_IMAGE__;
387             case LISTBOX:
388                 return __GO_UI_LISTBOX__;
389             case POPUPMENU:
390                 return __GO_UI_POPUPMENU__;
391             case PUSHBUTTON:
392                 return __GO_UI_PUSHBUTTON__;
393             case RADIOBUTTON:
394                 return __GO_UI_RADIOBUTTON__;
395             case SLIDER:
396                 return __GO_UI_SLIDER__;
397             case TABLE:
398                 return __GO_UI_TABLE__;
399             case TEXT:
400                 return __GO_UI_TEXT__;
401             case TABGROUP:
402                 return __GO_UI_TABGROUP__;
403             case TAB:
404                 return __GO_UI_TAB__;
405             default :
406                 return -1;
407         }
408     }
409
410     /**
411      * Get style as an enum element
412      * @param style the uicontrol style
413      * @return the uicontrol style as an enum element
414      */
415     private UicontrolStyle intToStyleEnum(int style) {
416         switch (style) {
417             case __GO_UI_CHECKBOX__ :
418                 return UicontrolStyle.CHECKBOX;
419             case __GO_UI_EDIT__ :
420                 return UicontrolStyle.EDIT;
421             case __GO_UI_FRAME__ :
422                 return UicontrolStyle.FRAME;
423             case __GO_UI_IMAGE__ :
424                 return  UicontrolStyle.IMAGE;
425             case __GO_UI_LISTBOX__ :
426                 return UicontrolStyle.LISTBOX;
427             case __GO_UI_POPUPMENU__ :
428                 return UicontrolStyle.POPUPMENU;
429             case __GO_UI_PUSHBUTTON__ :
430                 return UicontrolStyle.PUSHBUTTON;
431             case __GO_UI_RADIOBUTTON__ :
432                 return UicontrolStyle.RADIOBUTTON;
433             case __GO_UI_SLIDER__ :
434                 return UicontrolStyle.SLIDER;
435             case __GO_UI_TABLE__ :
436                 return UicontrolStyle.TABLE;
437             case __GO_UI_TEXT__ :
438                 return UicontrolStyle.TEXT;
439             case __GO_UI_TABGROUP__:
440                 return UicontrolStyle.TABGROUP;
441             case __GO_UI_TAB__:
442                 return UicontrolStyle.TAB;
443             default :
444                 return null;
445         }
446     }
447
448     /**
449      * Get this object type
450      * @return uicontrol
451      * @see org.scilab.modules.graphic_objects.graphicObject.GraphicObject#getType()
452      */
453     public Integer getType() {
454         return __GO_UICONTROL__;
455     }
456
457     /**
458      * Returns the enum associated to a property name
459      * @param propertyName the property name
460      * @return the property enum
461      */
462     public Object getPropertyFromName(int propertyName) {
463         switch (propertyName) {
464             case __GO_STYLE__ :
465                 return UicontrolProperty.STYLE;
466             case __GO_UI_BACKGROUNDCOLOR__ :
467                 return UicontrolProperty.BACKGROUNDCOLOR;
468             case __GO_UI_ENABLE__ :
469                 return UicontrolProperty.ENABLE;
470             case __GO_UI_FONTANGLE__ :
471                 return UicontrolProperty.FONTANGLE;
472             case __GO_UI_FONTNAME__ :
473                 return UicontrolProperty.FONTNAME;
474             case __GO_UI_FONTSIZE__ :
475                 return UicontrolProperty.FONTSIZE;
476             case __GO_UI_FONTUNITS__ :
477                 return UicontrolProperty.FONTUNITS;
478             case __GO_UI_FONTWEIGHT__ :
479                 return UicontrolProperty.FONTWEIGHT;
480             case __GO_UI_FOREGROUNDCOLOR__ :
481                 return UicontrolProperty.FOREGROUNDCOLOR;
482             case __GO_UI_HORIZONTALALIGNMENT__ :
483                 return UicontrolProperty.HORIZONTALALIGNMENT;
484             case __GO_UI_LISTBOXTOP__ :
485                 return UicontrolProperty.LISTBOXTOP;
486             case __GO_UI_LISTBOXTOP_SIZE__ :
487                 return UicontrolProperty.LISTBOXTOP_SIZE;
488             case __GO_UI_MAX__ :
489                 return UicontrolProperty.MAX;
490             case __GO_UI_MIN__ :
491                 return UicontrolProperty.MIN;
492             case __GO_POSITION__ :
493                 return UicontrolProperty.POSITION;
494             case __GO_UI_RELIEF__ :
495                 return UicontrolProperty.RELIEF;
496             case __GO_UI_SLIDERSTEP__ :
497                 return UicontrolProperty.SLIDERSTEP;
498             case __GO_UI_STRING__ :
499                 return UicontrolProperty.STRING;
500             case __GO_UI_STRING_SIZE__ :
501                 return UicontrolProperty.STRING_SIZE;
502             case __GO_UI_STRING_COLNB__ :
503                 return UicontrolProperty.STRING_COLNB;
504             case __GO_UI_TOOLTIPSTRING__ :
505                 return UicontrolProperty.TOOLTIPSTRING;
506             case __GO_UI_TOOLTIPSTRING_SIZE__ :
507                 return UicontrolProperty.TOOLTIPSTRING_SIZE;
508             case __GO_UI_UNITS__ :
509                 return UicontrolProperty.UNITS;
510             case __GO_UI_VALUE__ :
511                 return UicontrolProperty.VALUE;
512             case __GO_UI_VALUE_SIZE__ :
513                 return UicontrolProperty.VALUE_SIZE;
514             case __GO_UI_VERTICALALIGNMENT__ :
515                 return UicontrolProperty.VERTICALALIGNMENT;
516             case __GO_LAYOUT__ :
517                 return UicontrolProperty.LAYOUT;
518             case __GO_LAYOUT_SET__ :
519                 return UicontrolProperty.LAYOUT_SET;
520             case __GO_MARGINS__:
521                 return UicontrolProperty.MARGINS;
522             case __GO_UI_GRIDBAG_GRID__:
523                 return UicontrolProperty.GRIDBAG_GRID;
524             case __GO_UI_GRIDBAG_WEIGHT__:
525                 return UicontrolProperty.GRIDBAG_WEIGHT;
526             case __GO_UI_GRIDBAG_FILL__:
527                 return UicontrolProperty.GRIDBAG_FILL;
528             case __GO_UI_GRIDBAG_ANCHOR__:
529                 return UicontrolProperty.GRIDBAG_ANCHOR;
530             case __GO_UI_GRIDBAG_PADDING__:
531                 return UicontrolProperty.GRIDBAG_PADDING;
532             case __GO_UI_BORDER_POSITION__:
533                 return UicontrolProperty.BORDER_POSITION;
534             case __GO_GRID_OPT_GRID__:
535                 return UicontrolProperty.GRIDOPT_GRID;
536             case __GO_GRID_OPT_PADDING__:
537                 return UicontrolProperty.GRIDOPT_PADDING;
538             case __GO_BORDER_OPT_PADDING__:
539                 return UicontrolProperty.BORDEROPT_PADDING;
540             default :
541                 return super.getPropertyFromName(propertyName);
542         }
543     }
544
545     /**
546      * Fast property get method
547      * @param property the property to get
548      * @return the property value
549      */
550     public Object getProperty(Object property) {
551         if (property == UicontrolProperty.STYLE) {
552             return getStyle();
553         } else if (property == UicontrolProperty.BACKGROUNDCOLOR) {
554             return getBackgroundColor();
555         } else if (property == UicontrolProperty.ENABLE) {
556             return getEnable();
557         } else if (property == UicontrolProperty.FONTANGLE) {
558             return getFontAngle();
559         } else if (property == UicontrolProperty.FONTNAME) {
560             return getFontName();
561         } else if (property == UicontrolProperty.FONTSIZE) {
562             return getFontSize();
563         } else if (property == UicontrolProperty.FONTUNITS) {
564             return getFontUnits();
565         } else if (property == UicontrolProperty.FONTWEIGHT) {
566             return getFontWeight();
567         } else if (property == UicontrolProperty.FOREGROUNDCOLOR) {
568             return getForegroundColor();
569         } else if (property == UicontrolProperty.HORIZONTALALIGNMENT) {
570             return getHorizontalAlignment();
571         } else if (property == UicontrolProperty.LISTBOXTOP) {
572             return getListboxTop();
573         } else if (property == UicontrolProperty.LISTBOXTOP_SIZE) {
574             return getListboxTopSize();
575         } else if (property == UicontrolProperty.MAX) {
576             return getMax();
577         } else if (property == UicontrolProperty.MIN) {
578             return getMin();
579         } else if (property == UicontrolProperty.POSITION) {
580             return getUiPosition();
581         } else if (property == UicontrolProperty.RELIEF) {
582             return getRelief();
583         } else if (property == UicontrolProperty.SLIDERSTEP) {
584             return getSliderStep();
585         } else if (property == UicontrolProperty.STRING) {
586             return getString();
587         } else if (property == UicontrolProperty.STRING_SIZE) {
588             return getString().length;
589         } else if (property == UicontrolProperty.STRING_COLNB) {
590             return getStringColNb();
591         } else if (property == UicontrolProperty.TOOLTIPSTRING) {
592             return getTooltipString();
593         } else if (property == UicontrolProperty.TOOLTIPSTRING_SIZE) {
594             return getTooltipString().length;
595         } else if (property == UicontrolProperty.UNITS) {
596             return getUnits();
597         } else if (property == UicontrolProperty.VALUE) {
598             return getUiValue();
599         } else if (property == UicontrolProperty.VALUE_SIZE) {
600             return getUiValueSize();
601         } else if (property == UicontrolProperty.VERTICALALIGNMENT) {
602             return getVerticalAlignment();
603         } else if (property == UicontrolProperty.LAYOUT) {
604             return getLayout();
605         } else if (property == UicontrolProperty.LAYOUT_SET) {
606             return isLayoutSettable();
607         } else if (property == UicontrolProperty.MARGINS) {
608             return getMargins();
609         } else if (property == UicontrolProperty.GRIDBAG_GRID) {
610             return getGridBagGrid();
611         } else if (property == UicontrolProperty.GRIDBAG_WEIGHT) {
612             return getGridBagWeight();
613         } else if (property == UicontrolProperty.GRIDBAG_FILL) {
614             return getGridBagFill();
615         } else if (property == UicontrolProperty.GRIDBAG_ANCHOR) {
616             return getGridBagAnchor();
617         } else if (property == UicontrolProperty.GRIDBAG_PADDING) {
618             return getGridBagPadding();
619         } else if (property == UicontrolProperty.BORDER_POSITION) {
620             return getBorderPosition();
621         } else if (property == UicontrolProperty.GRIDOPT_GRID) {
622             return getGridOptGrid();
623         } else if (property == UicontrolProperty.GRIDOPT_PADDING) {
624             return getGridOptPadding();
625         } else if (property == UicontrolProperty.BORDEROPT_PADDING) {
626             return getBorderOptPadding();
627         } else {
628             return super.getProperty(property);
629         }
630     }
631
632     /**
633      * Fast property set method
634      * @param property the property to set
635      * @param value the property value
636      * @return true if the property has been set, false otherwise
637      */
638     public UpdateStatus setProperty(Object property, Object value) {
639         if (!(property instanceof UicontrolProperty)) {
640             return super.setProperty(property, value);
641         }
642
643         UicontrolProperty p = (UicontrolProperty) property;
644         switch (p) {
645             case STYLE:
646                 return setStyle((Integer) value);
647             case BACKGROUNDCOLOR:
648                 return setBackgroundColor((Double[]) value);
649             case ENABLE:
650                 return setEnable((Boolean) value);
651             case FONTANGLE:
652                 return setFontAngle((String) value);
653             case FONTNAME:
654                 return setFontName((String) value);
655             case FONTSIZE:
656                 return setFontSize((Double) value);
657             case FONTUNITS:
658                 return setFontUnits((String) value);
659             case FONTWEIGHT:
660                 return setFontWeight((String) value);
661             case FOREGROUNDCOLOR:
662                 return setForegroundColor((Double[]) value);
663             case HORIZONTALALIGNMENT:
664                 return setHorizontalAlignment((String) value);
665             case LISTBOXTOP:
666                 return setListboxTop((Integer[]) value);
667             case MAX:
668                 return setMax((Double) value);
669             case MIN:
670                 return setMin((Double) value);
671             case POSITION:
672                 return setUiPosition((Double[]) value);
673             case RELIEF:
674                 return setRelief((String) value);
675             case SLIDERSTEP:
676                 return setSliderStep((Double[]) value);
677             case STRING:
678                 return setString((String[]) value);
679             case STRING_COLNB:
680                 return setStringColNb((Integer) value);
681             case TOOLTIPSTRING:
682                 return setTooltipString((String[]) value);
683             case UNITS:
684                 return setUnits((String) value);
685             case VALUE:
686                 return setUiValue((Double[]) value);
687             case VERTICALALIGNMENT:
688                 return setVerticalAlignment((String) value);
689             case LAYOUT:
690                 return setLayout((Integer) value);
691             case MARGINS:
692                 return setMargins((Double[]) value);
693             case GRIDBAG_GRID:
694                 return setGridBagGrid((Integer[]) value);
695             case GRIDBAG_WEIGHT:
696                 return setGridBagWeight((Double[]) value);
697             case GRIDBAG_FILL:
698                 return setGridBagFill((Integer) value);
699             case GRIDBAG_ANCHOR:
700                 return setGridBagAnchor((Integer) value);
701             case GRIDBAG_PADDING:
702                 return setGridBagPadding((Integer[]) value);
703             case BORDER_POSITION:
704                 return setBorderPosition((Integer) value);
705             case GRIDOPT_GRID:
706                 return setGridOptGrid((Integer[]) value);
707             case GRIDOPT_PADDING:
708                 return setGridOptPadding((Integer[]) value);
709             case BORDEROPT_PADDING:
710                 return setBorderOptPadding((Integer[]) value);
711             default:
712                 return super.setProperty(property, value);
713         }
714     }
715
716     /**
717      * Get the style
718      * @return the style
719      */
720     public Integer getStyle() {
721         return styleEnumToInt(this.style);
722     }
723
724     /**
725      * Set the style
726      * @param style the style
727      * @return TODO
728      */
729     public UpdateStatus setStyle(int style) {
730         UicontrolStyle val =  intToStyleEnum(style);
731         if (val == this.style) {
732             return UpdateStatus.NoChange;
733         }
734
735         this.style = val;
736         return UpdateStatus.Success;
737     }
738
739     /* Background Color */
740     public Double[] getBackgroundColor() {
741         return this.backgroundColor;
742     }
743
744     public UpdateStatus setBackgroundColor(Double[] colors) {
745         if (Arrays.equals(colors, this.backgroundColor)) {
746             return UpdateStatus.NoChange;
747         }
748
749         this.backgroundColor = colors;
750         return UpdateStatus.Success;
751     }
752
753     /* Enable */
754     public boolean getEnable() {
755         return this.enable;
756     }
757
758     public UpdateStatus setEnable(boolean status) {
759         if (this.enable == status) {
760             return UpdateStatus.NoChange;
761         }
762         this.enable = status;
763         return UpdateStatus.Success;
764     }
765
766     /* FontAngle */
767     public String getFontAngle() {
768         return this.fontAngle;
769     }
770
771     public UpdateStatus setFontAngle(String fontAngle) {
772         if (this.fontAngle.equals(fontAngle)) {
773             return UpdateStatus.NoChange;
774         }
775         this.fontAngle = fontAngle;
776         return UpdateStatus.Success;
777     }
778
779     /* FontName */
780     public String getFontName() {
781         return this.fontName;
782     }
783
784     public UpdateStatus setFontName(String fontName) {
785         if (this.fontName.equals(fontName)) {
786             return UpdateStatus.NoChange;
787         }
788         this.fontName = fontName;
789         return UpdateStatus.Success;
790     }
791
792     /* FontSize */
793     public double getFontSize() {
794         return this.fontSize;
795     }
796
797     public UpdateStatus setFontSize(double fontSize) {
798         if (this.fontSize == fontSize) {
799             return UpdateStatus.NoChange;
800         }
801         this.fontSize = fontSize;
802         return UpdateStatus.Success;
803     }
804
805     /* FontUnits */
806     public String getFontUnits() {
807         return this.fontUnits;
808     }
809
810     public UpdateStatus setFontUnits(String fontUnits) {
811         if (this.fontUnits.equals(fontUnits)) {
812             return UpdateStatus.NoChange;
813         }
814         this.fontUnits = fontUnits;
815         return UpdateStatus.Success;
816     }
817
818     /* FontWeight */
819     public String getFontWeight() {
820         return this.fontWeight;
821     }
822
823     public UpdateStatus setFontWeight(String fontWeight) {
824         if (this.fontWeight.equals(fontWeight)) {
825             return UpdateStatus.NoChange;
826         }
827         this.fontWeight = fontWeight;
828         return UpdateStatus.Success;
829     }
830
831     /* Foreground Color */
832     public Double[] getForegroundColor() {
833         return this.foregroundColor;
834     }
835
836     public UpdateStatus setForegroundColor(Double[] colors) {
837         if (Arrays.equals(this.foregroundColor, colors)) {
838             return UpdateStatus.NoChange;
839         }
840         this.foregroundColor = colors;
841         return UpdateStatus.Success;
842     }
843
844     /* Horizontal Alignment */
845     public String getHorizontalAlignment() {
846         return this.horizontalAlignment;
847     }
848
849     public UpdateStatus setHorizontalAlignment(String alignment) {
850         if (this.horizontalAlignment.equals(alignment)) {
851             return UpdateStatus.NoChange;
852         }
853         this.horizontalAlignment = alignment;
854         return UpdateStatus.Success;
855     }
856
857     /* Listbox Top */
858     public Integer getListboxTopSize() {
859         return (listboxTop != null ? listboxTop.length : 0);
860     }
861
862     public Integer[] getListboxTop() {
863         return this.listboxTop;
864     }
865
866     public UpdateStatus setListboxTop(Integer[] listboxTop) {
867         if (Arrays.equals(this.listboxTop, listboxTop)) {
868             return UpdateStatus.NoChange;
869         }
870         this.listboxTop = listboxTop;
871         return UpdateStatus.Success;
872     }
873
874     /* Max */
875     public Double getMax() {
876         return this.max;
877     }
878
879     public UpdateStatus setMax(double max) {
880         if (this.max == max) {
881             return UpdateStatus.NoChange;
882         }
883         this.max = max;
884         return UpdateStatus.Success;
885     }
886
887     /* Min */
888     public Double getMin() {
889         return this.min;
890     }
891
892     public UpdateStatus setMin(double min) {
893         if (this.min == min) {
894             return UpdateStatus.NoChange;
895         }
896         this.min = min;
897         return UpdateStatus.Success;
898     }
899
900     /* Position */
901     public Double[] getUiPosition() {
902         return this.position;
903     }
904
905     public UpdateStatus setUiPosition(Double[] position) {
906         if (Arrays.equals(this.position, position)) {
907             return UpdateStatus.NoChange;
908         }
909         this.position = position;
910         return UpdateStatus.Success;
911     }
912
913     /* Relief */
914     public String getRelief() {
915         return this.relief;
916     }
917
918     public UpdateStatus setRelief(String relief) {
919         if (this.relief.equals(relief)) {
920             return UpdateStatus.NoChange;
921         }
922         this.relief = relief;
923         return UpdateStatus.Success;
924     }
925
926     /**
927      * Get the string
928      * @return the string
929      */
930     public String[] getString() {
931         return this.string;
932     }
933
934     /**
935      * Set the string
936      * @param string the string
937      */
938     public UpdateStatus setString(String[] string) {
939         if (this.style == UicontrolStyle.LISTBOX || this.style == UicontrolStyle.POPUPMENU) {
940             /* String can be set using a|b|c|d */
941             if (string.length == 1 & string[0].contains(STRING_SEPARATOR)) {
942                 StringTokenizer strTok = new StringTokenizer(string[0], STRING_SEPARATOR);
943                 String[] stringTab = new String[strTok.countTokens()];
944                 while (strTok.hasMoreTokens()) {
945                     stringTab[stringTab.length - strTok.countTokens()] = strTok.nextToken();
946                 }
947                 this.string = stringTab;
948                 return UpdateStatus.Success;
949             }
950         }
951         this.string = string;
952         return UpdateStatus.Success;
953     }
954
955     /**
956      * Get the string column number
957      * @return the number of columns
958      */
959     public int getStringColNb() {
960         return stringColNb;
961     }
962
963     /**
964      * Set the string column number
965      * @param stringColNb the number of columns
966      */
967     public UpdateStatus setStringColNb(Integer stringColNb) {
968         if (this.stringColNb == stringColNb) {
969             return UpdateStatus.NoChange;
970         }
971         this.stringColNb = stringColNb;
972         return UpdateStatus.Success;
973     }
974
975
976     /**
977      * Get the tooltip string
978      * @return the tooltip string
979      */
980     public String[] getTooltipString() {
981         return this.tooltipString;
982     }
983
984     /**
985      * Set the tooltip string
986      * @param tooltipString the tooltip string
987      */
988     public UpdateStatus setTooltipString(String[] tooltipString) {
989         if (Arrays.equals(this.tooltipString, tooltipString)) {
990             return UpdateStatus.NoChange;
991         }
992         this.tooltipString = tooltipString;
993         return UpdateStatus.Success;
994     }
995
996     /* Slider Step */
997     public Double[] getSliderStep() {
998         return this.sliderStep;
999     }
1000
1001     public UpdateStatus setSliderStep(Double[] sliderStep) {
1002         if (Arrays.equals(this.sliderStep, sliderStep)) {
1003             return UpdateStatus.NoChange;
1004         }
1005         this.sliderStep = sliderStep;
1006         return UpdateStatus.Success;
1007     }
1008
1009     /* Units */
1010     public String getUnits() {
1011         return this.units;
1012     }
1013
1014     public UpdateStatus setUnits(String units) {
1015         if (this.units.equals(units)) {
1016             return UpdateStatus.NoChange;
1017         }
1018         this.units = units;
1019         return UpdateStatus.Success;
1020     }
1021
1022     /* Value */
1023     public Integer getUiValueSize() {
1024         return (value != null ? value.length : 0);
1025     }
1026
1027     public Double[] getUiValue() {
1028         return this.value;
1029     }
1030
1031     public UpdateStatus setUiValue(Double[] value) {
1032         if (Arrays.equals(this.value, value)) {
1033             return UpdateStatus.NoChange;
1034         }
1035         this.value = value;
1036         return UpdateStatus.Success;
1037     }
1038
1039     /* Vertical Alignment */
1040     public String getVerticalAlignment() {
1041         return this.verticalAlignment;
1042     }
1043
1044     public UpdateStatus setVerticalAlignment(String alignment) {
1045         if (this.verticalAlignment.equals(alignment)) {
1046             return UpdateStatus.NoChange;
1047         }
1048         this.verticalAlignment = alignment;
1049         return UpdateStatus.Success;
1050     }
1051
1052     public Integer getLayout() {
1053         return layout.ordinal();
1054     }
1055
1056     public LayoutType getLayoutAsEnum() {
1057         return layout;
1058     }
1059
1060     public boolean isLayoutSettable() {
1061         return (this.layout == LayoutType.NONE);
1062     }
1063
1064     public UpdateStatus setLayout(Integer value) {
1065         return setLayout(LayoutType.intToEnum(value));
1066     }
1067
1068     public UpdateStatus setLayout(LayoutType layout) {
1069         //avoid to set layout twice
1070         if (this.layout == LayoutType.NONE) {
1071             if (layout == LayoutType.NONE) {
1072                 return UpdateStatus.NoChange;
1073             }
1074
1075             this.layout = layout;
1076             return UpdateStatus.Success;
1077         }
1078
1079         return UpdateStatus.Fail;
1080     }
1081
1082     public Double[] getMargins() {
1083         return margins;
1084     }
1085
1086     public UpdateStatus setMargins(Double[] value) {
1087         UpdateStatus status = UpdateStatus.NoChange;
1088         if (value.length != 4) {
1089             return UpdateStatus.Fail;
1090         }
1091
1092         for (int i = 0 ; i < 4 ; i++) {
1093             if (margins[i].equals(value[i]) == false) {
1094                 margins[i] = value[i];
1095                 status = UpdateStatus.Success;
1096             }
1097         }
1098
1099         return status;
1100     }
1101
1102     public Integer getBorderPosition() {
1103         return borderPosition.ordinal();
1104     }
1105
1106     public BorderLayoutType getBorderPositionAsEnum() {
1107         return borderPosition;
1108     }
1109
1110     public UpdateStatus setBorderPosition(Integer value) {
1111         return setBorderPosition(BorderLayoutType.intToEnum(value));
1112     }
1113
1114     public UpdateStatus setBorderPosition(BorderLayoutType value) {
1115         if (borderPosition == value) {
1116             return UpdateStatus.NoChange;
1117         }
1118
1119         borderPosition = value;
1120         return UpdateStatus.Success;
1121     }
1122
1123     public Integer[] getGridBagPadding() {
1124         return gridbagPadding;
1125     }
1126
1127     public UpdateStatus setGridBagPadding(Integer[] value) {
1128         UpdateStatus status = UpdateStatus.NoChange;
1129         if (gridbagPadding.length != value.length) {
1130             return UpdateStatus.Fail;
1131         }
1132
1133         for (int i = 0 ; i < value.length ; i++) {
1134             if (gridbagPadding[i] != value[i]) {
1135                 gridbagPadding[i] = value[i];
1136                 status = UpdateStatus.Success;
1137             }
1138         }
1139
1140         return status;
1141     }
1142
1143     public Integer getGridBagAnchor() {
1144         return gridbagAnchor.ordinal();
1145     }
1146
1147     public AnchorType getGridBagAnchorAsEnum() {
1148         return gridbagAnchor;
1149     }
1150
1151     public UpdateStatus setGridBagAnchor(Integer value) {
1152         return setGridBagAnchor(AnchorType.intToEnum(value));
1153     }
1154
1155     public UpdateStatus setGridBagAnchor(AnchorType value) {
1156         if (gridbagAnchor == value) {
1157             return UpdateStatus.NoChange;
1158         }
1159
1160         gridbagAnchor = value;
1161         return UpdateStatus.Success;
1162     }
1163
1164     public Integer getGridBagFill() {
1165         return gridbagFill.ordinal();
1166     }
1167
1168     public FillType getGridBagFillAsEnum() {
1169         return gridbagFill;
1170     }
1171
1172     public UpdateStatus setGridBagFill(Integer value) {
1173         return setGridBagFill(FillType.intToEnum(value));
1174     }
1175
1176     public UpdateStatus setGridBagFill(FillType value) {
1177         if (gridbagFill == value) {
1178             return UpdateStatus.NoChange;
1179         }
1180
1181         gridbagFill = value;
1182         return UpdateStatus.Success;
1183     }
1184
1185     public Double[] getGridBagWeight() {
1186         return gridbagWeight;
1187     }
1188
1189     public UpdateStatus setGridBagWeight(Double[] value) {
1190         UpdateStatus status = UpdateStatus.NoChange;
1191         if (gridbagWeight.length != value.length) {
1192             return UpdateStatus.Fail;
1193         }
1194
1195         for (int i = 0 ; i < value.length ; i++) {
1196             if (gridbagWeight[i] != value[i]) {
1197                 gridbagWeight[i] = value[i];
1198                 status = UpdateStatus.Success;
1199             }
1200         }
1201
1202         return status;
1203     }
1204
1205     public Integer[] getGridBagGrid() {
1206         return gridbagGrid;
1207     }
1208
1209     public UpdateStatus setGridBagGrid(Integer[] value) {
1210         UpdateStatus status = UpdateStatus.NoChange;
1211         if (gridbagGrid.length != value.length) {
1212             return UpdateStatus.Fail;
1213         }
1214
1215         for (int i = 0 ; i < value.length ; i++) {
1216             if (gridbagGrid[i] != value[i]) {
1217                 gridbagGrid[i] = value[i];
1218                 status = UpdateStatus.Success;
1219             }
1220         }
1221
1222         return status;
1223     }
1224
1225     public Integer[] getBorderOptPadding() {
1226         return borderOptPadding;
1227     }
1228
1229     public UpdateStatus setBorderOptPadding(Integer[] value) {
1230         UpdateStatus status = UpdateStatus.NoChange;
1231         if (borderOptPadding.length != value.length) {
1232             return UpdateStatus.Fail;
1233         }
1234
1235         for (int i = 0 ; i < value.length ; i++) {
1236             if (borderOptPadding[i] != value[i]) {
1237                 borderOptPadding[i] = value[i];
1238                 status = UpdateStatus.Success;
1239             }
1240         }
1241
1242         return status;
1243     }
1244
1245     public Integer[] getGridOptPadding() {
1246         return gridOptPadding;
1247     }
1248
1249     public UpdateStatus setGridOptPadding(Integer[] value) {
1250         UpdateStatus status = UpdateStatus.NoChange;
1251         if (gridOptPadding.length != value.length) {
1252             return UpdateStatus.Fail;
1253         }
1254
1255         for (int i = 0 ; i < value.length ; i++) {
1256             if (gridOptPadding[i] != value[i]) {
1257                 gridOptPadding[i] = value[i];
1258                 status = UpdateStatus.Success;
1259             }
1260         }
1261
1262         return status;
1263     }
1264
1265     public Integer[] getGridOptGrid() {
1266         return gridOptGrid;
1267     }
1268
1269     public UpdateStatus setGridOptGrid(Integer[] value) {
1270         UpdateStatus status = UpdateStatus.NoChange;
1271         if (gridOptGrid.length != value.length) {
1272             return UpdateStatus.Fail;
1273         }
1274
1275         for (int i = 0 ; i < value.length ; i++) {
1276             if (gridOptGrid[i] != value[i]) {
1277                 gridOptGrid[i] = value[i];
1278                 status = UpdateStatus.Success;
1279             }
1280         }
1281
1282         return status;
1283     }
1284
1285     public void accept(Visitor visitor) {
1286     }
1287 }