enable/disable a tab children frame, enable/disable tab title to show its state
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / frame / SwingScilabFrame.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Vincent Couvert
4  * Copyright (C) 2007 - INRIA - Marouane BEN JELLOUL
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.bridge.frame;
15
16
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_BORDER_OPT_PADDING__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CHILDREN__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_GRID_OPT_GRID__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_GRID_OPT_PADDING__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LAYOUT__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POSITION__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TAG__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ENABLE__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FRAME_BORDER__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VISIBLE__;
29
30 import java.awt.BorderLayout;
31 import java.awt.Color;
32 import java.awt.Component;
33 import java.awt.Container;
34 import java.awt.Dimension;
35 import java.awt.GridBagConstraints;
36 import java.awt.GridBagLayout;
37 import java.awt.GridLayout;
38 import java.awt.Insets;
39 import java.awt.event.ComponentEvent;
40 import java.awt.event.ComponentListener;
41
42 import javax.swing.JPanel;
43 import javax.swing.UIManager;
44 import javax.swing.border.Border;
45
46 import org.scilab.modules.graphic_objects.axes.AxesContainer;
47 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
48 import org.scilab.modules.graphic_objects.graphicModel.GraphicModel;
49 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
50 import org.scilab.modules.graphic_objects.uicontrol.Uicontrol;
51 import org.scilab.modules.graphic_objects.utils.LayoutType;
52 import org.scilab.modules.gui.SwingView;
53 import org.scilab.modules.gui.SwingViewObject;
54 import org.scilab.modules.gui.SwingViewWidget;
55 import org.scilab.modules.gui.bridge.canvas.SwingScilabCanvas;
56 import org.scilab.modules.gui.bridge.checkbox.SwingScilabCheckBox;
57 import org.scilab.modules.gui.bridge.console.SwingScilabConsole;
58 import org.scilab.modules.gui.bridge.editbox.SwingScilabEditBox;
59 import org.scilab.modules.gui.bridge.label.SwingScilabLabel;
60 import org.scilab.modules.gui.bridge.listbox.SwingScilabListBox;
61 import org.scilab.modules.gui.bridge.pushbutton.SwingScilabPushButton;
62 import org.scilab.modules.gui.bridge.radiobutton.SwingScilabRadioButton;
63 import org.scilab.modules.gui.bridge.slider.SwingScilabScroll;
64 import org.scilab.modules.gui.bridge.tab.SwingScilabAxes;
65 import org.scilab.modules.gui.bridge.tab.SwingScilabDockablePanel;
66 import org.scilab.modules.gui.bridge.tab.SwingScilabTabGroup;
67 import org.scilab.modules.gui.bridge.textbox.SwingScilabTextBox;
68 import org.scilab.modules.gui.canvas.Canvas;
69 import org.scilab.modules.gui.checkbox.CheckBox;
70 import org.scilab.modules.gui.console.Console;
71 import org.scilab.modules.gui.dockable.Dockable;
72 import org.scilab.modules.gui.editbox.EditBox;
73 import org.scilab.modules.gui.events.callback.CommonCallBack;
74 import org.scilab.modules.gui.frame.Frame;
75 import org.scilab.modules.gui.frame.SimpleFrame;
76 import org.scilab.modules.gui.label.Label;
77 import org.scilab.modules.gui.listbox.ListBox;
78 import org.scilab.modules.gui.menubar.MenuBar;
79 import org.scilab.modules.gui.pushbutton.PushButton;
80 import org.scilab.modules.gui.radiobutton.RadioButton;
81 import org.scilab.modules.gui.slider.Slider;
82 import org.scilab.modules.gui.tab.Tab;
83 import org.scilab.modules.gui.textbox.TextBox;
84 import org.scilab.modules.gui.toolbar.ToolBar;
85 import org.scilab.modules.gui.utils.BorderConvertor;
86 import org.scilab.modules.gui.utils.Position;
87 import org.scilab.modules.gui.utils.PositionConverter;
88 import org.scilab.modules.gui.utils.ScilabRelief;
89 import org.scilab.modules.gui.utils.Size;
90
91 /**
92  * Swing implementation for Scilab frames in GUI
93  * @author Vincent COUVERT
94  * @author Marouane BEN JELLOUL
95  */
96 public class SwingScilabFrame extends JPanel implements SwingViewObject, SimpleFrame {
97
98     private static final long serialVersionUID = -7401084975837285447L;
99
100     private Integer uid = -1;
101     int redraw = 0;
102
103     private Border defaultBorder = null;
104
105     /**
106      * Constructor
107      */
108     public SwingScilabFrame() {
109         super();
110         // the Default layout is null so we have to set a Position and a Size of every Dockable we add to it
111         super.setLayout(null);
112         addComponentListener(new ComponentListener() {
113             public void componentShown(ComponentEvent e) { }
114
115             public void componentResized(ComponentEvent e) {
116                 if (getId() != -1 && getParent() != null && getParent().getLayout() != null) {
117
118                     Double[] newPosition = new Double[4];
119                     Double[] positions = (Double[]) GraphicController.getController().getProperty(getId(), GraphicObjectProperties.__GO_POSITION__);
120                     newPosition[0] = positions[0];
121                     newPosition[1] = positions[1];
122                     newPosition[2] = getSize().getWidth();
123                     newPosition[3] = getSize().getHeight();
124                     invalidate();
125                     GraphicController.getController().setProperty(getId(), GraphicObjectProperties.__GO_POSITION__, newPosition);
126                 }
127             }
128
129             public void componentMoved(ComponentEvent e) { }
130
131             public void componentHidden(ComponentEvent e) { }
132         });
133     }
134
135     /**
136      * Draws a Swing Scilab frame
137      * @see org.scilab.modules.gui.UIElement#draw()
138      */
139     public void draw() {
140         this.setVisible(true);
141         this.doLayout();
142     }
143
144     /**
145      * Gets the dimensions (width and height) of a swing Scilab frame
146      * @return the dimension of the frame
147      * @see org.scilab.modules.gui.UIElement#getDims()
148      */
149     public Size getDims() {
150         return new Size(this.getSize().width, this.getSize().height);
151     }
152
153     /**
154      * Gets the position (X-coordinate and Y-coordinate) of a swing Scilab frame
155      * @return the position of the frame
156      * @see org.scilab.modules.gui.UIElement#getPosition()
157      */
158     public Position getPosition() {
159         return PositionConverter.javaToScilab(getLocation(), getSize(), getParent());
160     }
161
162     /**
163      * Sets the dimensions (width and height) of a swing Scilab frame
164      * @param newSize the size we want to set to the frame
165      * @see org.scilab.modules.gui.UIElement#setDims(org.scilab.modules.gui.utils.Size)
166      */
167     public void setDims(Size newSize) {
168         this.setSize(newSize.getWidth(), newSize.getHeight());
169     }
170
171     /**
172      * Sets the position (X-coordinate and Y-coordinate) of a swing Scilab frame
173      * @param newPosition the position we want to set to the frame
174      * @see org.scilab.modules.gui.UIElement#setPosition(org.scilab.modules.gui.utils.Position)
175      */
176     public void setPosition(Position newPosition) {
177         Position javaPosition = PositionConverter.scilabToJava(newPosition, getDims(), getParent());
178         setLocation(javaPosition.getX(), javaPosition.getY());
179     }
180
181     /**
182      * Add a SwingViewObject (from SwingView.java) to container and returns its index
183      * @param member the member to add
184      */
185     public void addMember(SwingViewObject member) {
186         if (member instanceof SwingScilabAxes) {
187             AxesContainer frame = (AxesContainer) GraphicModel.getModel().getObjectFromId(getId());
188             SwingScilabCanvas canvas = new SwingScilabCanvas(frame);
189             setLayout(new BorderLayout());
190             add(canvas, BorderLayout.CENTER);
191             return;
192         }
193
194         Uicontrol uicontrol = (Uicontrol) GraphicModel.getModel().getObjectFromId(member.getId());
195         if (getLayout() instanceof BorderLayout) {
196             switch (uicontrol.getBorderPositionAsEnum()) {
197                 case BOTTOM:
198                     add((Component) member, BorderLayout.SOUTH);
199                     break;
200                 case TOP:
201                     add((Component) member, BorderLayout.NORTH);
202                     break;
203                 case LEFT:
204                     add((Component) member, BorderLayout.WEST);
205                     break;
206                 case RIGHT:
207                     add((Component) member, BorderLayout.EAST);
208                     break;
209                 case CENTER:
210                     add((Component) member, BorderLayout.CENTER);
211                     break;
212                 default:
213                     break;
214             }
215         } else if (getLayout() instanceof GridBagLayout) {
216             GridBagConstraints constraints = new GridBagConstraints();
217
218             // Grid
219             Integer[] grid = uicontrol.getGridBagGrid();
220             constraints.gridx = grid[0];
221             constraints.gridy = grid[1];
222             constraints.gridwidth = grid[2];
223             constraints.gridheight = grid[3];
224
225             // Weight
226             Double[] weight = uicontrol.getGridBagWeight();
227             constraints.weightx = weight[0];
228             constraints.weighty = weight[1];
229
230             // Anchor
231             switch (uicontrol.getGridBagAnchorAsEnum()) {
232                 case LEFT :
233                     constraints.anchor = GridBagConstraints.WEST;
234                     break;
235                 case UPPER :
236                     constraints.anchor = GridBagConstraints.NORTH;
237                     break;
238                 case LOWER:
239                     constraints.anchor = GridBagConstraints.SOUTH;
240                     break;
241                 case LOWER_LEFT:
242                     constraints.anchor = GridBagConstraints.SOUTHWEST;
243                     break;
244                 case LOWER_RIGHT:
245                     constraints.anchor = GridBagConstraints.SOUTHEAST;
246                     break;
247                 case RIGHT:
248                     constraints.anchor = GridBagConstraints.EAST;
249                     break;
250                 case UPPER_LEFT:
251                     constraints.anchor = GridBagConstraints.NORTHWEST;
252                     break;
253                 case UPPER_RIGHT:
254                     constraints.anchor = GridBagConstraints.NORTHEAST;
255                     break;
256                 case CENTER :
257                 default :
258                     constraints.anchor = GridBagConstraints.CENTER;
259                     break;
260             }
261
262             // Fill
263             switch (uicontrol.getGridBagFillAsEnum()) {
264                 case BOTH :
265                     constraints.fill = GridBagConstraints.BOTH;
266                     break;
267                 case HORIZONTAL:
268                     constraints.fill = GridBagConstraints.HORIZONTAL;
269                     break;
270                 case VERTICAL:
271                     constraints.fill = GridBagConstraints.VERTICAL;
272                     break;
273                 case NONE:
274                 default:
275                     constraints.fill = GridBagConstraints.NONE;
276                     break;
277             }
278
279             // Insets
280             Double[] margins = uicontrol.getMargins();
281             constraints.insets = new Insets(
282                 margins[0].intValue(), margins[1].intValue(),
283                 margins[2].intValue(), margins[3].intValue());
284
285             // Padding
286             Integer[] padding = uicontrol.getGridBagPadding();
287             constraints.ipadx = padding[0];
288             constraints.ipady = padding[1];
289
290             Integer[] preferredSize = uicontrol.getGridBagPreferredSize();
291             if (preferredSize[0].equals(-1) == false && preferredSize[1].equals(-1) == false) {
292                 ((Component) member).setPreferredSize(new Dimension(preferredSize[0], preferredSize[1]));
293             }
294
295             add((Component) member, constraints);
296             revalidate();
297         } else if (getLayout() instanceof GridLayout) {
298             this.add((Component) member, 0);
299         } else {
300             this.add((Component) member);
301         }
302
303         //force update position
304         member.update(__GO_POSITION__, GraphicController.getController().getProperty(member.getId(), __GO_POSITION__));
305     }
306
307     /**
308      * Add a member (dockable element) to container and returns its index
309      * @param member the member to add
310      * @return index of member in ArrayList
311      */
312     public int addMember(Console member) {
313         return this.addMember((SwingScilabConsole) member.getAsSimpleConsole());
314     }
315
316     /**
317      * Add a member (dockable element) to container and returns its index
318      * @param member the member to add
319      * @return index of member in ArrayList
320      */
321     private int addMember(SwingScilabConsole member) {
322         this.add(member);
323         return this.getComponentZOrder(member);
324     }
325
326     /**
327      * Add a member (dockable element) to container and returns its index
328      * @param member the member to add
329      * @return index of member in ArrayList
330      */
331     public int addMember(EditBox member) {
332         return this.addMember((SwingScilabEditBox) member.getAsSimpleEditBox());
333     }
334
335     /**
336      * Add a member (dockable element) to container and returns its index
337      * @param member the member to add
338      * @return index of member in ArrayList
339      */
340     private int addMember(SwingScilabEditBox member) {
341         this.add(member);
342         return this.getComponentZOrder(member);
343     }
344
345     /**
346      * Add a member (dockable element) to container and returns its index
347      * @param member the member to add
348      * @return index of member in ArrayList
349      */
350     public int addMember(Label member) {
351         // FIXME replace member with member.getAsSimpleLabel() when ready
352         return this.addMember((SwingScilabLabel) member);
353     }
354
355     /**
356      * Add a member (dockable element) to container and returns its index
357      * @param member the member to add
358      * @return index of member in ArrayList
359      */
360     private int addMember(SwingScilabLabel member) {
361         this.add(member);
362         return this.getComponentZOrder(member);
363     }
364
365     /**
366      * Add a member (dockable element) to container and returns its index
367      * @param member the member to add
368      * @return index of member in ArrayList
369      */
370     public int addMember(Frame member) {
371         return this.addMember((SwingScilabFrame) member.getAsSimpleFrame());
372     }
373
374     /**
375      * Add a member (dockable element) to container and returns its index
376      * @param member the member to add
377      * @return index of member in ArrayList
378      */
379     private int addMember(SwingScilabFrame member) {
380         this.add(member);
381         return this.getComponentZOrder(member);
382     }
383
384     /**
385      * Add a Frame in a Frame with a BorderLayout.
386      * @param member the member to add
387      * @param borderLayout the BorderLayout to use
388      * @return the position of the Frame in the member list.
389      */
390     public int addMember(Frame member, String borderLayout) {
391         return this.addMember((SwingScilabFrame) member.getAsSimpleFrame(), borderLayout);
392     }
393
394     /**
395      * Add a member (dockable element) to container and returns its index
396      * @param member the member to add
397      * @param borderLayout the BorderLayout to use
398      * @return index of member in ArrayList
399      */
400     private int addMember(SwingScilabFrame member, String borderLayout) {
401         this.add(member, borderLayout);
402         return this.getComponentZOrder(member);
403     }
404
405     /**
406      * Add a Frame in a Frame with a layout.
407      * @param member the member to add
408      * @param layoutPosition the Layout position to use
409      * @return the position of the Frame in the member list.
410      */
411     public int addMember(Frame member, int layoutPosition) {
412         return this.addMember((SwingScilabFrame) member.getAsSimpleFrame(), layoutPosition);
413     }
414
415     /**
416      * Add a member (dockable element) to container and returns its index
417      * @param member the member to add
418      * @param layoutPosition the Layout position to use
419      * @return index of member in ArrayList
420      */
421     private int addMember(SwingScilabFrame member, int layoutPosition) {
422         this.add(member, layoutPosition);
423         return this.getComponentZOrder(member);
424     }
425
426     /**
427      * Add a member (dockable element) to container and returns its index
428      * @param member the member to add
429      * @return index of member in ArrayList
430      */
431     public int addMember(Canvas member) {
432         return this.addMember((SwingScilabCanvas) member.getAsSimpleCanvas());
433     }
434
435     /**
436      * Add a member (dockable element) to container and returns its index
437      * @param member the member to add
438      * @return index of member in ArrayList
439      */
440     private int addMember(SwingScilabCanvas member) {
441         return 0;
442     }
443
444     /**
445      * Add a member (dockable element) to container and returns its index
446      * @param member the member to add
447      * @return index of member in ArrayList
448      */
449     public int addMember(CheckBox member) {
450         // FIXME replace member with member.getAsSimpleCheckBox() when ready
451         return this.addMember((SwingScilabCheckBox) member);
452     }
453
454     /**
455      * Add a member (dockable element) to container and returns its index
456      * @param member the member to add
457      * @return index of member in ArrayList
458      */
459     private int addMember(SwingScilabCheckBox member) {
460         this.add(member);
461         return this.getComponentZOrder(member);
462     }
463
464     /**
465      * Add a member (dockable element) to container and returns its index
466      * @param member the member to add
467      * @return index of member in ArrayList
468      */
469     public int addMember(ListBox member) {
470         return this.addMember((SwingScilabListBox) member.getAsSimpleListBox());
471     }
472
473     /**
474      * Add a member (dockable element) to container and returns its index
475      * @param member the member to add
476      * @return index of member in ArrayList
477      */
478     private int addMember(SwingScilabListBox member) {
479         this.add(member);
480         return this.getComponentZOrder(member);
481     }
482
483     /**
484      * Add a member (dockable element) to container and returns its index
485      * @param member the member to add
486      * @return index of member in ArrayList
487      */
488     public int addMember(PushButton member) {
489         return this.addMember((SwingScilabPushButton) member.getAsSimplePushButton());
490     }
491
492     /**
493      * Add a member (dockable element) to container and returns its index
494      * @param member the member to add
495      * @return index of member in ArrayList
496      */
497     private int addMember(SwingScilabPushButton member) {
498         this.add(member);
499         return this.getComponentZOrder(member);
500     }
501
502     /**
503      * Add a member (dockable element) to container and returns its index
504      * @param member the member to add
505      * @return index of member in ArrayList
506      */
507     public int addMember(RadioButton member) {
508         //               FIXME replace member with member.getAsSimpleRadioButton() when ready
509         return this.addMember((SwingScilabRadioButton) member);
510     }
511
512     /**
513      * Add a member (dockable element) to container and returns its index
514      * @param member the member to add
515      * @return index of member in ArrayList
516      */
517     private int addMember(SwingScilabRadioButton member) {
518         this.add(member);
519         return this.getComponentZOrder(member);
520     }
521
522     /**
523      * Add a member (dockable element) to container and returns its index
524      * @param member the member to add
525      * @return index of member in ArrayList
526      */
527     public int addMember(Slider member) {
528         //               FIXME replace member with member.getAsSimpleSlider() when ready
529         return this.addMember((SwingScilabScroll) member);
530     }
531
532     /**
533      * Add a member (dockable element) to container and returns its index
534      * @param member the member to add
535      * @return index of member in ArrayList
536      */
537     private int addMember(SwingScilabScroll member) {
538         this.add(member);
539         return this.getComponentZOrder(member);
540     }
541
542     /**
543      * Add a PushButton in a Frame with a BorderLayout.
544      * @param member the PushButton to add
545      * @param borderLayout the BorderLayout to use
546      * @return the position of the PushButton in the member list.
547      */
548     public int addMember(PushButton member, String borderLayout) {
549         return this.addMember((SwingScilabPushButton) member.getAsSimplePushButton(), borderLayout);
550     }
551
552     /**
553      * Add a PushButton (dockable element) to Frame and returns its index
554      * @param member the PushButton to add
555      * @param layoutPosition the layout Position to use
556      * @return index of member in ArrayList
557      */
558     private int addMember(SwingScilabPushButton member, int layoutPosition) {
559         this.add(member, layoutPosition);
560         return this.getComponentZOrder(member);
561     }
562
563     /**
564      * Add a PushButton in a Frame with a layout.
565      * @param member the PushButton to add
566      * @param layoutPosition the layout Position to use
567      * @return the position of the PushButton in the member list.
568      */
569     public int addMember(PushButton member, int layoutPosition) {
570         return this.addMember((SwingScilabPushButton) member.getAsSimplePushButton(), layoutPosition);
571     }
572
573     /**
574      * Add a PushButton (dockable element) to Frame and returns its index
575      * @param member the PushButton to add
576      * @param borderLayout the BorderLayout to use
577      * @return index of member in ArrayList
578      */
579     private int addMember(SwingScilabPushButton member, String borderLayout) {
580         this.add(member, borderLayout);
581         return this.getComponentZOrder(member);
582     }
583
584     //   TODO : Check if it should be possible to add a Tab to a frame and how it should behave
585     /**
586      * Add a member (dockable element) to container and returns its index
587      * @param member the member to add
588      * @return index of member in ArrayList
589      */
590     public int addMember(Tab member) {
591         return this.addMember((SwingScilabDockablePanel) member.getAsSimpleTab());
592     }
593     //   TODO : Check if it should be possible to add a Tab to a frame and how it should behave
594     /**
595      * Add a member (dockable element) to container and returns its index
596      * @param member the member to add
597      * @return index of member in ArrayList
598      */
599     private int addMember(SwingScilabDockablePanel member) {
600         this.add(member);
601         return this.getComponentZOrder(member);
602     }
603
604     /**
605      * Add a member (dockable element) to container and returns its index
606      * @param member the member to add
607      * @return index of member in ArrayList
608      */
609     public int addMember(TextBox member) {
610         return this.addMember((SwingScilabTextBox) member.getAsSimpleTextBox());
611     }
612
613     /**
614      * Add a member (dockable element) to container and returns its index
615      * @param member the member to add
616      * @return index of member in ArrayList
617      */
618     private int addMember(SwingScilabTextBox member) {
619         this.add(member);
620         return this.getComponentZOrder(member);
621     }
622
623     /**
624      * Add a callback to the Frame
625      * @param callback the callback to set.
626      */
627     public void setCallback(CommonCallBack callback) {
628         // Nothing to do...
629     }
630
631     /**
632      * Setter for MenuBar
633      * @param menuBarToAdd the MenuBar associated to the Frame.
634      */
635     public void addMenuBar(MenuBar menuBarToAdd) {
636         /* Unimplemented for Frames */
637         throw new UnsupportedOperationException();
638     }
639
640     /**
641      * Setter for ToolBar
642      * @param toolBarToAdd the ToolBar associated to the Frame.
643      */
644     public void addToolBar(ToolBar toolBarToAdd) {
645         /* Unimplemented for Frames */
646         throw new UnsupportedOperationException();
647     }
648
649     /**
650      * Getter for MenuBar
651      * @return MenuBar: the MenuBar associated to the Frame.
652      */
653     public MenuBar getMenuBar() {
654         /* Unimplemented for Frames */
655         throw new UnsupportedOperationException();
656     }
657
658     /**
659      * Getter for ToolBar
660      * @return ToolBar: the ToolBar associated to the Frame.
661      */
662     public ToolBar getToolBar() {
663         /* Unimplemented for Frames */
664         throw new UnsupportedOperationException();
665     }
666
667     /**
668      * Get the text of the Frame
669      * @return the text of the frame
670      * @see org.scilab.modules.gui.frame.SimpleFrame#getText()
671      */
672     public String getText() {
673         return this.getName();
674     }
675
676     /**
677      * Set the text of the Frame
678      * @param text the text to set to the frame
679      * @see org.scilab.modules.gui.frame.SimpleFrame#setText()
680      */
681     public void setText(String text) {
682         this.setName(text);
683     }
684
685     /**
686      * Add a dockable element in the Frame (Not available for the moment)
687      * @param member the object we want to add to the Frame
688      * @return the index of the member in the Frame
689      * @see org.scilab.modules.gui.container.Container#addMember(org.scilab.modules.gui.dockable.Dockable)
690      */
691     public int addMember(Dockable member) {
692         /* Unimplemented for Frames */
693         throw new UnsupportedOperationException();
694     }
695
696     /**
697      * Set the Relief of the Frame
698      * @param reliefType the type of the relief to set (See ScilabRelief.java)
699      */
700     public void setRelief(String reliefType) {
701         if (defaultBorder == null) {
702             defaultBorder = getBorder();
703         }
704         setBorder(ScilabRelief.getBorderFromRelief(reliefType, defaultBorder));
705     }
706
707     /**
708      * Destroy the Frame
709      */
710     public void destroy() {
711         getParent().remove(this);
712         this.setVisible(false);
713     }
714
715     /**
716      * Setter for InfoBar
717      * @param infoBarToAdd the InfoBar associated to the Frame.
718      */
719     public void addInfoBar(TextBox infoBarToAdd) {
720         /* Unimplemented for Frames */
721         throw new UnsupportedOperationException();
722     }
723
724     /**
725      * Getter for InfoBar
726      * @return the InfoBar associated to the Frame.
727      */
728     public TextBox getInfoBar() {
729         /* Unimplemented for Frames */
730         throw new UnsupportedOperationException();
731     }
732
733     /**
734      * Set the horizontal alignment for the Slider text
735      * @param alignment the value for the alignment (See ScilabAlignment.java)
736      */
737     public void setHorizontalAlignment(String alignment) {
738         // Nothing to do here
739     }
740
741     /**
742      * Set the vertical alignment for the Slider text
743      * @param alignment the value for the alignment (See ScilabAlignment.java)
744      */
745     public void setVerticalAlignment(String alignment) {
746         // Nothing to do here
747     }
748
749     /**
750      * Set the UID
751      * @param id the UID
752      */
753     public void setId(Integer id) {
754         uid = id;
755     }
756
757     /**
758      * Get the UID
759      * @return the UID
760      */
761     public Integer getId() {
762         return uid;
763     }
764
765     /**
766      * Generic update method
767      * @param property property name
768      * @param value property value
769      */
770     public void update(int property, Object value) {
771         GraphicController controller = GraphicController.getController();
772
773         switch (property) {
774             case __GO_UI_VALUE__: {
775                 if (this instanceof SwingScilabLayer) {
776                     SwingScilabLayer layer = (SwingScilabLayer) this;
777                     Double[] doubleValue = ((Double[]) value);
778                     if (doubleValue.length == 0) {
779                         return;
780                     }
781
782                     Integer val = doubleValue[0].intValue();
783
784                     //if intValue[0] is out of bounds, do not update view but let "wrong" value in model
785                     layer.setActiveLayer(val);
786                 }
787                 break;
788             }
789             case __GO_UI_STRING__: {
790                 // Update tab title
791                 Container parent = getParent();
792                 if (parent instanceof SwingScilabTabGroup) {
793                     SwingScilabTabGroup tab = (SwingScilabTabGroup) parent;
794                     int index = tab.indexOfComponent(this);
795                     if (index != -1) {
796                         tab.setTitleAt(index, ((String[]) value)[0]);
797                     }
798                 }
799
800                 if (this instanceof SwingScilabLayer) {
801                     SwingScilabLayer layer = (SwingScilabLayer) this;
802                     //if intValue[0] is out of bounds, do not update view but let "wrong" value in model
803                     layer.setActiveLayerFromName(((String[]) value)[0]);
804                 }
805                 break;
806             }
807             case __GO_POSITION__: {
808                 SwingViewWidget.updatePosition(this, uid, value);
809                 revalidate();
810                 doLayout();
811                 break;
812             }
813             case __GO_UI_FRAME_BORDER__: {
814                 Integer borderId = (Integer) value;
815                 Border border = BorderConvertor.getBorder(borderId);
816                 setBorder(border);
817                 break;
818             }
819             case __GO_LAYOUT__: {
820                 LayoutType newLayout = LayoutType.intToEnum((Integer) value);
821                 switch (newLayout) {
822                     case BORDER: {
823                         Integer[] padding = (Integer[]) controller.getProperty(getId(), __GO_BORDER_OPT_PADDING__);
824                         setLayout(new BorderLayout(padding[0], padding[1]));
825                         break;
826                     }
827                     case GRIDBAG:
828                         setLayout(new GridBagLayout());
829                         break;
830                     case GRID: {
831                         Integer[] padding = (Integer[]) controller.getProperty(getId(), __GO_GRID_OPT_PADDING__);
832                         Integer[] grid = (Integer[]) controller.getProperty(getId(), __GO_GRID_OPT_GRID__);
833                         if (grid[0] == 0 && grid[1] == 0) {
834                             grid[0] = 1;
835                         }
836
837                         setLayout(new GridLayout(grid[0], grid[1], padding[0], padding[1]));
838                         break;
839                     }
840                     case NONE:
841                     default: {
842                         setLayout(null);
843                         break;
844                     }
845                 }
846                 break;
847             }
848             case __GO_VISIBLE__: {
849                 boolean needUpdate = true;
850                 Component parent = getParent();
851                 if (parent instanceof SwingScilabLayer) {
852                     //no no no don't touch visible on layer children !
853                     Boolean visible = (Boolean) value;
854                     SwingScilabLayer layer = (SwingScilabLayer) parent;
855                     Boolean isActive = layer.isLayerActive(this);
856                     if (isActive != visible) {
857                         controller.setProperty(uid, __GO_VISIBLE__, isActive);
858                     }
859
860                     needUpdate = false;
861                 } else if (parent instanceof SwingScilabTabGroup) {
862                     //no no no don't touch visible on layer children !
863                     Boolean visible = (Boolean) value;
864                     SwingScilabTabGroup layer = (SwingScilabTabGroup) parent;
865                     Boolean isActive = layer.isTabActive(this);
866                     if (isActive != visible) {
867                         controller.setProperty(uid, __GO_VISIBLE__, isActive);
868                     }
869
870                     needUpdate = false;
871                 }
872
873                 if (needUpdate) {
874                     setVisible(((Boolean) value).booleanValue());
875                 }
876
877                 break;
878             }
879             case __GO_TAG__ : {
880                 Component parent = getParent();
881                 if (parent instanceof SwingScilabLayer) {
882                     SwingScilabLayer layer = (SwingScilabLayer)parent;
883                     layer.updateModelProperties(null, layer.getActiveLayer());
884                 } else if (parent instanceof SwingScilabTabGroup) {
885                     ((SwingScilabTabGroup)parent).updateModelProperties();
886                 }
887                 break;
888             }
889             default:
890                 SwingViewWidget.update(this, property, value);
891                 break;
892         }
893     }
894
895     /**
896      * Set the enable status of the frame and its children
897      * @param status the status to set
898      */
899     public void setEnabled(boolean status) {
900         if (status) {
901             // Enable the frame
902             super.setEnabled(status);
903             // Enable its children according to their __GO_UI_ENABLE__ property
904             Integer[] children = (Integer[]) GraphicController.getController().getProperty(uid, __GO_CHILDREN__);
905             for (int kChild = 0; kChild < children.length; kChild++) {
906                 Boolean childStatus = (Boolean) GraphicController.getController().getProperty(children[kChild], __GO_UI_ENABLE__);
907                 SwingView.getFromId(children[kChild]).update(__GO_UI_ENABLE__, childStatus);
908             }
909         } else {
910             // Disable the frame
911             super.setEnabled(status);
912             // Disable its children
913             Component[] components = getComponents();
914             for (int compIndex = 0; compIndex < components.length; compIndex++) {
915                 components[compIndex].setEnabled(false);
916             }
917         }
918
919         //if parent is a tab enable/disable children tab
920         Component parent = getParent();
921         if (parent instanceof SwingScilabTabGroup) {
922             SwingScilabTabGroup tab = (SwingScilabTabGroup)parent;
923             Integer index = tab.getIndex(this);
924             if (index != -1) {
925                 tab.setEnabledAt(index, status);
926             }
927         }
928     }
929
930     public void resetBackground() {
931         Color color = (Color)UIManager.getLookAndFeelDefaults().get("Panel.background");
932         if (color != null) {
933             setBackground(color);
934         }
935     }
936 }