package edu.oregonstate.cartography.gui;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.MenuElement;
/**
* http://www.javalobby.org/java/forums/t90550.html
* Dispatch menu keyboard shortcuts from dialog to main window.
*/
public class DialogUtil {
private static int counter = 0;
private static ArrayList dialogs = new ArrayList();
private static JMenuBar menuBar = null;
public static synchronized void registerJDialog(JDialog dialog) {
if (menuBar != null) {
setupActions(dialog, menuBar);
} else {
dialogs.add(dialog);
}
}
public static synchronized void setupDialogActions(JMenuBar _menuBar) {
menuBar = _menuBar;
if (dialogs == null) {
return;
}
for (Iterator iter = dialogs.iterator(); iter.hasNext();) {
JDialog dialog = (JDialog) iter.next();
setupActions(dialog, menuBar);
}
dialogs.clear();
dialogs = null;
}
private static void setupActions(JDialog dialog, JMenuBar menuBar) {
counter = 0;
for (int i = 0; i < menuBar.getComponentCount(); i++) {
Component c = menuBar.getComponent(i);
if (c instanceof MenuElement) {
setActionsMenu(dialog, (MenuElement) c);
}
}
}
private static void setActionsMenu(JDialog dialog, MenuElement menu) {
MenuElement[] subItems = menu.getSubElements();
for (int i = 0; i < subItems.length; i++) {
MenuElement c = subItems[i];
if (c instanceof JMenuItem) {
final JMenuItem menuItem = (JMenuItem) c;
if (menuItem.getAccelerator() != null) {
String key = "hackAction" + counter++;
dialog.getRootPane().getInputMap(
JComponent.WHEN_IN_FOCUSED_WINDOW).put(
menuItem.getAccelerator(), key);
if (menuItem.getAction() == null) {
dialog.getRootPane().getActionMap().put(key,
new AbstractAction() {
public void actionPerformed(ActionEvent e) {
menuItem.doClick();
}
});
} else {
dialog.getRootPane().getActionMap().put(key,
menuItem.getAction());
}
// System.out.println(key + " : "
// + menuItem.getActionCommand() + " : "
// + menuItem.getAccelerator() + " : "
// + menuItem.getAction());
}
} else if (c.getSubElements().length > 0) {
setActionsMenu(dialog, c);
}
}
}
}