//
// GUIFrame.java
//
/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/
package visad.util;
import java.awt.Toolkit;
import java.awt.event.*;
import java.lang.reflect.*;
import java.util.Hashtable;
import javax.swing.*;
/** A general-purpose frame for simplifing GUI construction and management. */
public class GUIFrame extends JFrame implements ActionListener {
/** key mask for use with keyboard shortcuts on this operating system */
public static final int MENU_MASK =
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
/** menu bar */
protected JMenuBar menubar;
/** hashtable */
protected Hashtable hash;
/** heavyweight flag */
protected boolean heavy;
/** constructs a GUIFrame */
public GUIFrame() {
this(false);
}
/** constructs a GUIFrame with light- or heavy-weight menus as specified */
public GUIFrame(boolean heavyweight) {
menubar = new JMenuBar();
setJMenuBar(menubar);
hash = new Hashtable();
heavy = heavyweight;
}
/** gets the JMenu corresponding to the given menu name */
public JMenu getMenu(String menu) {
// get menu from hashtable
JMenu m = (JMenu) hash.get(menu);
if (m == null) {
m = new JMenu(menu);
m.setMnemonic(menu.charAt(0));
m.getPopupMenu().setLightWeightPopupEnabled(!heavy);
menubar.add(m);
hash.put(menu, m);
}
return m;
}
/** gets the JMenuItem corresponding to the given menu and item name */
public JMenuItem getMenuItem(String menu, String item) {
// get menu item from hashtable
JMenuItem x = (JMenuItem) hash.get(menu + "\n" + item);
return x;
}
/** adds the given menu item to the specified menu */
public JMenuItem addMenuItem(String menu, String item, String command,
char mnemonic)
{
JMenuItem x = new JMenuItem(item);
addMenuItem(menu, x, command, mnemonic, true);
return x;
}
/** adds the given menu item to the specified menu */
public JMenuItem addMenuItem(String menu, String item, String command,
char mnemonic, boolean enabled)
{
JMenuItem x = new JMenuItem(item);
addMenuItem(menu, x, command, mnemonic, enabled);
return x;
}
/** adds the given menu item to the specified menu */
public void addMenuItem(String menu, JMenuItem item, String command,
char mnemonic, boolean enabled)
{
// add menu item to menu
JMenu m = getMenu(menu);
item.setMnemonic(mnemonic);
item.setActionCommand(command);
item.addActionListener(this);
item.setEnabled(enabled);
m.add(item);
hash.put(menu + "\n" + item.getText(), item);
}
/** adds the given sub-menu to the specified menu */
public JMenu addSubMenu(String menu, String sub, char mnemonic) {
JMenu x = new JMenu(sub);
addSubMenu(menu, x, mnemonic, true);
return x;
}
/** adds the given sub-menu to the specified menu */
public JMenu addSubMenu(String menu, String sub, char mnemonic,
boolean enabled)
{
JMenu x = new JMenu(sub);
addSubMenu(menu, x, mnemonic, enabled);
return x;
}
/** adds the given sub-menu to the specified menu */
public void addSubMenu(String menu, JMenu sub, char mnemonic,
boolean enabled)
{
// add sub-menu to menu
JMenu m = getMenu(menu);
sub.setMnemonic(mnemonic);
sub.getPopupMenu().setLightWeightPopupEnabled(!heavy);
sub.setEnabled(enabled);
m.add(sub);
hash.put(sub.getText(), sub);
}
/** adds a separator to the specified menu */
public void addMenuSeparator(String menu) {
JMenu m = getMenu(menu);
m.addSeparator();
}
/** sets the keyboard shortcut for the given menu item */
public void setMenuShortcut(String menu, String item, int keycode) {
JMenuItem jmi = getMenuItem(menu, item);
if (jmi == null) return;
jmi.setAccelerator(KeyStroke.getKeyStroke(keycode, MENU_MASK));
}
/** handles menu item actions */
public void actionPerformed(ActionEvent e) {
// convert command name to method
String command = e.getActionCommand();
Method method = null;
try {
method = getClass().getMethod(command, (Class[]) null);
}
catch (NoSuchMethodException exc) { exc.printStackTrace(); }
catch (SecurityException exc) { exc.printStackTrace(); }
// execute the method
if (method != null) {
try {
method.invoke(this, (Object[]) null);
}
catch (IllegalAccessException exc) { exc.printStackTrace(); }
catch (IllegalArgumentException exc) { exc.printStackTrace(); }
catch (InvocationTargetException exc) { exc.printStackTrace(); }
}
}
}