package com.csa.lgantt;
import java.awt.event.ActionListener;
import java.util.Hashtable;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
/**
* Generador de menues.
* TODO: Convertirlo en una clase dinamica.... mas adelante.
*
* @author csilva
*/
public class MenuBuilder {
private static ResourceBundle bundle = ResourceBundle.getBundle("com.csa.lgantt.Menues");
/**
* Crea la barra de menues de acuerdo al contenido de
* una propiedad.
*
* @param listener avisar los mensajes de los menues
* @return JMenuBar with the items configured and the listeners asociated with this object
*/
public static JMenuBar buildMenuBar(ActionListener listener, String menuName, Hashtable menues) {
JMenuBar menuBar = new JMenuBar();
menuBar.setOpaque(true);
String menuConfig = bundle.getString(menuName);
StringTokenizer st = new StringTokenizer(menuConfig, " ");
while (st.hasMoreTokens()) {
String menuId = st.nextToken();
JMenu menu = new JMenu(menuId);
String menuDesc = bundle.getString("desc." + menuId);
StringTokenizer dt = new StringTokenizer(menuDesc, "|");
menu.setText(dt.nextToken());
menu.setMnemonic(dt.nextToken().charAt(0));
buildMenues(listener, menuId, menu, menues);
menuBar.add(menu);
}
return menuBar;
}
/**
* Construye los items de un menu pulldown.
* El menu se obtiene de:
* <pre>
* menu.<i>menuId</i>= item1 item2
* desc.item1 = <i>Text</i>|<i>mnemonic</i>[|<i>accelerator keystroke</i>]
* </pre>
* @param listener listener a asociar
* @param bundle bundle con la descripcion del menu
* @param menuId Id del menu
* @param menu Menu desde el cual se colgaran los items
*/
static private void buildMenues(
ActionListener listener,
String menuId,
JMenu menu, Hashtable menues) {
String sub = bundle.getString("menu." + menuId);
StringTokenizer mt = new StringTokenizer(sub, " ");
while (mt.hasMoreTokens()) {
String itemId = mt.nextToken();
if ("-".equals(itemId)) {
menu.addSeparator();
continue;
}
// items
String itemDesc = bundle.getString("desc." + itemId);
StringTokenizer smt = new StringTokenizer(itemDesc, "|");
JMenuItem mi = new JMenuItem(itemId);
mi.setActionCommand(itemId);
mi.setText(smt.nextToken());
mi.setMnemonic(smt.nextToken().charAt(0));
if (smt.hasMoreElements())
mi.setAccelerator(KeyStroke.getKeyStroke(smt.nextToken()));
mi.addActionListener(listener);
menu.add(mi);
menues.put(itemId, mi);
}
}
/**
* Construye los items de un menu popup.
* El menu se obtiene desde un archivo de propiedades: jgantt.MainMenu
* <pre>
* menu.<i>menuId</i>= item1 item2
* desc.item1 = <i>Text</i>|<i>mnemonic</i>[|<i>accelerator keystroke</i>]
* </pre>
* @param listener listener a asociar
* @param bundle bundle con la descripcion del menu
* @param menuId Id del menu
* @param menu Menu desde el cual se colgaran los items
*/
public static JPopupMenu buildPopup(ActionListener listener, String menuId) {
JPopupMenu popup = new JPopupMenu("popup");
String sub = bundle.getString("menu." + menuId);
StringTokenizer mt = new StringTokenizer(sub, " ");
while (mt.hasMoreTokens()) {
String itemId = mt.nextToken();
if ("-".equals(itemId)) {
popup.addSeparator();
continue;
}
// items
String itemDesc = bundle.getString("desc." + itemId);
StringTokenizer smt = new StringTokenizer(itemDesc, "|");
JMenuItem mi = new JMenuItem(itemId);
mi.setActionCommand(itemId);
mi.setText(smt.nextToken());
mi.setMnemonic(smt.nextToken().charAt(0));
if (smt.hasMoreElements())
mi.setAccelerator(KeyStroke.getKeyStroke(smt.nextToken()));
mi.addActionListener(listener);
popup.add(mi);
}
return popup;
}
}
|