import java.awt.Button;
import java.awt.CheckboxMenuItem;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.Point;
import java.awt.PopupMenu;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AWTEx4 {
	private static AWTEx4 app;
	private Label lbl_hello;
	private Frame wnd;
	private MenuItem mi_sayHello, mi_disable, mi_enable, mi_toggle, mi_up, mi_down;
	private CheckboxMenuItem mi_light;
	private PopupMenu myPopupMenu;

	class ToggleSayHelloState implements ActionListener 	{
		public void actionPerformed(ActionEvent ae) 		{
			mi_sayHello.setEnabled( !mi_sayHello.isEnabled() );
			mi_enable.setEnabled( !mi_sayHello.isEnabled() );
			mi_disable.setEnabled( mi_sayHello.isEnabled() );
		} //actionPerformed()
	} //class ToggleSayHelloSate

	public static void main(String[] args) {
		app = new AWTEx4();
	} //main()

	public AWTEx4() {
		wnd = new Frame("Menu Example");
		lbl_hello = new Label("Hello!");
		wnd.add(lbl_hello);

		wnd.setSize(300,200);
		wnd.setLayout(new FlowLayout() );

		MenuBar myMenuBar = new MenuBar();
		Menu m_hello = new Menu("Hello");
		myMenuBar.add(m_hello);
		mi_sayHello = new MenuItem("say hello", new MenuShortcut (KeyEvent.VK_H));
		m_hello.add( mi_sayHello );
		mi_disable = new MenuItem("disable say hello");
		m_hello.addSeparator();
		mi_enable = new MenuItem("enable say hello");
		m_hello.add( mi_disable );
		m_hello.add( mi_enable );

		Menu m_windowAction = new Menu("Window");
		Menu m_windowActionMove = new Menu("Move");
		mi_light = new CheckboxMenuItem("light on/off");
		mi_down = new MenuItem("down");
		mi_up = new MenuItem ("up");

		m_windowActionMove.add(mi_down);
		m_windowActionMove.add(mi_up);
		m_windowAction.add(m_windowActionMove);
		m_windowAction.add(mi_light);
		myMenuBar.add(m_windowAction);

		//pop-up menu
		myPopupMenu = new PopupMenu();
		MenuItem mi_toggle = new MenuItem("toggle sayHello");
		myPopupMenu.add( mi_toggle );
		wnd.add( myPopupMenu );

		Menu m_hlp = new Menu("Help");
		m_hlp.add(new MenuItem("about"));

		myMenuBar.setHelpMenu(m_hlp);

		wnd.setMenuBar(myMenuBar);

		mi_up.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				Point pnt = wnd.getLocation();

				for (int x=pnt.x; x >= 0 ; x--)
					wnd.setLocation(x, pnt.y);
				for (int y=pnt.y; y >= 0; y--)
					wnd.setLocation(0, y);
			} //actionPerformed()
		} //anonymous inner class
		);

		mi_down.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				final Dialog dlg_notImplemented = new Dialog (wnd,true);
				Label lbl = new Label("function not implemented, yet!");
				dlg_notImplemented.setTitle("Sorry, I'm afraid I can't to that ...");
				dlg_notImplemented.setLayout( new FlowLayout() );
				dlg_notImplemented.setResizable(false);
				dlg_notImplemented.add(lbl);
				dlg_notImplemented.setSize(250,80);

				Button btn_ok = new Button("ok");
				btn_ok.addActionListener( new ActionListener() {
					public void actionPerformed(ActionEvent ae) {
						dlg_notImplemented.setVisible(false);
						dlg_notImplemented.dispose();
					} //actionPerformed()
				} //anonymous inner class
				);

				dlg_notImplemented.add(btn_ok);

				dlg_notImplemented.show();
			} //actionPerformed()
		} //anonymous inner class
		);

		mi_light.addItemListener( new ItemListener() {
			public void itemStateChanged(ItemEvent ie) {
				if (mi_light.getState())
					wnd.setBackground( new Color(33,33,33) );
				else
					wnd.setBackground( new Color(255,255,255) );
			} //actionPerformed()
		} //anonymous inner class
		);

		mi_sayHello.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				lbl_hello.setVisible(true);
				try {
					Thread.sleep(1500);
				} catch (InterruptedException e) {
					//ignore it
				} //catch
				lbl_hello.setVisible(false);
			} //actionPerformed()
		} //anonymous inner class
		);

		ActionListener toggler = new ToggleSayHelloState();
		mi_disable.addActionListener( toggler );
		mi_enable.addActionListener( toggler );
		mi_toggle.addActionListener( toggler );

		wnd.addWindowListener( new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				Window wnd = we.getWindow();

				wnd.setVisible(false);
				wnd.dispose();
				System.exit(0);
			} //windowClosing()
		}//anonymous inner class
		);

		wnd.addMouseListener( new MouseAdapter() {
			public void mouseClicked( MouseEvent me) {
				if ( (me.getModifiers() & InputEvent.BUTTON1_MASK) == 0 )
					myPopupMenu.show( me.getComponent(), me.getX(), me.getY() );
			} //mouseClicked()
		} //anonymous inner class
		);

		wnd.setVisible(true);
		lbl_hello.setVisible(false);
		mi_enable.setEnabled(false);
	} //main()
} //class AWTEx4