package org.phenoscape.view; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collection; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import org.apache.log4j.Logger; import org.bbop.framework.GUIManager; import org.bbop.framework.ViewMenu; import org.obo.app.controller.DocumentController.AutosaveChangeListener; import org.obo.app.swing.ResponderChainAction; import org.obo.app.util.CrossPlatform; import org.phenoscape.controller.PhenexController; import org.phenoscape.main.Phenex; import edu.stanford.ejalbert.BrowserLauncher; import edu.stanford.ejalbert.exception.BrowserLaunchingInitializingException; import edu.stanford.ejalbert.exception.UnsupportedOperatingSystemException; public class MenuFactory { private final PhenexController controller; public MenuFactory(PhenexController controller) { this.controller = controller; } public Collection<? extends JMenuItem> createMenus() { Collection<JMenuItem> menus = new ArrayList<JMenuItem>(); menus.add(this.createFileMenu()); menus.add(this.createEditMenu()); final ViewMenu bbopViewMenu = new ViewMenu(); final JMenuItem perspectivesMenu = bbopViewMenu.getItem(0); final JMenuItem viewMenu = bbopViewMenu.getItem(1); perspectivesMenu.setText("Window"); viewMenu.setText("View"); menus.add(viewMenu); menus.add(this.createORBMenu()); menus.add(perspectivesMenu); menus.add(this.createHelpMenu()); return menus; } private JMenuItem createFileMenu() { final JMenu menu = new JMenu("File"); final Action openAction = new AbstractAction("Open...") { @Override public void actionPerformed(ActionEvent e) { controller.open(); } }; openAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(openAction)); final Action importPhenotypeProposals = new AbstractAction("Phenotype proposals...") { @Override public void actionPerformed(ActionEvent e) { controller.openImportPhenotypeProposals(); } }; final JMenu mergeMenu = new JMenu("Import"); mergeMenu.add(new JMenuItem(importPhenotypeProposals)); menu.add(mergeMenu); menu.addSeparator(); final Action saveAction = new AbstractAction("Save") { @Override public void actionPerformed(ActionEvent e) { controller.save(); } }; saveAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(saveAction)); final Action saveAsAction = new AbstractAction("Save As...") { @Override public void actionPerformed(ActionEvent e) { controller.saveAs(); } }; saveAsAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK)); menu.add(new JMenuItem(saveAsAction)); final Action exportExcelAction = new AbstractAction("Export for Excel...") { @Override public void actionPerformed(ActionEvent e) { controller.exportToExcel(); } }; menu.add(new JMenuItem(exportExcelAction)); final Action exportBiocreativeAction = new AbstractAction("Export for Charaparser Evaluation...") { @Override public void actionPerformed(ActionEvent e) { controller.exportForCharaparserEvaluation(); } }; menu.add(new JMenuItem(exportBiocreativeAction)); if (CrossPlatform.shouldPutExitInFileMenu()) { menu.addSeparator(); final Action exitAction = new AbstractAction("Exit") { @Override public void actionPerformed(ActionEvent e) { GUIManager.exit(0); } }; menu.add(new JMenuItem(exitAction)); } menu.addSeparator(); final Action enableAutosaveAction = new AbstractAction("Enable Autosave") { @Override public void actionPerformed(ActionEvent e) { controller.toggleAutosave(); } }; final JCheckBoxMenuItem autosave = new JCheckBoxMenuItem(enableAutosaveAction); autosave.setSelected(controller.getShouldAutosave()); controller.addAutosaveChangeListener(new AutosaveChangeListener() { @Override public void autosaveSettingChanged(boolean shouldAutosave) { autosave.setSelected(shouldAutosave); } }); menu.add(autosave); return menu; } private JMenuItem createEditMenu() { final JMenu menu = new JMenu("Edit"); final Action undo = this.controller.getUndoController().getUndoAction(); undo.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(undo)); final Action redo = this.controller.getUndoController().getRedoAction(); redo.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK)); menu.add(new JMenuItem(redo)); menu.addSeparator(); final Action cutAction = new ResponderChainAction("cut", "Cut"); cutAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(cutAction)); final Action copyAction = new ResponderChainAction("copy", "Copy"); copyAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(copyAction)); final Action pasteAction = new ResponderChainAction("paste", "Paste"); pasteAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(pasteAction)); final Action selectAllAction = new ResponderChainAction("selectAll", "Select All"); selectAllAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); menu.add(new JMenuItem(selectAllAction)); menu.addSeparator(); final Action consolidateSelectedCharactersAction = new ResponderChainAction("consolidateSelectedCharacters", "Consolidate Selected Characters"); menu.add(new JMenuItem(consolidateSelectedCharactersAction)); final Action consolidateSelectedStatesAction = new ResponderChainAction("consolidateSelectedStates", "Consolidate Selected States"); menu.add(new JMenuItem(consolidateSelectedStatesAction)); final Action newCharacterWithSelectedStatesAction = new ResponderChainAction("createNewCharacterWithSelectedStates", "New Character With Selected States"); menu.add(new JMenuItem(newCharacterWithSelectedStatesAction)); menu.addSeparator(); final Action generateTreeAction = new AbstractAction("Generate Tree From Taxonomy Ontology") { @Override public void actionPerformed(ActionEvent e) { controller.generateTree(); } }; final Action fillEntities = new AbstractAction("Auto-fill Entities") { @Override public void actionPerformed(ActionEvent e) { controller.fillEntities(); } }; menu.add(new JMenuItem(generateTreeAction)); menu.add(new JMenuItem(fillEntities)); return menu; } private JMenuItem createORBMenu() { final JMenu menu = new JMenu("ORB"); final Action termRequestAction = new AbstractAction("Request New Term...") { @Override public void actionPerformed(ActionEvent e) { controller.runORBTermRequest(); } }; menu.add(new JMenuItem(termRequestAction)); return menu; } private JMenuItem createHelpMenu() { final JMenu menu = new JMenu("Help"); final Action versionAction = new AbstractAction("Display Version") { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(menu, "Phenex " + Phenex.version()); } }; // final Action homepageAction = new AbstractAction("Phenex Homepage") { // @Override // public void actionPerformed(ActionEvent e) { // try { // new BrowserLauncher().openURLinBrowser("http://www.phenoscape.org/wiki/Phenex"); // } catch (BrowserLaunchingInitializingException e1) { // log().error("Unable to open URL in browser", e1); // e1.printStackTrace(); // } catch (UnsupportedOperatingSystemException e1) { // log().error("Unable to open URL in browser", e1); // } // } // }; // final Action trackerAction = new AbstractAction("Submit Bug Report or Feature Request...") { // @Override // public void actionPerformed(ActionEvent e) { // try { // new BrowserLauncher().openURLinBrowser("https://sourceforge.net/tracker/?func=add&group_id=76834&atid=1116214"); // } catch (BrowserLaunchingInitializingException e1) { // log().error("Unable to open URL in browser", e1); // e1.printStackTrace(); // } catch (UnsupportedOperatingSystemException e1) { // log().error("Unable to open URL in browser", e1); // } // } // }; menu.add(versionAction); // menu.add(homepageAction); // menu.add(trackerAction); return menu; } private Logger log() { return Logger.getLogger(this.getClass()); } }