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