package com.yoursway.ide.application.view.impl; import org.eclipse.jface.bindings.keys.KeySequence; import org.eclipse.jface.bindings.keys.KeyStroke; import org.eclipse.jface.bindings.keys.ParseException; import org.eclipse.jface.bindings.keys.formatting.KeyFormatterFactory; import org.eclipse.jface.bindings.keys.formatting.NativeKeyFormatter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import com.yoursway.ide.application.view.impl.commands.Command; public class MenuBuilder { private final Menu menu; private final MenuItem parentItem; private final CommandExecutor target; static { KeyFormatterFactory.setDefault(new NativeKeyFormatter()); } public MenuBuilder(Shell shell, CommandExecutor target) { this.menu = new Menu(shell, SWT.BAR); this.parentItem = null; this.target = target; } public MenuBuilder(Menu submenu, MenuItem item, CommandExecutor target) { this.menu = submenu; this.parentItem = item; this.target = target; } public MenuBuilder submenu(String title) { return submenu(title, null); } public MenuBuilder submenu(String title, String accel) { MenuItem item = createItem(title, accel, SWT.CASCADE); Menu submenu = new Menu(item); item.setMenu(submenu); return new MenuBuilder(submenu, item, target); } public Menu getMenu() { return menu; } public MenuItem getParentItem() { return parentItem; } public MenuItem item(String title, String accel, final Command command) { MenuItem item = createItem(title, accel, SWT.PUSH); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { target.execute(command); } }); return item; } public MenuItem item(String title, Command command) { return item(title, null, command); } public MenuItem checkbox(String title, String accel, final Command command) { MenuItem item = createItem(title, accel, SWT.CHECK); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { target.execute(command); } }); return item; } public MenuItem checkbox(String title, Command command) { return checkbox(title, null, command); } public MenuItem radio(String title, String accel, final Command command) { MenuItem item = createItem(title, accel, SWT.RADIO); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { target.execute(command); } }); return item; } public MenuItem radio(String title, Command command) { return radio(title, null, command); } public void separator() { new MenuItem(menu, SWT.SEPARATOR); } private MenuItem createItem(String title, String accel, int style) { MenuItem item = new MenuItem(menu, style); if (accel != null) try { KeySequence seq = KeySequence.getInstance(accel); KeyStroke[] keyStrokes = seq.getKeyStrokes(); if (keyStrokes.length == 1) item.setAccelerator(keyStrokes[0].getModifierKeys() | keyStrokes[0].getNaturalKey()); else title = title + "\t" + seq.format(); } catch (ParseException e) { throw new AssertionError("Invalid keystroke spec: " + accel + " -- " + e.getMessage()); } item.setText(title); return item; } }