package org.bonsai.dev;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
public class GameMenu extends GameComponent implements ActionListener {
private transient boolean active = false;
private transient JMenuBar menuBar = null;
private transient final Map<String, JMenu> menus = new HashMap<String, JMenu>();
private transient final Map<String, JMenuItem> menuItems = new HashMap<String, JMenuItem>();
private transient final Map<String, ButtonGroup> menuGroups = new HashMap<String, ButtonGroup>();
public GameMenu(final Game game, final boolean init, final boolean gameMenu) {
super(game);
if (init) {
active = true;
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
menuBar = new JMenuBar();
game.getFrame().setJMenuBar(menuBar);
if (gameMenu) {
add("Game");
addCheckItem("Game", "Pause", "pause");
addCheckItem("Game", "Double", "scale");
addCheckItem("Game", "Limit FPS", "limit");
select("scale", game.scale() == 2);
select("limit", game.isLimitFPS());
get("Game").addSeparator();
addItem("Game", "Exit", "exit");
}
}
}
public final int getSize() {
return active ? menuBar.getHeight() : 0;
}
public final void addRadioItem(final String menuID, final String name,
final String cmd, final String group) {
if (active) {
ButtonGroup bGroup;
if (menuGroups.containsKey(group)) {
bGroup = menuGroups.get(group);
} else {
bGroup = new ButtonGroup();
menuGroups.put(group, bGroup);
}
final JRadioButtonMenuItem item = new JRadioButtonMenuItem(name);
bGroup.add(item);
addItems(menuID, item, cmd);
}
}
public final void addCheckItem(final String menuID, final String name,
final String cmd) {
addItems(menuID, new JCheckBoxMenuItem(name), cmd);
}
public final void addItem(final String menuID, final String name,
final String cmd) {
addItems(menuID, new JMenuItem(name), cmd);
}
private void addItems(final String menuID, final JMenuItem item,
final String cmd) {
if (active) {
final JMenu menu = get(menuID);
if (menu != null && !menuItems.containsKey(cmd)) {
item.setActionCommand(cmd);
item.addActionListener(this);
menu.add(item);
menuItems.put(cmd, item);
}
}
}
public final void enable(final String menuID, final boolean enable) {
if (active) {
get(menuID).setEnabled(enable);
}
}
public final void enable(final boolean enable) {
if (active) {
for (JMenu menu : menus.values()) {
menu.setEnabled(enable);
}
}
}
public final JMenu add(final String name) {
JMenu menu = null;
if (active && !menus.containsKey(name)) {
menu = new JMenu(name);
menus.put(name, menu);
menuBar.add(menu);
menuBar.validate();
menu.setEnabled(false);
}
return menu;
}
public void remove(final String name) {
if (active && menus.containsKey(name)) {
menuBar.remove(menus.get(name));
menus.remove(name);
}
}
public final JMenu get(final String name) {
if (active && menus.containsKey(name)) {
return menus.get(name);
}
return null;
}
public final JMenuItem getItem(final String name) {
if (active && menuItems.containsKey(name)) {
return menuItems.get(name);
}
return null;
}
public final void select(final String name, final boolean selected) {
if (active) {
getItem(name).setSelected(selected);
}
}
public final void actionPerformed(final ActionEvent event) {
final String cmd = event.getActionCommand();
if ("exit".equals(cmd)) {
game.exitGame();
} else if ("pause".equals(cmd)) {
game.pause(!game.isPaused());
} else if ("scale".equals(cmd)) {
game.setScale(game.scale() == 1 ? 2 : 1);
} else if ("limit".equals(cmd)) {
game.setLimitFPS(!game.isLimitFPS());
} else {
game.onMenu(cmd);
}
}
}