/******************************************************************************* * GenPlay, Einstein Genome Analyzer * Copyright (C) 2009, 2014 Albert Einstein College of Medicine * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * Authors: Julien Lajugie <julien.lajugie@einstein.yu.edu> * Nicolas Fourel <nicolas.fourel@einstein.yu.edu> * Eric Bouhassira <eric.bouhassira@einstein.yu.edu> * * Website: <http://genplay.einstein.yu.edu> ******************************************************************************/ package edu.yu.einstein.genplay.gui.menu; import java.util.List; import javax.swing.ActionMap; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import edu.yu.einstein.genplay.core.manager.project.ProjectManager; import edu.yu.einstein.genplay.gui.action.project.PAAbout; import edu.yu.einstein.genplay.gui.action.project.PACheckForUpdates; import edu.yu.einstein.genplay.gui.action.project.PAContactUs; import edu.yu.einstein.genplay.gui.action.project.PAExit; import edu.yu.einstein.genplay.gui.action.project.PAFullScreen; import edu.yu.einstein.genplay.gui.action.project.PAHelp; import edu.yu.einstein.genplay.gui.action.project.PALoadProject; import edu.yu.einstein.genplay.gui.action.project.PANewProject; import edu.yu.einstein.genplay.gui.action.project.PAOption; import edu.yu.einstein.genplay.gui.action.project.PARNAPosToDNAPos; import edu.yu.einstein.genplay.gui.action.project.PAReportBug; import edu.yu.einstein.genplay.gui.action.project.PASaveProject; import edu.yu.einstein.genplay.gui.action.project.PASaveProjectAs; import edu.yu.einstein.genplay.gui.action.project.PAShowErrorReport; import edu.yu.einstein.genplay.gui.action.project.PAShowMainFrame; import edu.yu.einstein.genplay.gui.action.project.PAShowWarningReport; import edu.yu.einstein.genplay.gui.action.project.PASortFile; import edu.yu.einstein.genplay.gui.action.track.TAAddLayer; import edu.yu.einstein.genplay.gui.action.track.TAAddLayerFromDAS; import edu.yu.einstein.genplay.gui.action.track.TAAddVariantLayer; import edu.yu.einstein.genplay.gui.action.track.TACopy; import edu.yu.einstein.genplay.gui.action.track.TACut; import edu.yu.einstein.genplay.gui.action.track.TADelete; import edu.yu.einstein.genplay.gui.action.track.TAInsert; import edu.yu.einstein.genplay.gui.action.track.TAPasteOrDrop; import edu.yu.einstein.genplay.gui.action.track.TASaveAsImage; import edu.yu.einstein.genplay.gui.action.track.TASaveTrack; import edu.yu.einstein.genplay.gui.action.track.TATrackSettings; import edu.yu.einstein.genplay.gui.dialog.exceptionDialog.ExceptionReportDialog; import edu.yu.einstein.genplay.gui.dialog.exceptionDialog.WarningReportDialog; import edu.yu.einstein.genplay.gui.mainFrame.MainFrame; import edu.yu.einstein.genplay.gui.menu.layerMenu.LayerMenuFactory; import edu.yu.einstein.genplay.gui.track.Track; import edu.yu.einstein.genplay.util.LookAndFeels; import edu.yu.einstein.genplay.util.Utils; import edu.yu.einstein.genplay.util.colors.Colors; /** * Application main menu bar following the OSX feel * @author Julien Lajugie */ public class MenuBar extends JMenuBar { private static final long serialVersionUID = 2686285918295677584L; // generated ID private final ActionMap actionMap; // main frame action map private final JMenu jmFile; // menu file private final JMenu jmEdit; // menu edit private final JMenu jmTrack; // menu track private final JMenu jmLayers; // menu layers private final JMenu jmWindow; // menu window private final JMenu jmUtilities; // menu utilities private final JMenu jmHelp; // menu help /** * Creates an instance of {@link MenuBar} * @param actionMap action map of the main frame */ public MenuBar(ActionMap actionMap) { super(); setBackground(Colors.MENU_BAR_COLOR); this.actionMap = actionMap; jmFile = new JMenu("File"); createFileMenu(); jmEdit = new JMenu("Edit"); createEditMenu(); jmTrack = new JMenu("Track"); createTrackMenu(); jmLayers = new JMenu("Layers"); createLayerMenu(); jmUtilities = new JMenu("Utilities"); createUtiliesMenu(); jmWindow = new JMenu("Window"); createWindowMenu(); jmHelp = new JMenu("Help"); createHelpMenu(); } /** * Creates Edit menu */ private void createEditMenu() { final JMenuItem jmiCopy = new JMenuItem(actionMap.get(TACopy.ACTION_KEY)); final JMenuItem jmiCut = new JMenuItem(actionMap.get(TACut.ACTION_KEY)); final JMenuItem jmiPaste = new JMenuItem(actionMap.get(TAPasteOrDrop.ACTION_KEY)); final JMenuItem jmiInsert = new JMenuItem(actionMap.get(TAInsert.ACTION_KEY)); final JMenuItem jmiDelete = new JMenuItem(actionMap.get(TADelete.ACTION_KEY)); jmEdit.addMenuListener(new MenuListener() { @Override public void menuCanceled(MenuEvent e) {} @Override public void menuDeselected(MenuEvent e) {} @Override public void menuSelected(MenuEvent e) { boolean isTrackSelected = MainFrame.getInstance().getTrackListPanel().getSelectedTrack() != null; jmiCopy.setEnabled(isTrackSelected); jmiCut.setEnabled(isTrackSelected); boolean isPasteEnable = MainFrame.getInstance().getTrackListPanel().isPasteEnable(); jmiPaste.setEnabled(isTrackSelected && isPasteEnable); jmiInsert.setEnabled(isTrackSelected); jmiDelete.setEnabled(isTrackSelected); } }); jmEdit.add(jmiCopy); jmEdit.add(jmiCut); jmEdit.add(jmiPaste); jmEdit.addSeparator(); jmEdit.add(jmiInsert); jmEdit.add(jmiDelete); add(jmEdit); } /** * Creates File menu */ private void createFileMenu() { jmFile.add(actionMap.get(PANewProject.ACTION_KEY)); jmFile.add(actionMap.get(PALoadProject.ACTION_KEY)); jmFile.addSeparator(); final JMenuItem jmiSaveProject = new JMenuItem(actionMap.get(PASaveProject.ACTION_KEY)); jmFile.add(jmiSaveProject); jmFile.add(actionMap.get(PASaveProjectAs.ACTION_KEY)); if(!Utils.isMacOS() || !LookAndFeels.isNativeLookAndFeel()) { jmFile.addSeparator(); jmFile.add(actionMap.get(PAExit.ACTION_KEY)); } jmFile.addMenuListener(new MenuListener() { @Override public void menuCanceled(MenuEvent e) {} @Override public void menuDeselected(MenuEvent e) {} @Override public void menuSelected(MenuEvent e) { jmiSaveProject.setEnabled(ProjectManager.getInstance().getProjectDirectory() != null); } }); add(jmFile); } /** * Creates Help menu */ private void createHelpMenu() { if (PACheckForUpdates.isUpdaterAvailable()) { jmHelp.add(actionMap.get(PACheckForUpdates.ACTION_KEY)); jmHelp.addSeparator(); } jmHelp.add(actionMap.get(PAReportBug.ACTION_KEY)); jmHelp.add(actionMap.get(PAContactUs.ACTION_KEY)); if (!Utils.isMacOS() || !LookAndFeels.isNativeLookAndFeel()) { jmHelp.add(actionMap.get(PAAbout.ACTION_KEY)); } jmHelp.addSeparator(); jmHelp.add(actionMap.get(PAHelp.ACTION_KEY)); if (!Utils.isMacOS() || !LookAndFeels.isNativeLookAndFeel()) { // on mac the option and about menu items are available from the // application menu so we don't need them in the help menu jmHelp.addSeparator(); jmHelp.add(actionMap.get(PAOption.ACTION_KEY)); } add(jmHelp); } /** * Creates Layer menu */ private void createLayerMenu() { jmLayers.addMenuListener(new MenuListener() { @Override public void menuCanceled(MenuEvent e) { jmLayers.removeAll(); } @Override public void menuDeselected(MenuEvent e) { jmLayers.removeAll(); } @Override public void menuSelected(MenuEvent e) { Track selectedTrack = MainFrame.getInstance().getTrackListPanel().getSelectedTrack(); if (selectedTrack == null) { JMenuItem noTrackSelected = new JMenuItem("No track selected"); noTrackSelected.setEnabled(false); jmLayers.add(noTrackSelected); } else { List<JMenu> layerMenus = LayerMenuFactory.createLayerMenusForTrack(selectedTrack); if (layerMenus.isEmpty()) { JMenuItem noLayerAvailable = new JMenuItem("No layer loaded on selected track"); noLayerAvailable.setEnabled(false); jmLayers.add(noLayerAvailable); } else { for (JMenu menu: layerMenus) { jmLayers.add(menu); } } } } }); add(jmLayers); } /** * Creates Track menu */ private void createTrackMenu() { jmTrack.addMenuListener(new MenuListener() { @Override public void menuCanceled(MenuEvent e) { jmTrack.removeAll(); } @Override public void menuDeselected(MenuEvent e) { jmTrack.removeAll(); } @Override public void menuSelected(MenuEvent e) { boolean isTrackSelected = MainFrame.getInstance().getTrackListPanel().getSelectedTrack() != null; if (isTrackSelected) { jmTrack.add(actionMap.get(TAAddLayer.ACTION_KEY)); if (ProjectManager.getInstance().isMultiGenomeProject()) { jmTrack.add(actionMap.get(TAAddVariantLayer.ACTION_KEY)); } jmTrack.add(actionMap.get(TAAddLayerFromDAS.ACTION_KEY)); jmTrack.addSeparator(); jmTrack.add(actionMap.get(TASaveTrack.ACTION_KEY)); jmTrack.add(actionMap.get(TASaveAsImage.ACTION_KEY)); jmTrack.addSeparator(); jmTrack.add(actionMap.get(TATrackSettings.ACTION_KEY)); } else { JMenuItem noTrackSelected = new JMenuItem("No track selected"); noTrackSelected.setEnabled(false); jmTrack.add(noTrackSelected); } } }); add(jmTrack); } /** * Creates Utilities menu */ private void createUtiliesMenu() { jmUtilities.add(actionMap.get(PASortFile.ACTION_KEY)); jmUtilities.add(actionMap.get(PARNAPosToDNAPos.ACTION_KEY)); jmUtilities.addSeparator(); jmUtilities.add(actionMap.get(PAShowWarningReport.ACTION_KEY)); jmUtilities.add(actionMap.get(PAShowErrorReport.ACTION_KEY)); add(jmUtilities); } /** * Creates View menu */ private void createWindowMenu() { final JCheckBoxMenuItem jcbmiMainFrame = new JCheckBoxMenuItem(actionMap.get(PAShowMainFrame.ACTION_KEY)); jcbmiMainFrame.setText("Main Frame"); final JCheckBoxMenuItem jcbmiWarningReport = new JCheckBoxMenuItem(actionMap.get(PAShowWarningReport.ACTION_KEY)); jcbmiWarningReport.setText("Warning Report"); final JCheckBoxMenuItem jcbmiExceptionReport = new JCheckBoxMenuItem(actionMap.get(PAShowErrorReport.ACTION_KEY)); jcbmiExceptionReport.setText("Error Report"); jmWindow.add(actionMap.get(PAFullScreen.ACTION_KEY)); jmWindow.addSeparator(); jmWindow.add(jcbmiMainFrame); jmWindow.add(jcbmiWarningReport); jmWindow.add(jcbmiExceptionReport); jmWindow.addMenuListener(new MenuListener() { @Override public void menuCanceled(MenuEvent e) {} @Override public void menuDeselected(MenuEvent e) {} @Override public void menuSelected(MenuEvent e) { jcbmiMainFrame.setSelected(MainFrame.getInstance().isActive()); jcbmiMainFrame.setEnabled(MainFrame.getInstance().isVisible()); jcbmiWarningReport.setSelected(WarningReportDialog.getInstance().isActive()); jcbmiWarningReport.setEnabled(WarningReportDialog.getInstance().isVisible()); jcbmiExceptionReport.setSelected(ExceptionReportDialog.getInstance().isActive()); jcbmiExceptionReport.setEnabled(ExceptionReportDialog.getInstance().isVisible()); } }); add(jmWindow); } @Override public void setEnabled(boolean enabled) { for (int i = 0; i < getMenuCount(); i++) { JMenu menu = getMenu(i); if (menu != null) { menu.setEnabled(enabled); } } super.setEnabled(enabled); } }