Remove ToolBar/MenuBar from UIElementMapper
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / menubar / SwingScilabMenuBar.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Marouane BEN JELLOUL
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.gui.bridge.menubar;
14
15 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ENABLE__;
16
17 import java.awt.Container;
18
19 import javax.swing.JMenu;
20 import javax.swing.JMenuBar;
21
22 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
23 import org.scilab.modules.gui.bridge.menu.SwingScilabMenu;
24 import org.scilab.modules.gui.bridge.menuitem.SwingScilabMenuItem;
25 import org.scilab.modules.gui.menu.Menu;
26 import org.scilab.modules.gui.menubar.SimpleMenuBar;
27 import org.scilab.modules.gui.utils.UIElementMapper;
28
29 /**
30  * Swing implementation for Scilab MenuBars in GUIs
31  * @author Marouane BEN JELLOUL
32  */
33 public class SwingScilabMenuBar extends JMenuBar implements SimpleMenuBar {
34
35     private static final long serialVersionUID = 1L;
36
37     private int elementId;
38
39     /**
40      * Constructor
41      */
42     public SwingScilabMenuBar() {
43         super();
44     }
45
46     /**
47      * Append a Menu to a MenuBar
48      * @param newMenu the Menu to add to the MenuBar
49      * @see org.scilab.modules.gui.widget.MenuBar#add(org.scilab.modules.gui.widget.ContextMenu)
50      */
51     public void add(Menu newMenu) {
52         this.add((SwingScilabMenu) newMenu.getAsSimpleMenu());
53     }
54
55     /**
56      * Append a Menu to a MenuBar
57      * @param newMenu the Menu to add to the MenuBar
58      * @see org.scilab.modules.gui.widget.MenuBar#add(org.scilab.modules.gui.widget.ContextMenu)
59      */
60     public void add(SwingScilabMenu newMenu) {
61         //ScilabSwingUtilities.addToParent(newMenu, this);
62         ((Container) this).add(newMenu);
63     }
64
65     /**
66      * Enabale/Disable a menu giving its name
67      * @param menuName the name of the menu
68      * @param status true to enable the menu
69      */
70     public void setMenuEnabled(String menuName, boolean status) {
71
72         for (int menuIndex = 0; menuIndex < this.getMenuCount(); menuIndex++) {
73             // Check the name of each menu until one matches the name
74             if (this.getMenu(menuIndex).getText().equals(removeMnemonicFromName(menuName))) {
75                 Integer id = ((SwingScilabMenu) this.getMenu(menuIndex)).getId();
76                 GraphicController.getController().setProperty(id, __GO_UI_ENABLE__, status);
77                 break;
78             }
79         }
80
81     }
82
83     /**
84      * Disable a MenuItem of a Scilab root window giving its parent name and position
85      * @param parentMenuName the name of the parent menu
86      * @param menuItemPosition the name of the parent menu
87      * @param status true to set the menu enabled
88      */
89     public void setSubMenuEnabled(String parentMenuName, int menuItemPosition, boolean status) {
90         JMenu parentMenu = null;
91
92         for (int menuIndex = 0; menuIndex < this.getMenuCount(); menuIndex++) {
93             // Check the name of each menu until one matches the name
94             if (this.getMenu(menuIndex).getText().equals(removeMnemonicFromName(parentMenuName))) {
95                 parentMenu = this.getMenu(menuIndex);
96                 break;
97             }
98         }
99         if (parentMenu == null) { /* Parent does not exist */
100             return;
101         }
102         if ((menuItemPosition <= parentMenu.getItemCount()) & (menuItemPosition >= 1)) {
103             /* Java index begins at 0 and Scilab index begins at 1 */
104             if (parentMenu.getItem(menuItemPosition - 1) != null) {
105                 Integer id = ((SwingScilabMenuItem) parentMenu.getItem(menuItemPosition - 1)).getId();
106                 GraphicController.getController().setProperty(id, __GO_UI_ENABLE__, status);
107             }
108         }
109     }
110
111
112     /**
113      * Remove a menu giving its name
114      * @param menuName the name of the menu
115      */
116     public void removeMenu(String menuName) {
117         for (int menuIndex = 0; menuIndex < this.getMenuCount(); menuIndex++) {
118             // Check the name of each menu until one matches the name
119             if (this.getMenu(menuIndex).getText().equals(removeMnemonicFromName(menuName))) {
120                 this.getMenu(menuIndex).setVisible(false);
121                 Integer id = ((SwingScilabMenu) this.getMenu(menuIndex)).getId();
122                 GraphicController.getController().removeRelationShipAndDelete(id);
123                 break;
124             }
125         }
126
127     }
128
129     /**
130      * Remove Mnemonic & from name
131      * @param menuName the name of the menu
132      * @return the name without & used to set Mnemonics
133      */
134     private String removeMnemonicFromName(String menuName) {
135         String label = menuName;
136
137         // Try to set a mnemonic according to text (character preeceded by a &)
138         for (int charIndex = 0; charIndex < menuName.length(); charIndex++) {
139             if (menuName.charAt(charIndex) == '&') {
140
141                 boolean canBeAMnemonic = true;
142
143                 // Previous char must not be a &
144                 if ((charIndex != 0) && (menuName.charAt(charIndex - 1) == '&')) {
145                     canBeAMnemonic = false;
146                 }
147
148                 if ((charIndex + 1 < menuName.length()) && (canBeAMnemonic && menuName.charAt(charIndex + 1) != '&')) {
149                     // A mnemonic
150                     // Have to remove the & used to set a Mnemonic
151                     String firstPart = menuName.substring(0, Math.max(charIndex, 0)); // Before &
152                     String secondPart = menuName.substring(Math.min(charIndex + 1, menuName.length()), menuName.length());
153                     label = firstPart + secondPart;
154                     break;
155                 }
156
157             }
158         }
159
160         return label.replaceAll("&&", "&");
161     }
162
163     public void close() {
164         UIElementMapper.removeMapping(elementId);
165     }
166 }