import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;

public class MenuDemo {

	public static Display myDisplay;
	public static boolean internalCall = false;

	public static void main(String[] args) {
		internalCall = true;
		myDisplay = new Display();
		MenuDemo md = new MenuDemo();
		md.runDemo(myDisplay);	
	}
	
	public void runDemo(Display display) {
		myDisplay = display;
		Shell shell = new Shell(display);
		shell.setText("Menu Demo");
		
		//create the menu bar
		Menu menu = new Menu(shell, SWT.BAR);
		shell.setMenuBar(menu);

		//add File option to it
		MenuItem file = new MenuItem(menu, SWT.CASCADE);
		file.setText("File");		
		
		//set the menu for the File option
		Menu filemenu = new Menu(shell, SWT.DROP_DOWN);
		file.setMenu(filemenu);

		//add MenuItems to the File menu
		MenuItem actionItem = new MenuItem(filemenu, SWT.PUSH);
		actionItem.setText("Action");		

		//listen for Action using generic listener
		actionItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				System.out.println("Action performed!");			
			}
		});
		
		//add a separator to the file menu
		MenuItem separator = new MenuItem(filemenu, SWT.SEPARATOR);

		//add a radio item
		final MenuItem radioItem = new MenuItem(filemenu, SWT.RADIO);
		radioItem.setText("Radio");		

		//add a check item
		final MenuItem checkItem = new MenuItem(filemenu, SWT.CHECK);
		checkItem.setText("Check");		

		//listen for radio toggle
		//note that radio-button behaviour if required must be programmed 
		//manually. It acts identically to a check item otherwise.
		radioItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				System.out.println("Radio item toggled to:"+ radioItem.getSelection());
			}
		});
		
		//listen for check toggle
		checkItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				System.out.println("Check item toggled to:" + checkItem.getSelection());			
			}
		});

		//add a cascade item (submenu)
		MenuItem cascadeItem = new MenuItem(filemenu, SWT.CASCADE);
		cascadeItem.setText("Cascade");	
		Menu submenu = new Menu(shell, SWT.DROP_DOWN);
		cascadeItem.setMenu(submenu);
		
		//add subaction, with Ctrl+S keyboard shortcut
		final MenuItem subactionItem = new MenuItem(submenu, SWT.PUSH);
		subactionItem.setText("&SubAction\tCtrl+S");
		subactionItem.setAccelerator(SWT.CTRL+'S');
		subactionItem.setEnabled(false);

		//add a check item to enable/disable the SubAction
		final MenuItem enableItem = new MenuItem(submenu, SWT.CHECK);
		enableItem.setText("Enable SubAction");		
		
		//listen for submenu being shown
		submenu.addMenuListener(new MenuListener() {
			public void menuShown(MenuEvent e) {
				System.out.println("SubMenu shown");	
			}
			public void menuHidden(MenuEvent e) {
				System.out.println("SubMenu hidden");	
			}
		});
		
		//listen for enablement toggle for SubAction
		enableItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				System.out.println("Toggling \"Enable SubAction\" to " + enableItem.getSelection());
				subactionItem.setEnabled(enableItem.getSelection());
			}
		});
		
		//listen for "SubAction" selected using SelectionListener
		//as opposed to the generic listener used for Action
		subactionItem.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				System.out.println("SubAction performed!");
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}
		});

		//listen for subaction being armed
		subactionItem.addArmListener(new ArmListener() {
			public void widgetArmed(ArmEvent e) {
				System.out.println("SubAction armed!");	
			}
		});
		
		//listen for help event (F1 being pressed on it)
		subactionItem.addHelpListener(new HelpListener() {
			public void helpRequested(HelpEvent e) {
				System.out.println("Help requested on SubAction");
			}
		});

		shell.setSize(300,300);
		shell.open();
		while(!shell.isDisposed())
			if(!display.readAndDispatch())
				display.sleep();
		if (internalCall) display.dispose();		
	}
}
