package com.ramussoft.pb.frames;

import java.awt.Component;
import java.util.ArrayList;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MnemonicFactory {

    public static void setMnemonics(final JMenuBar menuBar) {
        final int c = menuBar.getMenuCount();
        final ArrayList<JMenuItem> list = new ArrayList<JMenuItem>(c);
        for (int i = 0; i < c; i++)
            list.add(menuBar.getMenu(i));
        setMnemonics(list);
    }

    private static void setMnemonics(final ArrayList<JMenuItem> list) {
        final ArrayList<Character> c = new ArrayList<Character>();
        for (final JMenuItem item : list)
            if (item != null) {
                setMnemonics(item);
                final int m = item.getMnemonic();
                if (m == 0) {
                    final Character mn = getM(c, item.getText());
                    if (mn != null) {
                        c.add(mn);
                        item.setMnemonic(mn);
                    }
                } else
                    c.add(new Character((char) m));
            }
    }

    private static Character getM(final ArrayList<Character> cs, final String text) {
        for (int i = 0; i < text.length(); i++) {
            final Character c = text.charAt(i);
            if (cs.indexOf(c) < 0) {
                return c;
            }
        }

        return null;
    }

    private static void setMnemonics(final JMenuItem item) {
        if (item instanceof JMenu) {
            final JMenu menu = (JMenu) item;
            final int c = menu.getMenuComponentCount();
            final ArrayList<JMenuItem> list = new ArrayList<JMenuItem>(c);
            for (int i = 0; i < c; i++) {
                final Component co = menu.getMenuComponent(i);
                if (co instanceof JMenuItem)
                    list.add((JMenuItem) co);

            }
            if (list.size() > 0)
                setMnemonics(list);
        }
    }

}