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