package it.albertus.cycles.gui; import java.util.Collections; import java.util.EnumMap; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import org.eclipse.jface.util.Util; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import it.albertus.cycles.engine.NumeralSystem; import it.albertus.cycles.gui.listener.AboutListener; import it.albertus.cycles.gui.listener.CloseListener; import it.albertus.cycles.gui.listener.CopySelectionListener; import it.albertus.cycles.gui.listener.CutSelectionListener; import it.albertus.cycles.gui.listener.EditMenuBarArmListener; import it.albertus.cycles.gui.listener.LanguageSelectionListener; import it.albertus.cycles.gui.listener.OpenSelectionListener; import it.albertus.cycles.gui.listener.PasteSelectionListener; import it.albertus.cycles.gui.listener.RadixSelectionListener; import it.albertus.cycles.gui.listener.ResetAllSelectionListener; import it.albertus.cycles.gui.listener.ResetSingleSelectionListener; import it.albertus.cycles.gui.listener.SaveSelectionListener; import it.albertus.cycles.resources.Messages; import it.albertus.cycles.resources.Messages.Language; import it.albertus.jface.SwtUtils; import it.albertus.jface.cocoa.CocoaEnhancerException; import it.albertus.jface.cocoa.CocoaUIEnhancer; import it.albertus.util.logging.LoggerFactory; /** * Solo i <tt>MenuItem</tt> che fanno parte di una barra dei menù con * stile <tt>SWT.BAR</tt> hanno gli acceleratori funzionanti; negli altri casi * (ad es. <tt>SWT.POP_UP</tt>), benché vengano visualizzate le * combinazioni di tasti, gli acceleratori non funzioneranno e le relative * combinazioni di tasti saranno ignorate. */ public class MenuBar { private static final Logger logger = LoggerFactory.getLogger(MenuBar.class); private final Menu bar; private final Menu fileMenu; private final MenuItem fileMenuHeader; private final MenuItem fileOpenMenuItem; private final MenuItem fileSaveMenuItem; private MenuItem fileExitMenuItem; private final Menu editMenu; private final MenuItem editMenuHeader; private final MenuItem editCutMenuItem; private final MenuItem editCopyMenuItem; private final MenuItem editPasteMenuItem; private final Menu editResetSubMenu; private final MenuItem editResetSubMenuItem; private final MenuItem editResetSingleMenuItem; private final MenuItem editResetAllMenuItem; private final Menu viewMenu; private final MenuItem viewMenuHeader; private final Menu viewRadixSubMenu; private final MenuItem viewRadixSubMenuItem; private final Map<NumeralSystem, MenuItem> viewRadixMenuItems = new EnumMap<NumeralSystem, MenuItem>(NumeralSystem.class); private final Menu viewLanguageSubMenu; private final MenuItem viewLanguageSubMenuItem; private final Map<Language, MenuItem> viewLanguageMenuItems = new EnumMap<Language, MenuItem>(Language.class); private Menu helpMenu; private MenuItem helpMenuHeader; private MenuItem helpAboutMenuItem; MenuBar(final CyclesModGui gui) { final CloseListener closeListener = new CloseListener(gui); final AboutListener aboutListener = new AboutListener(gui); boolean cocoaMenuCreated = false; if (Util.isCocoa()) { try { new CocoaUIEnhancer(gui.getShell().getDisplay()).hookApplicationMenu(closeListener, aboutListener, null); cocoaMenuCreated = true; } catch (final CocoaEnhancerException cee) { logger.log(Level.WARNING, Messages.get("err.cocoa.enhancer"), cee); } } bar = new Menu(gui.getShell(), SWT.BAR); // Barra // File fileMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); fileMenuHeader = new MenuItem(bar, SWT.CASCADE); fileMenuHeader.setText(Messages.get("lbl.menu.header.file")); fileMenuHeader.setMenu(fileMenu); fileOpenMenuItem = new MenuItem(fileMenu, SWT.PUSH); fileOpenMenuItem.setText(Messages.get("lbl.menu.item.open") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_OPEN)); fileOpenMenuItem.addSelectionListener(new OpenSelectionListener(gui)); fileOpenMenuItem.setAccelerator(SWT.MOD1 | SwtUtils.KEY_OPEN); fileSaveMenuItem = new MenuItem(fileMenu, SWT.PUSH); fileSaveMenuItem.setText(Messages.get("lbl.menu.item.saveas") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_SAVE)); fileSaveMenuItem.addSelectionListener(new SaveSelectionListener(gui)); fileSaveMenuItem.setAccelerator(SWT.MOD1 | SwtUtils.KEY_SAVE); if (!cocoaMenuCreated) { new MenuItem(fileMenu, SWT.SEPARATOR); fileExitMenuItem = new MenuItem(fileMenu, SWT.PUSH); fileExitMenuItem.setText(Messages.get("lbl.menu.item.exit")); fileExitMenuItem.addSelectionListener(closeListener); } // Edit editMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); editMenuHeader = new MenuItem(bar, SWT.CASCADE); editMenuHeader.setText(Messages.get("lbl.menu.header.edit")); editMenuHeader.setMenu(editMenu); editMenuHeader.addArmListener(new EditMenuBarArmListener(gui)); editCutMenuItem = new MenuItem(editMenu, SWT.PUSH); editCutMenuItem.setText(Messages.get("lbl.menu.item.cut") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_CUT)); editCutMenuItem.addSelectionListener(new CutSelectionListener(gui)); editCutMenuItem.setAccelerator(SWT.MOD1 | SwtUtils.KEY_CUT); editCopyMenuItem = new MenuItem(editMenu, SWT.PUSH); editCopyMenuItem.setText(Messages.get("lbl.menu.item.copy") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_COPY)); editCopyMenuItem.addSelectionListener(new CopySelectionListener(gui)); editCopyMenuItem.setAccelerator(SWT.MOD1 | SwtUtils.KEY_COPY); editPasteMenuItem = new MenuItem(editMenu, SWT.PUSH); editPasteMenuItem.setText(Messages.get("lbl.menu.item.paste") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_PASTE)); editPasteMenuItem.addSelectionListener(new PasteSelectionListener(gui)); editPasteMenuItem.setAccelerator(SWT.MOD1 | SwtUtils.KEY_PASTE); new MenuItem(editMenu, SWT.SEPARATOR); editResetSubMenuItem = new MenuItem(editMenu, SWT.CASCADE); editResetSubMenuItem.setText(Messages.get("lbl.menu.item.reset")); editResetSubMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); editResetSubMenuItem.setMenu(editResetSubMenu); editResetSingleMenuItem = new MenuItem(editResetSubMenu, SWT.PUSH); editResetSingleMenuItem.setText(Messages.get("lbl.menu.item.reset.single")); editResetSingleMenuItem.addSelectionListener(new ResetSingleSelectionListener(gui)); editResetAllMenuItem = new MenuItem(editResetSubMenu, SWT.PUSH); editResetAllMenuItem.setText(Messages.get("lbl.menu.item.reset.all")); editResetAllMenuItem.addSelectionListener(new ResetAllSelectionListener(gui)); // View viewMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); viewMenuHeader = new MenuItem(bar, SWT.CASCADE); viewMenuHeader.setText(Messages.get("lbl.menu.header.view")); viewMenuHeader.setMenu(viewMenu); viewRadixSubMenuItem = new MenuItem(viewMenu, SWT.CASCADE); viewRadixSubMenuItem.setText(Messages.get("lbl.menu.item.radix")); viewRadixSubMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); viewRadixSubMenuItem.setMenu(viewRadixSubMenu); final RadixSelectionListener radixSelectionListener = new RadixSelectionListener(gui); for (final NumeralSystem numeralSystem : NumeralSystem.values()) { final MenuItem radixMenuItem = new MenuItem(viewRadixSubMenu, SWT.RADIO); radixMenuItem.setText(Messages.get("lbl.menu.item.radix." + numeralSystem.getRadix())); radixMenuItem.setData(numeralSystem); radixMenuItem.addSelectionListener(radixSelectionListener); viewRadixMenuItems.put(numeralSystem, radixMenuItem); } viewRadixMenuItems.get(gui.getNumeralSystem()).setSelection(true); // Default new MenuItem(viewMenu, SWT.SEPARATOR); viewLanguageSubMenuItem = new MenuItem(viewMenu, SWT.CASCADE); viewLanguageSubMenuItem.setText(Messages.get("lbl.menu.item.language")); viewLanguageSubMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); viewLanguageSubMenuItem.setMenu(viewLanguageSubMenu); final LanguageSelectionListener languageSelectionListener = new LanguageSelectionListener(gui); for (final Language language : Language.values()) { final MenuItem languageMenuItem = new MenuItem(viewLanguageSubMenu, SWT.RADIO); languageMenuItem.setText(language.getLocale().getDisplayLanguage(language.getLocale())); languageMenuItem.setData(language); languageMenuItem.addSelectionListener(languageSelectionListener); viewLanguageMenuItems.put(language, languageMenuItem); } viewLanguageMenuItems.get(Messages.getLanguage()).setSelection(true); // Default // Help if (!cocoaMenuCreated) { helpMenu = new Menu(gui.getShell(), SWT.DROP_DOWN); helpMenuHeader = new MenuItem(bar, SWT.CASCADE); helpMenuHeader.setText(Messages.get("lbl.menu.header.help")); helpMenuHeader.setMenu(helpMenu); helpAboutMenuItem = new MenuItem(helpMenu, SWT.PUSH); helpAboutMenuItem.setText(Messages.get("lbl.menu.item.about")); helpAboutMenuItem.addSelectionListener(aboutListener); } gui.getShell().setMenuBar(bar); } public void updateTexts() { fileMenuHeader.setText(Messages.get("lbl.menu.header.file")); fileOpenMenuItem.setText(Messages.get("lbl.menu.item.open") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_OPEN)); fileSaveMenuItem.setText(Messages.get("lbl.menu.item.saveas") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_SAVE)); if (fileExitMenuItem != null && !fileExitMenuItem.isDisposed()) { fileExitMenuItem.setText(Messages.get("lbl.menu.item.exit")); } editMenuHeader.setText(Messages.get("lbl.menu.header.edit")); editCutMenuItem.setText(Messages.get("lbl.menu.item.cut") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_CUT)); editCopyMenuItem.setText(Messages.get("lbl.menu.item.copy") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_COPY)); editPasteMenuItem.setText(Messages.get("lbl.menu.item.paste") + SwtUtils.getMod1ShortcutLabel(SwtUtils.KEY_PASTE)); editResetSubMenuItem.setText(Messages.get("lbl.menu.item.reset")); editResetSingleMenuItem.setText(Messages.get("lbl.menu.item.reset.single")); editResetAllMenuItem.setText(Messages.get("lbl.menu.item.reset.all")); viewMenuHeader.setText(Messages.get("lbl.menu.header.view")); viewRadixSubMenuItem.setText(Messages.get("lbl.menu.item.radix")); for (final Entry<NumeralSystem, MenuItem> entry : viewRadixMenuItems.entrySet()) { entry.getValue().setText(Messages.get("lbl.menu.item.radix." + entry.getKey().getRadix())); } viewLanguageSubMenuItem.setText(Messages.get("lbl.menu.item.language")); for (final Entry<Language, MenuItem> entry : viewLanguageMenuItems.entrySet()) { entry.getValue().setText(entry.getKey().getLocale().getDisplayLanguage(entry.getKey().getLocale())); } if (helpMenuHeader != null && !helpMenuHeader.isDisposed()) { helpMenuHeader.setText(Messages.get("lbl.menu.header.help")); } if (helpAboutMenuItem != null && !helpAboutMenuItem.isDisposed()) { helpAboutMenuItem.setText(Messages.get("lbl.menu.item.about")); } } public Menu getBar() { return bar; } public Menu getFileMenu() { return fileMenu; } public MenuItem getFileMenuHeader() { return fileMenuHeader; } public MenuItem getFileOpenMenuItem() { return fileOpenMenuItem; } public MenuItem getFileSaveMenuItem() { return fileSaveMenuItem; } public MenuItem getFileExitMenuItem() { return fileExitMenuItem; } public Menu getEditMenu() { return editMenu; } public MenuItem getEditMenuHeader() { return editMenuHeader; } public MenuItem getEditCutMenuItem() { return editCutMenuItem; } public MenuItem getEditCopyMenuItem() { return editCopyMenuItem; } public MenuItem getEditPasteMenuItem() { return editPasteMenuItem; } public Menu getEditResetSubMenu() { return editResetSubMenu; } public MenuItem getEditResetSubMenuItem() { return editResetSubMenuItem; } public MenuItem getEditResetSingleMenuItem() { return editResetSingleMenuItem; } public MenuItem getEditResetAllMenuItem() { return editResetAllMenuItem; } public Menu getViewMenu() { return viewMenu; } public MenuItem getViewMenuHeader() { return viewMenuHeader; } public Menu getViewRadixSubMenu() { return viewRadixSubMenu; } public MenuItem getViewRadixSubMenuItem() { return viewRadixSubMenuItem; } public Map<NumeralSystem, MenuItem> getViewRadixMenuItems() { return Collections.unmodifiableMap(viewRadixMenuItems); } public Menu getViewLanguageSubMenu() { return viewLanguageSubMenu; } public MenuItem getViewLanguageSubMenuItem() { return viewLanguageSubMenuItem; } public Map<Language, MenuItem> getViewLanguageMenuItems() { return Collections.unmodifiableMap(viewLanguageMenuItems); } public Menu getHelpMenu() { return helpMenu; } public MenuItem getHelpMenuHeader() { return helpMenuHeader; } public MenuItem getHelpAboutMenuItem() { return helpAboutMenuItem; } }