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