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