// GuiMenu.java
package net.sf.gogui.gui;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke;
/** JMenu with additional features.
Supports marking the mnemonics in the label with a preceeding '&'
(like in Qt).
Checks the added menu items for unique mnemonics and prints a warning to
System.err if a mnemonic is used twice. */
public class GuiMenu
extends JMenu
{
public GuiMenu(String text)
{
GuiUtil.setTextAndMnemonic(this, text);
}
public JMenuItem add(JMenuItem item)
{
super.add(item);
item.setToolTipText(null);
item.setIcon(null);
int mnemonic = item.getMnemonic();
if (mnemonic > 0)
{
if (m_mnemonics.contains(mnemonic))
System.err.println("Warning: duplicate mnemonic item: "
+ item.getText());
m_mnemonics.add(mnemonic);
}
return item;
}
public JMenuItem add(GuiAction action)
{
JMenuItem item = new JMenuItem(action);
GuiUtil.setTextAndMnemonic(item, action.getNameWithMnemonic());
return add(item);
}
public JMenuItem addRadioItem(ButtonGroup group, GuiAction action)
{
JMenuItem item = new GuiRadioButtonMenuItem(action);
item.setIcon(null);
group.add(item);
return add(item);
}
public JMenuItem addCheckBoxItem(GuiAction action)
{
return add(new GuiCheckBoxMenuItem(action));
}
public void remove(JMenuItem item)
{
int mnemonic = item.getMnemonic();
if (mnemonic > 0)
m_mnemonics.remove(Integer.valueOf(mnemonic));
super.remove(item);
}
private final ArrayList<Integer> m_mnemonics = new ArrayList<Integer>();
}
/** Radio menu item with additional "selected" action property. */
class GuiRadioButtonMenuItem
extends JRadioButtonMenuItem
{
public GuiRadioButtonMenuItem(GuiAction action)
{
super(action);
action.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals("selected"))
setSelected(((Boolean)e.getNewValue()).booleanValue());
}
});
GuiUtil.setTextAndMnemonic(this, action.getNameWithMnemonic());
}
}
/** Checkbox item with additional "selected" action property. */
class GuiCheckBoxMenuItem
extends JCheckBoxMenuItem
{
public GuiCheckBoxMenuItem(GuiAction action)
{
super(action);
action.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals("selected"))
setSelected(((Boolean)e.getNewValue()).booleanValue());
}
});
GuiUtil.setTextAndMnemonic(this, action.getNameWithMnemonic());
}
}