d90c4c3eab197bb32df77589bc29e2fa6edd40b2
[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      * Get the element id for this menubar
67      * @return id the id of the corresponding menubar object
68      */
69     public int getElementId() {
70         return this.elementId;
71     }
72
73     /**
74      * Set the element id for this menubar
75      * @param id the id of the corresponding menubar object
76      */
77     public void setElementId(int id) {
78         this.elementId = id;
79     }
80
81     /**
82      * Enabale/Disable a menu giving its name
83      * @param menuName the name of the menu
84      * @param status true to enable the menu
85      */
86     public void setMenuEnabled(String menuName, boolean status) {
87
88         for (int menuIndex = 0; menuIndex < this.getMenuCount(); menuIndex++) {
89             // Check the name of each menu until one matches the name
90             if (this.getMenu(menuIndex).getText().equals(removeMnemonicFromName(menuName))) {
91                 Integer id = ((SwingScilabMenu) this.getMenu(menuIndex)).getId();
92                 GraphicController.getController().setProperty(id, __GO_UI_ENABLE__, status);
93                 break;
94             }
95         }
96
97     }
98
99     /**
100      * Disable a MenuItem of a Scilab root window giving its parent name and position
101      * @param parentMenuName the name of the parent menu
102      * @param menuItemPosition the name of the parent menu
103      * @param status true to set the menu enabled
104      */
105     public void setSubMenuEnabled(String parentMenuName, int menuItemPosition, boolean status) {
106         JMenu parentMenu = null;
107
108         for (int menuIndex = 0; menuIndex < this.getMenuCount(); menuIndex++) {
109             // Check the name of each menu until one matches the name
110             if (this.getMenu(menuIndex).getText().equals(removeMnemonicFromName(parentMenuName))) {
111                 parentMenu = this.getMenu(menuIndex);
112                 break;
113             }
114         }
115         if (parentMenu == null) { /* Parent does not exist */
116             return;
117         }
118         if ((menuItemPosition <= parentMenu.getItemCount()) & (menuItemPosition >= 1)) {
119             /* Java index begins at 0 and Scilab index begins at 1 */
120             if (parentMenu.getItem(menuItemPosition - 1) != null) {
121                 Integer id = ((SwingScilabMenuItem) parentMenu.getItem(menuItemPosition - 1)).getId();
122                 GraphicController.getController().setProperty(id, __GO_UI_ENABLE__, status);
123             }
124         }
125     }
126
127
128     /**
129      * Remove a menu giving its name
130      * @param menuName the name of the menu
131      */
132     public void removeMenu(String menuName) {
133         for (int menuIndex = 0; menuIndex < this.getMenuCount(); menuIndex++) {
134             // Check the name of each menu until one matches the name
135             if (this.getMenu(menuIndex).getText().equals(removeMnemonicFromName(menuName))) {
136                 this.getMenu(menuIndex).setVisible(false);
137                 Integer id = ((SwingScilabMenu) this.getMenu(menuIndex)).getId();
138                 GraphicController.getController().removeRelationShipAndDelete(id);
139                 break;
140             }
141         }
142
143     }
144
145     /**
146      * Remove Mnemonic & from name
147      * @param menuName the name of the menu
148      * @return the name without & used to set Mnemonics
149      */
150     private String removeMnemonicFromName(String menuName) {
151         String label = menuName;
152
153         // Try to set a mnemonic according to text (character preeceded by a &)
154         for (int charIndex = 0; charIndex < menuName.length(); charIndex++) {
155             if (menuName.charAt(charIndex) == '&') {
156
157                 boolean canBeAMnemonic = true;
158
159                 // Previous char must not be a &
160                 if ((charIndex != 0) && (menuName.charAt(charIndex - 1) == '&')) {
161                     canBeAMnemonic = false;
162                 }
163
164                 if ((charIndex + 1 < menuName.length()) && (canBeAMnemonic && menuName.charAt(charIndex + 1) != '&')) {
165                     // A mnemonic
166                     // Have to remove the & used to set a Mnemonic
167                     String firstPart = menuName.substring(0, Math.max(charIndex, 0)); // Before &
168                     String secondPart = menuName.substring(Math.min(charIndex + 1, menuName.length()), menuName.length());
169                     label = firstPart + secondPart;
170                     break;
171                 }
172
173             }
174         }
175
176         return label.replaceAll("&&", "&");
177     }
178
179     public void close() {
180         UIElementMapper.removeMapping(elementId);
181     }
182 }