a0fa2238d8a7a29b1c860a093f3dba451bc2e2a8
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / SwingView.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - DIGITEO - Bruno JOFRET
4  * Copyright (C) 2011 - DIGITEO - Vincent COUVERT
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-en.txt
11  *
12  */
13 package org.scilab.modules.gui;
14
15 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_AXES_SIZE__;
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACKTYPE__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACK__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CHILDREN__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CONSOLE__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FIGURE__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PARENT__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POSITION__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PROGRESSIONBAR__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_SIZE__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_STYLE__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TYPE__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UICHECKEDMENU__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UICHILDMENU__;
29 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UICONTEXTMENU__;
30 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UICONTROL__;
31 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UIMENU__;
32 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UIPARENTMENU__;
33 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_BACKGROUNDCOLOR__;
34 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_CHECKBOX__;
35 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_CHECKED__;
36 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_EDIT__;
37 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ENABLE__;
38 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTANGLE__;
39 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTNAME__;
40 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTSIZE__;
41 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTWEIGHT__;
42 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FOREGROUNDCOLOR__;
43 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FRAME__;
44 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_HORIZONTALALIGNMENT__;
45 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ICON__;
46 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_IMAGE__;
47 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LABEL__;
48 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LISTBOX__;
49 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_POPUPMENU__;
50 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_PUSHBUTTON__;
51 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_RADIOBUTTON__;
52 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_RELIEF__;
53 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SEPARATOR__;
54 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SLIDER__;
55 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING__;
56 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TABLE__;
57 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TEXT__;
58 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VERTICALALIGNMENT__;
59 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VALID__;
60 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VISIBLE__;
61 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_WAITBAR__;
62 import static org.scilab.modules.gui.utils.Debug.DEBUG;
63
64 import java.awt.Component;
65 import java.awt.Container;
66 import java.awt.GraphicsEnvironment;
67 import java.util.Arrays;
68 import java.util.Collections;
69 import java.util.HashMap;
70 import java.util.HashSet;
71 import java.util.Map;
72 import java.util.Set;
73 import java.util.UUID;
74
75 import javax.swing.JComponent;
76 import javax.swing.JSeparator;
77
78 import org.flexdock.docking.Dockable;
79 import org.flexdock.docking.DockingManager;
80 import org.flexdock.docking.activation.ActiveDockableTracker;
81 import org.flexdock.view.View;
82 import org.scilab.modules.graphic_objects.console.Console;
83 import org.scilab.modules.graphic_objects.figure.Figure;
84 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
85 import org.scilab.modules.graphic_objects.graphicView.GraphicView;
86 import org.scilab.modules.gui.bridge.checkbox.SwingScilabCheckBox;
87 import org.scilab.modules.gui.bridge.checkboxmenuitem.SwingScilabCheckBoxMenuItem;
88 import org.scilab.modules.gui.bridge.console.SwingScilabConsole;
89 import org.scilab.modules.gui.bridge.contextmenu.SwingScilabContextMenu;
90 import org.scilab.modules.gui.bridge.editbox.SwingScilabEditBox;
91 import org.scilab.modules.gui.bridge.frame.SwingScilabFrame;
92 import org.scilab.modules.gui.bridge.label.SwingScilabLabel;
93 import org.scilab.modules.gui.bridge.listbox.SwingScilabListBox;
94 import org.scilab.modules.gui.bridge.menu.SwingScilabMenu;
95 import org.scilab.modules.gui.bridge.menuitem.SwingScilabMenuItem;
96 import org.scilab.modules.gui.bridge.popupmenu.SwingScilabPopupMenu;
97 import org.scilab.modules.gui.bridge.pushbutton.SwingScilabPushButton;
98 import org.scilab.modules.gui.bridge.radiobutton.SwingScilabRadioButton;
99 import org.scilab.modules.gui.bridge.slider.SwingScilabSlider;
100 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
101 import org.scilab.modules.gui.bridge.uiimage.SwingScilabUiImage;
102 import org.scilab.modules.gui.bridge.uitable.SwingScilabUiTable;
103 import org.scilab.modules.gui.bridge.waitbar.SwingScilabWaitBar;
104 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
105 import org.scilab.modules.gui.console.ScilabConsole;
106 import org.scilab.modules.gui.menubar.ScilabMenuBar;
107 import org.scilab.modules.gui.textbox.ScilabTextBox;
108 import org.scilab.modules.gui.textbox.TextBox;
109 import org.scilab.modules.gui.toolbar.ToolBar;
110 import org.scilab.modules.gui.utils.ToolBarBuilder;
111 import org.scilab.modules.gui.utils.WindowsConfigurationManager;
112 import org.scilab.modules.gui.widget.Widget;
113
114 /**
115  * @author Bruno JOFRET
116  * @author Vincent COUVERT
117  */
118 public final class SwingView implements GraphicView {
119
120     public static final String NULLUUID = new UUID(0L, 0L).toString();
121
122     private static SwingView me;
123
124     private Map<String, TypedObject> allObjects;
125
126     /**
127      * Constructor
128      */
129     private SwingView() {
130         GraphicController.getController().register(this);
131         allObjects = Collections.synchronizedMap(new HashMap<String, TypedObject>());
132     }
133
134     public static void registerSwingView() {
135         DEBUG("SwingView", "calling registerSwingView()");
136         if (me == null) {
137             me = new SwingView();
138         }
139     }
140
141     public static SwingViewObject getFromId(String id) {
142         TypedObject typedObject = me.allObjects.get(id);
143
144         if (typedObject == null) {
145             return null;
146         }
147
148         return typedObject.getValue();
149     }
150
151     private enum UielementType {
152         Console,
153             CheckBox,
154             Edit,
155             Frame,
156             Figure,
157             Image,
158             ListBox,
159             PopupMenu,
160             Progressbar,
161             PushButton,
162             RadioButton,
163             Slider,
164             Table,
165             Text,
166             Uimenu,
167             UiParentMenu,
168             UiChildMenu,
169             UiCheckedMenu,
170             UiContextMenu,
171             Waitbar
172             }
173
174     private class TypedObject {
175         private UielementType   _type;
176         private SwingViewObject _value;
177         private Set<String> _children;
178
179         public TypedObject(UielementType _type, SwingViewObject _value) {
180             this._type = _type;
181             this._value = _value;
182             this._children = Collections.synchronizedSet(new HashSet<String>());
183         }
184
185         public UielementType getType() {
186             return _type;
187         }
188
189         public SwingViewObject getValue() {
190             return _value;
191         }
192
193         public Set<String> getChildren() {
194             return _children;
195         }
196
197         public void addChild(String childUID) {
198             _children.add(childUID);
199         }
200
201         public void removeChild(String childUID) {
202             _children.remove(childUID);
203         }
204
205         public boolean hasChild(String childUID) {
206             return _children.contains(childUID);
207         }
208     };
209
210     @Override
211     public void createObject(String id) {
212         if (!GraphicsEnvironment.isHeadless()) {
213             boolean isValid = (Boolean) GraphicController.getController().getProperty(id, __GO_VALID__);
214             if (!isValid) {
215                 return;
216             }
217
218             String objectType = (String) GraphicController.getController().getProperty(id, __GO_TYPE__);
219             DEBUG("SwingWiew", "Object Created : " + id + "with type : " + objectType);
220             if (objectType.equals(__GO_FIGURE__)
221                 || objectType.equals(__GO_UICONTEXTMENU__)
222                 || objectType.equals(__GO_UIMENU__)
223                 || objectType.equals(__GO_CONSOLE__)
224                 || objectType.equals(__GO_PROGRESSIONBAR__)
225                 || objectType.equals(__GO_WAITBAR__)) {
226                 allObjects.put(id, CreateObjectFromType(objectType, id));
227                 return;
228             }
229
230             if (objectType.equals(__GO_UICONTROL__)) {
231                 String style = (String) GraphicController.getController().getProperty(id, __GO_STYLE__);
232                 DEBUG("SwingView", "__GO_STYLE__(" + style + ")");
233                 if (style != null) {
234                     allObjects.put(id, CreateObjectFromType(style, id));
235                 } else {
236                     allObjects.put(id, null);
237                 }
238             }
239         }
240     }
241
242     private UielementType StyleToEnum(String style) {
243         DEBUG("SwingView", "StyleToEnum(" + style + ")");
244         if (style.equals(__GO_FIGURE__)) {
245             return UielementType.Figure;
246         } else if (style.equals(__GO_CONSOLE__)) {
247             return UielementType.Console;
248         } else if (style.equals(__GO_UI_CHECKBOX__)) {
249             return UielementType.CheckBox;
250         } else if (style.equals(__GO_UI_EDIT__)) {
251             return UielementType.Edit;
252         } else if (style.equals(__GO_UI_FRAME__)) {
253             return UielementType.Frame;
254         } else if (style.equals(__GO_UI_IMAGE__)) {
255             return UielementType.Image;
256         } else if (style.equals(__GO_UI_LISTBOX__)) {
257             return UielementType.ListBox;
258         } else if (style.equals(__GO_UI_POPUPMENU__)) {
259             return UielementType.PopupMenu;
260         } else if (style.equals(__GO_UI_PUSHBUTTON__)) {
261             return UielementType.PushButton;
262         } else if (style.equals(__GO_UI_RADIOBUTTON__)) {
263             return UielementType.RadioButton;
264         } else if (style.equals(__GO_UI_SLIDER__)) {
265             return UielementType.Slider;
266         } else if (style.equals(__GO_UI_TABLE__)) {
267             return UielementType.Table;
268         } else if (style.equals(__GO_UI_TEXT__)) {
269             return UielementType.Text;
270         } else if (style.equals(__GO_UIMENU__)) {
271             return UielementType.UiChildMenu;
272         } else if (style.equals(__GO_UIPARENTMENU__)) {
273             return UielementType.UiParentMenu;
274         } else if (style.equals(__GO_UICHILDMENU__)) {
275             return UielementType.UiChildMenu;
276         } else if (style.equals(__GO_UICHECKEDMENU__)) {
277             return UielementType.UiCheckedMenu;
278         } else if (style.equals(__GO_PROGRESSIONBAR__)) {
279             return UielementType.Progressbar;
280         } else if (style.equals(__GO_WAITBAR__)) {
281             return UielementType.Waitbar;
282         } else if (style.equals(__GO_UICONTEXTMENU__)) {
283             return UielementType.UiContextMenu;
284         }
285         return null;
286     }
287
288     private TypedObject CreateObjectFromType(String type, String id) {
289         UielementType enumType = StyleToEnum(type);
290         return new TypedObject(enumType, CreateObjectFromType(enumType, id));
291     }
292
293     private SwingViewObject CreateObjectFromType(UielementType type, String id) {
294         switch (type) {
295         case CheckBox:
296             SwingScilabCheckBox checkBox = new SwingScilabCheckBox();
297             checkBox.setId(id);
298             setDefaultProperties(checkBox, id);
299             return checkBox;
300         case Console:
301             Console console = (Console) GraphicController.getController().getObjectFromId(id);
302             if (console.getScilabMode() == Console.ScilabMode.STD) {
303                 WindowsConfigurationManager.restoreUUID(NULLUUID);
304                 SwingScilabConsole sciConsole = ((SwingScilabConsole) ScilabConsole.getConsole().getAsSimpleConsole());
305                 SwingScilabTab consoleTab = (SwingScilabTab) sciConsole.getParent();
306                 consoleTab.setId(id);
307                 return consoleTab;
308             } else {
309                 return null;
310             }
311         case Edit:
312             SwingScilabEditBox edit = new SwingScilabEditBox();
313             edit.setId(id);
314             setDefaultProperties(edit, id);
315             return edit;
316         case Figure:
317             Figure figure = (Figure) GraphicController.getController().getObjectFromId(id);
318             String figureTitle = figure.getName();
319             Integer figureId = figure.getId();
320             if ((figureTitle != null) && (figureId != null)) {
321                 figureTitle = figureTitle.replaceFirst("%d", figureId.toString());
322             }
323
324             SwingScilabWindow window = new SwingScilabWindow();
325
326             window.setTitle(figureTitle);
327             /* TOOLBAR */
328             ToolBar toolBar = ToolBarBuilder.buildToolBar(SwingScilabTab.GRAPHICS_TOOLBAR_DESCRIPTOR, figureId);
329             /* INFOBAR */
330             TextBox infoBar = ScilabTextBox.createTextBox();
331
332             SwingScilabTab tab = new SwingScilabTab(figureTitle, figureId, figure);
333             tab.setId(id);
334
335             tab.setMenuBar(ScilabMenuBar.createMenuBar());
336             tab.setToolBar(toolBar);
337             tab.setInfoBar(ScilabTextBox.createTextBox());
338             window.addMenuBar(tab.getMenuBar());
339             window.addToolBar(tab.getToolBar());
340             window.addInfoBar(tab.getInfoBar());
341
342             tab.setWindowIcon("graphic-window");
343
344             tab.setParentWindowId(window.getId());
345
346             DockingManager.dock(tab, window.getDockingPort());
347             ActiveDockableTracker.requestDockableActivation(tab);
348
349             window.setVisible(true);
350             tab.setVisible(true);
351             tab.setName(figureTitle);
352
353             String infoMessage = figure.getInfoMessage();
354             if ((infoMessage == null) || (infoMessage.length() == 0)) {
355                 infoBar.setText("");
356             } else {
357                 infoBar.setText(infoMessage);
358             }
359             tab.update(__GO_SIZE__, (Integer[]) GraphicController.getController().getProperty(id, __GO_SIZE__));
360             tab.update(__GO_POSITION__, (Integer[]) GraphicController.getController().getProperty(id, __GO_POSITION__));
361             tab.update(__GO_AXES_SIZE__, (Integer[]) GraphicController.getController().getProperty(id, __GO_AXES_SIZE__));
362             // TODO set other default properties
363             return tab;
364         case Frame:
365             SwingScilabFrame frame = new SwingScilabFrame();
366             frame.setId(id);
367             setDefaultProperties(frame, id);
368             return frame;
369         case Image:
370             SwingScilabUiImage image = new SwingScilabUiImage();
371             image.setId(id);
372             return image;
373         case ListBox:
374             SwingScilabListBox listBox = new SwingScilabListBox();
375             listBox.setId(id);
376             return listBox;
377         case PopupMenu:
378             SwingScilabPopupMenu popupMenu = new SwingScilabPopupMenu();
379             popupMenu.setId(id);
380             setDefaultProperties(popupMenu, id);
381             return popupMenu;
382         case Progressbar:
383             SwingScilabWaitBar progressbar = new SwingScilabWaitBar();
384             progressbar.setIndeterminateMode(true);
385             progressbar.setId(id);
386             return progressbar;
387         case PushButton:
388             SwingScilabPushButton pushButton = new SwingScilabPushButton();
389             pushButton.setId(id);
390             setDefaultProperties(pushButton, id);
391             return pushButton;
392         case RadioButton:
393             SwingScilabRadioButton radioButton = new SwingScilabRadioButton();
394             radioButton.setId(id);
395             setDefaultProperties(radioButton, id);
396             return radioButton;
397         case Slider:
398             SwingScilabSlider slider = new SwingScilabSlider();
399             slider.setId(id);
400             setDefaultProperties(slider, id);
401             return slider;
402         case Table:
403             SwingScilabUiTable table = new SwingScilabUiTable();
404             table.setId(id);
405             return table;
406         case Text:
407             SwingScilabLabel text = new SwingScilabLabel();
408             text.setId(id);
409             setDefaultProperties(text, id);
410             return text;
411         case Uimenu:
412             throw new UnsupportedOperationException();
413         case UiParentMenu: /* SwingView internal type */
414             SwingScilabMenu parentMenu = new SwingScilabMenu();
415             parentMenu.setId(id);
416             setMenuDefaultProperties(parentMenu, id);
417             return parentMenu;
418         case UiChildMenu: /* SwingView internal type */
419             SwingScilabMenuItem childMenu = new SwingScilabMenuItem();
420             childMenu.setId(id);
421             setMenuDefaultProperties(childMenu, id);
422             return childMenu;
423         case UiCheckedMenu: /* SwingView internal type */
424             SwingScilabCheckBoxMenuItem checkedMenu = new SwingScilabCheckBoxMenuItem(false);
425             checkedMenu.setId(id);
426             setMenuDefaultProperties(checkedMenu, id);
427             return checkedMenu;
428         case UiContextMenu:
429             SwingScilabContextMenu contextMenu = new SwingScilabContextMenu();
430             contextMenu.setId(id);
431             return contextMenu;
432         case Waitbar:
433             SwingScilabWaitBar waitbar = new SwingScilabWaitBar();
434             waitbar.setIndeterminateMode(false);
435             waitbar.setId(id);
436             return waitbar;
437         default:
438             return null;
439         }
440     }
441
442     /**
443      * Initialize all poperties according to model
444      * @param uiMenuObject the uimenu
445      * @param id the uimenu id
446      */
447     private void setMenuDefaultProperties(Widget uiMenuObject, String id) {
448         SwingViewMenu.update(uiMenuObject, __GO_CHILDREN__,
449                              (String[]) GraphicController.getController().getProperty(id, __GO_CHILDREN__));
450         SwingViewMenu.update(uiMenuObject, __GO_CALLBACK__,
451                              (String) GraphicController.getController().getProperty(id, __GO_CALLBACK__));
452         SwingViewMenu.update(uiMenuObject, __GO_CALLBACKTYPE__,
453                              (Integer) GraphicController.getController().getProperty(id, __GO_CALLBACKTYPE__));
454         SwingViewMenu.update(uiMenuObject, __GO_UI_CHECKED__,
455                              (Boolean) GraphicController.getController().getProperty(id, __GO_UI_CHECKED__));
456         SwingViewMenu.update(uiMenuObject, __GO_UI_ENABLE__,
457                              (Boolean) GraphicController.getController().getProperty(id, __GO_UI_ENABLE__));
458         SwingViewMenu.update(uiMenuObject, __GO_UI_FOREGROUNDCOLOR__,
459                              (Double[]) GraphicController.getController().getProperty(id, __GO_UI_FOREGROUNDCOLOR__));
460         SwingViewMenu.update(uiMenuObject, __GO_UI_LABEL__,
461                              (String) GraphicController.getController().getProperty(id, __GO_UI_LABEL__));
462         SwingViewMenu.update(uiMenuObject, __GO_UI_ICON__,
463                              (String) GraphicController.getController().getProperty(id, __GO_UI_ICON__));
464     }
465
466     /**
467      * Initialize all poperties according to model
468      * @param uiControlObject the uicontrol
469      * @param id the uicontrol id
470      */
471     private void setDefaultProperties(Widget uiControlObject, String id) {
472         SwingViewWidget.update(uiControlObject, __GO_UI_BACKGROUNDCOLOR__,
473                                (Double[]) GraphicController.getController().getProperty(id, __GO_UI_BACKGROUNDCOLOR__));
474         SwingViewWidget.update(uiControlObject, __GO_UI_ENABLE__,
475                                (Boolean) GraphicController.getController().getProperty(id, __GO_UI_ENABLE__));
476         SwingViewWidget.update(uiControlObject, __GO_UI_ENABLE__,
477                                (Boolean) GraphicController.getController().getProperty(id, __GO_UI_ENABLE__));
478         SwingViewWidget.update(uiControlObject, __GO_UI_FONTANGLE__,
479                                (String) GraphicController.getController().getProperty(id, __GO_UI_FONTANGLE__));
480         SwingViewWidget.update(uiControlObject, __GO_UI_FONTNAME__,
481                                (String) GraphicController.getController().getProperty(id, __GO_UI_FONTNAME__));
482         SwingViewWidget.update(uiControlObject, __GO_UI_FONTSIZE__,
483                                (Double) GraphicController.getController().getProperty(id, __GO_UI_FONTSIZE__));
484         SwingViewWidget.update(uiControlObject, __GO_UI_FONTWEIGHT__,
485                                (String) GraphicController.getController().getProperty(id, __GO_UI_FONTWEIGHT__));
486         SwingViewWidget.update(uiControlObject, __GO_UI_FOREGROUNDCOLOR__,
487                                (Double[]) GraphicController.getController().getProperty(id, __GO_UI_FOREGROUNDCOLOR__));
488         SwingViewWidget.update(uiControlObject, __GO_UI_HORIZONTALALIGNMENT__,
489                                (String) GraphicController.getController().getProperty(id, __GO_UI_HORIZONTALALIGNMENT__));
490         SwingViewWidget.update(uiControlObject, __GO_UI_RELIEF__,
491                                (String) GraphicController.getController().getProperty(id, __GO_UI_RELIEF__));
492         SwingViewWidget.update(uiControlObject, __GO_UI_STRING__,
493                                (String[]) GraphicController.getController().getProperty(id, __GO_UI_STRING__));
494         SwingViewWidget.update(uiControlObject, __GO_UI_VERTICALALIGNMENT__,
495                                (String) GraphicController.getController().getProperty(id, __GO_UI_VERTICALALIGNMENT__));
496         SwingViewWidget.update(uiControlObject, __GO_POSITION__,
497                                (Double[]) GraphicController.getController().getProperty(id, __GO_POSITION__));
498         SwingViewWidget.update(uiControlObject, __GO_VISIBLE__,
499                                (Boolean) GraphicController.getController().getProperty(id, __GO_VISIBLE__));
500     }
501
502     @Override
503     public void deleteObject(String id) {
504         TypedObject requestedObject = allObjects.get(id);
505         if (requestedObject != null) {
506             switch (requestedObject.getType()) {
507             case Figure:
508                 SwingScilabTab tab = (SwingScilabTab) requestedObject.getValue();
509                 DockingManager.close(tab);
510                 DockingManager.unregisterDockable((Dockable) tab);
511                 tab.close();
512                 break;
513             case Progressbar:
514             case Waitbar:
515                 SwingScilabWaitBar bar = (SwingScilabWaitBar) requestedObject.getValue();
516                 bar.close();
517                 break;
518             default:
519                 // Nothing to do
520                 // uicontrol case: the object is destroyed when its parent updates its children
521                 break;
522             }
523         }
524     }
525
526     @Override
527     public void updateObject(String id, String property) {
528         TypedObject registeredObject = allObjects.get(id);
529         DEBUG("SwingView", "Update" + property);
530
531         /* On uicontrol style is set after object creation */
532         if (registeredObject == null && property.equals(__GO_STYLE__)) {
533             String style = (String) GraphicController.getController().getProperty(id, __GO_STYLE__);
534             allObjects.put(id, CreateObjectFromType(style, id));
535         }
536
537         /* Children list update */
538         if (registeredObject != null && property.equals(__GO_CHILDREN__)) {
539             String[] newChildren = (String[]) GraphicController.getController().getProperty(id, __GO_CHILDREN__);
540             String type = (String) GraphicController.getController().getProperty(id, __GO_TYPE__);
541
542             /*
543              * FIGURE CHILDREN UPDATE
544              */
545             if (type.equals(__GO_FIGURE__)) {
546                 updateFigureChildren(id, newChildren);
547             }
548
549             /*
550              * CONSOLE CHILDREN UPDATE
551              */
552             if (type.equals(__GO_CONSOLE__)) {
553                 updateConsoleChildren(id, newChildren);
554             }
555
556             /*
557              * MENU CHILDREN UPDATE
558              */
559             if (type.equals(__GO_UIMENU__)) {
560                 updateMenuChildren(id, newChildren);
561             }
562
563             /*
564              * CONTEXTMENU CHILDREN UPDATE
565              */
566             if (type.equals(__GO_UICONTEXTMENU__)) {
567                 updateContextMenuChildren(id, newChildren);
568             }
569         }
570
571         /*
572          * When the CHECKED property is updated for a UIMENU,
573          * the object is converted to a SwingScilabCheckBoxMenuItem is not already of this type
574          */
575         if (registeredObject != null && property.equals(__GO_UI_CHECKED__)) {
576             String type = (String) GraphicController.getController().getProperty(id, __GO_TYPE__);
577             if (type.equals(__GO_UIMENU__)) {
578                 TypedObject updatedObject = allObjects.get(id);
579                 switch (updatedObject.getType()) {
580                 case UiParentMenu:
581                     allObjects.put(id, CreateObjectFromType(__GO_UICHECKEDMENU__, id));
582                     registeredObject = allObjects.get(id);
583                     break;
584                 case UiChildMenu:
585                     String parentId = (String) GraphicController.getController().getProperty(id, __GO_PARENT__);
586                     int index = ((SwingScilabMenu) allObjects.get(parentId).getValue())
587                         .getComponentZOrder((SwingScilabMenuItem) allObjects.get(id).getValue());
588                     ((SwingScilabMenu) allObjects.get(parentId).getValue()).remove((SwingScilabMenuItem) allObjects.get(id).getValue());
589                     allObjects.put(id, CreateObjectFromType(__GO_UICHECKEDMENU__, id));
590                     registeredObject = allObjects.get(id);
591                     ((SwingScilabMenu) allObjects.get(parentId).getValue()).add((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue(), index);
592                     return;
593                 default:
594                     break;
595                 }
596             }
597         }
598
599         /*
600          * When the SEPARATOR property is updated for a UIMENU,
601          * When the property is set to TRUE: A separator is added if not already done
602          * When the property is set to FALSE: The previous separator is removed if it exists
603          */
604         if (registeredObject != null && property.equals(__GO_UI_SEPARATOR__)) {
605             String type = (String) GraphicController.getController().getProperty(id, __GO_TYPE__);
606             if (type.equals(__GO_UIMENU__)) {
607                 String parentId = (String) GraphicController.getController().getProperty(id, __GO_PARENT__);
608                 int menuPosition = -1;
609                 Component[] allChildren =  ((SwingScilabMenu) allObjects.get(parentId).getValue()).getMenuComponents();
610                 for (int kChild = 0; kChild < allChildren.length; kChild++) {
611                     if (allChildren[kChild] == (Component) allObjects.get(id).getValue()) {
612                         menuPosition = kChild;
613                         break;
614                     }
615                 }
616                 if (menuPosition < 0) {
617                     return;
618                 }
619                 boolean newSeparatorMode = (Boolean) GraphicController.getController().getProperty(id, __GO_UI_SEPARATOR__);
620                 if (newSeparatorMode) { // Add a separator above the menu
621                     ((SwingScilabMenu) allObjects.get(parentId).getValue()).insertSeparator(menuPosition);
622                 } else { // Remove the separator above the menu (if there is one)
623                     if (menuPosition == 0) { // There is no object above the menu
624                         return;
625                     }
626                     if (((SwingScilabMenu) allObjects.get(parentId).getValue()).getComponent(menuPosition - 1) instanceof JSeparator) {
627                         ((SwingScilabMenu) allObjects.get(parentId).getValue()).remove(menuPosition - 1);
628                     }
629                 }
630             }
631         }
632
633         if (registeredObject != null) {
634             SwingViewObject swingObject = registeredObject.getValue();
635             if (swingObject != null) {
636                 swingObject.update(property, GraphicController.getController().getProperty(id, property));
637             }
638         }
639     }
640
641     /**
642      * Update the figure children (called by generic updateObject method)
643      * @param id the id of the figure
644      * @param newChildren the new children IDs list
645      */
646     private void updateFigureChildren(String id, String[] newChildren) {
647         TypedObject updatedObject = allObjects.get(id);
648         Container updatedComponent = (SwingScilabTab) updatedObject.getValue();
649         boolean needRevalidate = false;
650
651         // Add new children
652         for (String childId : newChildren) {
653             if (!updatedObject.hasChild(childId)) {
654
655                 // Add the child
656                 updatedObject.addChild(childId);
657
658                 String childType = (String) GraphicController.getController().getProperty(childId, __GO_TYPE__);
659
660                 /* Add an uicontrol */
661                 if (childType.equals(__GO_UICONTROL__)) {
662                     ((SwingScilabTab) updatedComponent).addMember(allObjects.get(childId).getValue());
663                     needRevalidate = true;
664                 }
665
666                 /* Add an uimenu */
667                 if (childType.equals(__GO_UIMENU__)) {
668                     TypedObject childAsTypedObject = allObjects.get(childId);
669                     switch (childAsTypedObject.getType()) {
670                     case UiChildMenu:
671                     case UiCheckedMenu:
672                         allObjects.put(childId, CreateObjectFromType(__GO_UIPARENTMENU__, childId));
673                         ((Container) ((SwingScilabTab) updatedComponent).getMenuBar().getAsSimpleMenuBar()).add((SwingScilabMenu) allObjects.get(childId).getValue());
674                         break;
675                     default: /* UiParentMenu */
676                         ((Container) ((SwingScilabTab) updatedComponent).getMenuBar().getAsSimpleMenuBar()).add((SwingScilabMenu) allObjects.get(childId).getValue());
677                         break;
678                     }
679                     needRevalidate = true;
680                 }
681             }
682         }
683
684         // Remove children which have been deleted
685         Set<String> newChildrenSet = new HashSet<String>(Arrays.asList(newChildren));
686         // Clone the children set to avoid concurrent accesses
687         String[] oldChildrenSet = (String[]) updatedObject.getChildren().toArray(new String[updatedObject.getChildren().size()]);
688         for (String childId : oldChildrenSet) {
689             if (!newChildrenSet.contains(childId)) {
690
691                 // Remove the child
692                 updatedObject.removeChild(childId);
693
694                 String childType = (String) GraphicController.getController().getProperty(childId, __GO_TYPE__);
695
696                 /* Remove an uicontrol */
697                 if (childType.equals(__GO_UICONTROL__)) {
698                     updatedComponent.remove((Component) allObjects.get(childId).getValue());
699                     needRevalidate = true;
700                 }
701
702                 /* Remove an uimenu */
703                 if (childType.equals(__GO_UIMENU__)) {
704                     ((Container) ((SwingScilabTab) updatedComponent).getMenuBar().getAsSimpleMenuBar()).remove((SwingScilabMenu) allObjects.get(childId).getValue());
705                     needRevalidate = true;
706                 }
707             }
708         }
709         if (needRevalidate && updatedComponent != null) {
710             ((View) updatedComponent).revalidate();
711         }
712     }
713
714     /**
715      * Update the Console menus (called by generic updateObject method)
716      * @param id the id of the console object
717      * @param newChildren the new children IDs list
718      */
719     private void updateConsoleChildren(String id, String[] newChildren) {
720         TypedObject updatedObject = allObjects.get(id);
721         Container updatedComponent = (SwingScilabTab) updatedObject.getValue();
722         boolean needRevalidate = false;
723
724         // Add new children
725         for (String childId : newChildren) {
726             if (!updatedObject.hasChild(childId)) {
727
728                 // Add the child
729                 updatedObject.addChild(childId);
730
731                 String childType = (String) GraphicController.getController().getProperty(childId, __GO_TYPE__);
732
733                 if (childType.equals(__GO_UIMENU__)) {
734                     TypedObject childAsTypedObject = allObjects.get(childId);
735                     switch (childAsTypedObject.getType()) {
736                     case UiChildMenu:
737                     case UiCheckedMenu:
738                         allObjects.put(childId, CreateObjectFromType(__GO_UIPARENTMENU__, childId));
739                         ((Container) ((SwingScilabTab) updatedObject.getValue()).getMenuBar().getAsSimpleMenuBar()).add((SwingScilabMenu) allObjects.get(childId).getValue());
740                         break;
741                     default: /* UiParentMenu */
742                         ((Container) ((SwingScilabTab) updatedObject.getValue()).getMenuBar().getAsSimpleMenuBar()).add((SwingScilabMenu) allObjects.get(childId).getValue());
743                         break;
744                     }
745                     needRevalidate = true;
746                 }
747             }
748         }
749
750         // Remove children which have been deleted
751         Set<String> newChildrenSet = new HashSet<String>(Arrays.asList(newChildren));
752         Object[] updatedObjectChildren = updatedObject.getChildren().toArray();
753         for (int i = 0 ; i < updatedObjectChildren.length ; ++i) {
754             String childId = (String) updatedObjectChildren[i];
755             if (!newChildrenSet.contains(childId)) {
756
757                 // Remove the child
758                 updatedObject.removeChild(childId);
759
760                 String childType = (String) GraphicController.getController().getProperty(childId, __GO_TYPE__);
761
762                 if (childType.equals(__GO_UIMENU__)) {
763                     ((Container) ((SwingScilabTab) allObjects.get(id).getValue()).getMenuBar().getAsSimpleMenuBar()).remove((SwingScilabMenu) allObjects.get(childId).getValue());
764                     needRevalidate = true;
765                 }
766             }
767         }
768         if (needRevalidate && updatedComponent != null) {
769             updatedComponent.validate();
770         }
771
772     }
773
774     /**
775      * Update the children of a menu menus (called by generic updateObject method)
776      * @param id the id of the menu object
777      * @param newChildren the new children IDs list
778      */
779     private void updateMenuChildren(String id, String[] newChildren) {
780         TypedObject updatedObject = allObjects.get(id);
781         Container updatedComponent = null;
782         boolean needRevalidate = false;
783         String parentId = null;
784         int updatedObjectPosition = 0;
785
786         // Add new children
787         for (String childId : newChildren) {
788             String childType = (String) GraphicController.getController().getProperty(childId, __GO_TYPE__);
789             if (childType.equals(__GO_UIMENU__)) {
790                 if (!updatedObject.hasChild(childId)) {
791
792                     // Add the child
793                     updatedObject.addChild(childId);
794
795                     TypedObject childAsTypedObject = allObjects.get(childId);
796                     Object addedChild = allObjects.get(childId).getValue();
797                     parentId = (String) GraphicController.getController().getProperty(id, __GO_PARENT__);
798                     JComponent parent = (JComponent) allObjects.get(parentId).getValue();
799                     switch (updatedObject.getType()) {
800                     case UiChildMenu:
801                         updatedComponent = (SwingScilabMenuItem) updatedObject.getValue();
802                         switch (childAsTypedObject.getType()) {
803                         case UiChildMenu:
804                             /* Replace the item by a parent menu */
805                             updatedObjectPosition = parent.getComponentZOrder((SwingScilabMenuItem) allObjects.get(id).getValue());
806                             parent.remove((SwingScilabMenuItem) allObjects.get(id).getValue());
807                             allObjects.put(id, CreateObjectFromType(__GO_UIPARENTMENU__, id));
808                             parent.add((SwingScilabMenu) allObjects.get(id).getValue(), updatedObjectPosition);
809                             /* Update the created menu */
810                             ((SwingScilabMenu) allObjects.get(id).getValue()).add((SwingScilabMenuItem) addedChild);
811                             break;
812                         case UiCheckedMenu:
813                             /* Replace the item by a parent menu */
814                             updatedObjectPosition = parent.getComponentZOrder((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue());
815                             parent.remove((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue());
816                             allObjects.put(id, CreateObjectFromType(__GO_UIPARENTMENU__, id));
817                             parent.add((SwingScilabMenu) allObjects.get(id).getValue(), updatedObjectPosition);
818                             /* Update the created menu */
819                             ((SwingScilabMenu) allObjects.get(id).getValue()).add((SwingScilabCheckBoxMenuItem) addedChild);
820                             break;
821                         default: /* UiParentMenu */
822                             ((SwingScilabMenu) allObjects.get(id).getValue()).add((SwingScilabMenu) addedChild);
823                             break;
824                         }
825                         break;
826                     case UiCheckedMenu:
827                         updatedComponent = (SwingScilabCheckBoxMenuItem) updatedObject.getValue();
828                         switch (childAsTypedObject.getType()) {
829                         case UiChildMenu:
830                             /* Replace the item by a parent menu */
831                             updatedObjectPosition = parent.getComponentZOrder((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue());
832                             parent.remove((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue());
833                             allObjects.put(id, CreateObjectFromType(__GO_UIPARENTMENU__, id));
834                             parent.add((SwingScilabMenu) allObjects.get(id).getValue(), updatedObjectPosition);
835                             /* Update the created menu */
836                             ((SwingScilabMenu) allObjects.get(id).getValue()).add((SwingScilabMenuItem) allObjects.get(childId).getValue());
837                             break;
838                         case UiCheckedMenu:
839                             /* Replace the item by a parent menu */
840                             updatedObjectPosition = parent.getComponentZOrder((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue());
841                             parent.remove((SwingScilabCheckBoxMenuItem) allObjects.get(id).getValue());
842                             allObjects.put(id, CreateObjectFromType(__GO_UIPARENTMENU__, id));
843                             parent.add((SwingScilabMenu) allObjects.get(id).getValue(), updatedObjectPosition);
844                             /* Update the created menu */
845                             ((SwingScilabMenu) allObjects.get(id).getValue()).add((SwingScilabCheckBoxMenuItem) allObjects.get(childId).getValue());
846                             break;
847                         default: /* UiParentMenu */
848                             ((SwingScilabMenu) allObjects.get(id).getValue()).add((SwingScilabMenu) allObjects.get(childId).getValue());
849                             break;
850                         }
851                         break;
852                     default: /* UiParentMenu */
853                         SwingScilabMenu updatedMenu = (SwingScilabMenu) updatedObject.getValue();
854                         updatedComponent = updatedMenu;
855                         switch (childAsTypedObject.getType()) {
856                         case UiChildMenu:
857                             updatedMenu.add((SwingScilabMenuItem) allObjects.get(childId).getValue());
858                             break;
859                         case UiCheckedMenu:
860                             updatedMenu.add((SwingScilabCheckBoxMenuItem) allObjects.get(childId).getValue());
861                             break;
862                         default: /* UiParentMenu */
863                             updatedMenu.add((SwingScilabMenu) allObjects.get(childId).getValue());
864                             break;
865                         }
866                         break;
867                     }
868                     needRevalidate = true;
869                 }
870             }
871         }
872         // Remove children which have been deleted
873         Set<String> newChildrenSet = new HashSet<String>(Arrays.asList(newChildren));
874         for (String childId : updatedObject.getChildren()) {
875             if (!newChildrenSet.contains(childId)) {
876                 // Remove the child
877                 updatedObject.removeChild(childId);
878                 updatedComponent = (SwingScilabMenu) updatedObject.getValue();
879
880                 TypedObject childAsTypedObject = allObjects.get(childId);
881                 SwingScilabMenu updatedMenu = (SwingScilabMenu) allObjects.get(id).getValue();
882                 Object removedMenu = allObjects.get(childId).getValue();
883
884                 switch (childAsTypedObject.getType()) {
885                 case UiChildMenu:
886                     updatedMenu.remove((SwingScilabMenuItem) removedMenu);
887                     break;
888                 case UiCheckedMenu:
889                     updatedMenu.remove((SwingScilabCheckBoxMenuItem) removedMenu);
890                     break;
891                 default:
892                     updatedMenu.remove((SwingScilabMenu) removedMenu);
893                     break;
894                 }
895                 needRevalidate = true;
896             }
897         }
898         if (needRevalidate && updatedComponent != null) {
899             updatedComponent.validate();
900         }
901     }
902     /**
903      * Update the children of a contextmenu (called by generic updateObject method)
904      * @param id the id of the contextmenu object
905      * @param newChildren the new children IDs list
906      */
907     private void updateContextMenuChildren(String id, String[] newChildren) {
908         TypedObject updatedObject = allObjects.get(id);
909         Container updatedComponent = null;
910         boolean needRevalidate = false;
911
912         // Add new children
913         for (String childId : newChildren) {
914             String childType = (String) GraphicController.getController().getProperty(childId, __GO_TYPE__);
915             if (childType.equals(__GO_UIMENU__)) {
916                 if (!updatedObject.hasChild(childId)) {
917
918                     // Add the child
919                     updatedObject.addChild(childId);
920
921                     TypedObject childAsTypedObject = allObjects.get(childId);
922                     SwingScilabContextMenu updatedMenu = (SwingScilabContextMenu) updatedObject.getValue();
923                     updatedComponent = updatedMenu;
924                     switch (childAsTypedObject.getType()) {
925                     case UiChildMenu:
926                         updatedMenu.add((SwingScilabMenuItem) allObjects.get(childId).getValue());
927                         break;
928                     case UiCheckedMenu:
929                         updatedMenu.add((SwingScilabCheckBoxMenuItem) allObjects.get(childId).getValue());
930                         break;
931                     default: /* UiParentMenu */
932                         updatedMenu.add((SwingScilabMenu) allObjects.get(childId).getValue());
933                         break;
934                     }
935                     needRevalidate = true;
936                 }
937             }
938         }
939         // Remove children which have been deleted
940         Set<String> newChildrenSet = new HashSet<String>(Arrays.asList(newChildren));
941         for (String childId : updatedObject.getChildren()) {
942             if (!newChildrenSet.contains(childId)) {
943                 // Remove the child
944                 updatedObject.removeChild(childId);
945                 updatedComponent = (SwingScilabMenu) updatedObject.getValue();
946
947                 TypedObject childAsTypedObject = allObjects.get(childId);
948                 SwingScilabContextMenu updatedMenu = (SwingScilabContextMenu) allObjects.get(id).getValue();
949                 Object removedMenu = allObjects.get(childId).getValue();
950
951                 switch (childAsTypedObject.getType()) {
952                 case UiChildMenu:
953                     updatedMenu.remove((SwingScilabMenuItem) removedMenu);
954                     break;
955                 case UiCheckedMenu:
956                     updatedMenu.remove((SwingScilabCheckBoxMenuItem) removedMenu);
957                     break;
958                 default:
959                     updatedMenu.remove((SwingScilabMenu) removedMenu);
960                     break;
961                 }
962                 needRevalidate = true;
963             }
964         }
965         if (needRevalidate && updatedComponent != null) {
966             updatedComponent.validate();
967         }
968     }
969 }