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