package org.basex.gui;
import java.awt.Event;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import org.basex.gui.layout.BaseXButton;
import org.basex.util.Util;
import static org.basex.gui.GUIConstants.*;
/**
* This is the menu bar of the main window.
* The menu structure is defined in {@link GUIConstants#MENUBAR} and
* {@link GUIConstants#MENUITEMS}.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class GUIMenu extends JMenuBar {
/** Referenced menu items. */
private final JMenuItem[] items;
/** Reference to main window. */
private final GUI gui;
/**
* Initializes the menu bar.
* @param main reference to the main window
*/
GUIMenu(final GUI main) {
gui = main;
final String sm = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ==
Event.META_MASK ? "meta" : "ctrl";
// create menu for each top level menu entries
int c = 0;
for(int b = 0; b < MENUBAR.length; ++b) {
for(int i = 0; i < MENUITEMS[b].length; ++i) ++c;
}
items = new JMenuItem[c];
c = 0;
// loop through all menu entries
final StringBuilder gmnem = new StringBuilder();
for(int b = 0; b < MENUBAR.length; ++b) {
final JMenu menu = new JMenu(MENUBAR[b]);
BaseXButton.setMnemonic(menu, gmnem);
// create menu point for each sub menu entry
final StringBuilder mnem = new StringBuilder();
for(int i = 0; i < MENUITEMS[b].length; ++i) {
// add a separator
final GUICommand cmd = MENUITEMS[b][i];
if(cmd == GUICommand.EMPTY) {
menu.addSeparator();
} else if(cmd != null) {
// add a menu entry
final JMenuItem item = newItem(cmd, gui, mnem);
final String sc = cmd.key();
if(sc != null) {
item.setAccelerator(KeyStroke.getKeyStroke(Util.info(sc, sm)));
}
items[c++] = item;
menu.add(item);
}
}
add(menu);
}
}
/**
* Creates a new menu item.
* @param cmd command
* @param gui gui reference
* @param mnem assigned mnenomics
* @return menu item
*/
public static JMenuItem newItem(final GUICommand cmd, final GUI gui,
final StringBuilder mnem) {
final String desc = cmd.label();
final JMenuItem item = cmd.checked() ?
new JCheckBoxMenuItem(desc) : new JMenuItem(desc);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
cmd.execute(gui);
}
});
BaseXButton.setMnemonic(item, mnem);
item.setToolTipText(cmd.help());
return item;
}
/**
* Refreshes the menu items.
*/
void refresh() {
int c = 0;
for(int b = 0; b < MENUBAR.length; ++b) {
for(int i = 0; i < MENUITEMS[b].length; ++i) {
final GUICommand item = MENUITEMS[b][i];
if(item != GUICommand.EMPTY && item != null) {
item.refresh(gui, items[c++]);
}
}
}
}
}