package eu.irreality.age.windowing; import java.awt.Component; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.MenuElement; /** * This is a utility class which can be used to set the mnemonics of all the items * in a menubar on the fly. */ public class MenuMnemonicOnTheFly { // //This method sets mnemonic of all the items in the menubar // public static void setMnemonics(JMenuBar mb) { MenuElement[] MenuElements = mb.getSubElements(); int num = MenuElements.length; if (0 == num) return; setMnemonicForTopLevel(mb); for (int i = 0; i < num; ++i) { if (!(MenuElements[i] instanceof JMenu)) continue; setMnemonic((JMenu) MenuElements[i]); } } // //This method sets mnemonic of all the top level menus in the menubar // private static void setMnemonicForTopLevel(JMenuBar mb) { MenuElement[] MenuElements = mb.getSubElements(); int num = MenuElements.length; if (0 == num) return; char mnemonics[] = new char[num]; for (int i = 0; i < num; ++i) { if (!(MenuElements[i] instanceof JMenu)) continue; JMenu menu = (JMenu) MenuElements[i]; String text = menu.getText(); char mnemonic = getMnemonic(text, mnemonics); if (' ' != mnemonic) { menu.setMnemonic(mnemonic); mnemonics[i] = mnemonic; } } } // // This method sets mnemonic of the menuitems and submenus of a given menu. // To set different Mnemonic of each item it firsr checks first character of the all the words then the second , third // and so on till a unique character is found. private static void setMnemonic(JMenu jm) { Component mcomps[] = jm.getMenuComponents(); int num = mcomps.length; if (0 == num) return; char mnemonics[] = new char[num]; for (int i = 0; i < num; ++i) { if (!(mcomps[i] instanceof JMenuItem)) continue; JMenuItem menuitem = (JMenuItem) mcomps[i]; String text = menuitem.getText(); char mnemonic = getMnemonic(text, mnemonics); if (' ' != mnemonic) { menuitem.setMnemonic(mnemonic); mnemonics[i] = mnemonic; } if (menuitem instanceof JMenu) setMnemonic((JMenu) menuitem); } } private static char getMnemonic(String text, char[] mnemonics) { Vector words = new Vector(); StringTokenizer t = new StringTokenizer(text); int maxsize = 0; while (t.hasMoreTokens()) { String word = (String) t.nextToken(); if (word.length() > maxsize) maxsize = word.length(); words.addElement(word); } words.trimToSize(); for (int i = 0; i < maxsize; ++i) { char mnemonic = getMnemonic(words, mnemonics, i); if (' ' != mnemonic) return mnemonic; } return ' '; } private static char getMnemonic(Vector words, char[] mnemonics, int index) { int numwords = words.size(); for (int i = 0; i < numwords; ++i) { String word = (String) words.elementAt(i); if (index >= word.length()) continue; char c = word.charAt(index); if (!isMnemonicExists(c, mnemonics)) return c; } return ' '; } private static boolean isMnemonicExists(char c, char[] mnemonics) { int num = mnemonics.length; for (int i = 0; i < num; ++i) if (mnemonics[i] == c) return true; return false; } }