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