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