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