//    File:  StandardMenus.java

import java.awt.*;
import java.awt.event.*;

public class StandardMenus extends Frame {

    public static void main(String[] args) {
        sm = new StandardMenus();
        sm.setSize(WIDTH, HEIGHT);
        sm.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        sm.setLayout(new FlowLayout());
        sm.add(label);
        sm.setVisible(true);
    }

    // Set up the Menu Bar; initialize the File and Edit menus
    public StandardMenus() {
        super("StandardMenus Example");
        setMenuBar(mBar);
        initFileMenu();
        initEditMenu();
    }

    // Set up the File Menu - use individual Handlers
    private void initFileMenu() {
        fileMenu = new Menu("File");
        mBar.add(fileMenu);

        newItem = new MenuItem("New");
        newItem.addActionListener(new NewHandler());
        fileMenu.add(newItem);
        // Display Ctrl-N for New command
        ms = new MenuShortcut(KeyEvent.VK_N);
        newItem.setShortcut(ms);

        openItem = new MenuItem("Open");
        openItem.addActionListener(new OpenHandler());
        fileMenu.add(openItem);
        // Display Ctrl-O for Open command
        ms = new MenuShortcut(KeyEvent.VK_O);
        openItem.setShortcut(ms);

        saveItem = new MenuItem("Save");
        saveItem.addActionListener(new SaveHandler());
        fileMenu.add(saveItem);
        // Display Ctrl-S for Save command
        ms = new MenuShortcut(KeyEvent.VK_S);
        saveItem.setShortcut(ms);

        saveAsItem = new MenuItem("Save As");
        saveAsItem.addActionListener(new SaveAsHandler());
        fileMenu.add(saveAsItem);
        // Display Ctrl-A for Save As command
        ms = new MenuShortcut(KeyEvent.VK_A);
        saveAsItem.setShortcut(ms);

        fileMenu.addSeparator();

        quitItem = new MenuItem("Exit");
        quitItem.addActionListener(new QuitHandler());
        fileMenu.add(quitItem);
        // Display Ctrl-Q for Quit command
        ms = new MenuShortcut(KeyEvent.VK_Q);
        quitItem.setShortcut(ms);
    }

    // Set up the Edit Menu - use centralized Handler
    private void initEditMenu() {
        editMenu = new Menu("Edit");
        mBar.add(editMenu);

        // eh is the centralized Handler
        EditHandler eh = new EditHandler();

        cutItem = new MenuItem("Cut");
        cutItem.addActionListener(eh);
        editMenu.add(cutItem);
        // Display Ctrl-X for Cut command
        ms = new MenuShortcut(KeyEvent.VK_X);
        cutItem.setShortcut(ms);

        copyItem = new MenuItem("Copy");
        copyItem.addActionListener(eh);
        editMenu.add(copyItem);
        // Display Ctrl-C for Copy command
        ms = new MenuShortcut(KeyEvent.VK_C);
        copyItem.setShortcut(ms);

        pasteItem = new MenuItem("Paste");
        pasteItem.addActionListener(eh);
        editMenu.add(pasteItem);
        // Display Ctrl-V for Paste command
        ms = new MenuShortcut(KeyEvent.VK_V);
        pasteItem.setShortcut(ms);

        // Fake keyboard shortcut for Delete
        deleteItem = new MenuItem(sDelete);
        deleteItem.addActionListener(eh);
        editMenu.add(deleteItem);

        editMenu.addSeparator();

        otherItem = new MenuItem("Other");
        otherItem.setEnabled(false);    // disable
        otherItem.addActionListener(eh);
        editMenu.add(otherItem);

        editMenu.addSeparator();

        selectAllItem = new MenuItem("Select All");
        selectAllItem.addActionListener(eh);
        editMenu.add(selectAllItem);
        ms = new MenuShortcut(KeyEvent.VK_L);
        // Display Ctrl-L for Select All command
        selectAllItem.setShortcut(ms);
    }

    // implement each separate File command individually

    class NewHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            label.setText("New");
        }
    }

    class OpenHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            label.setText("Open");
        }
    }

    class SaveHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            label.setText("Save");
        }
    }

    class SaveAsHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            label.setText("Save As");
        }
    }

    class QuitHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            label.setText("Quit");
            System.exit(0);
        }
    }

    // Implements all the Edit Menu commands
    class EditHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String sCommand = e.getActionCommand();
            if (sCommand.compareTo("Cut") == 0) {
                label.setText("Cut");
            } else if (sCommand.compareTo("Copy") == 0) {
                label.setText("Copy");
            } else if (sCommand.compareTo("Paste") == 0) {
                label.setText("Paste");
            } else if (sCommand.compareTo(sDelete) == 0) {
                label.setText("Delete");
            } else if (sCommand.compareTo("Select All") == 0) {
                label.setText("Select All");
            }
        }
    }

    private static final int WIDTH  = 250;
    private static final int HEIGHT = 150;
    private static Label label = new Label("Select a menu command", Label.CENTER);
    private static StandardMenus sm;
    private MenuBar mBar = new MenuBar();
    private Menu fileMenu, editMenu;
    private MenuItem newItem, openItem, saveItem, saveAsItem, quitItem;
    private MenuItem cutItem, copyItem, pasteItem, deleteItem, selectAllItem, otherItem;
    private MenuShortcut ms;
    private final String sDelete = "Delete                 Del";
}
