/* * funCKit - functional Circuit Kit * Copyright (C) 2013 Lukas Elsner <open@mindrunner.de> * Copyright (C) 2013 Peter Dahlberg <catdog2@tuxzone.org> * Copyright (C) 2013 Julian Stier <mail@julian-stier.de> * Copyright (C) 2013 Sebastian Vetter <mail@b4sti.eu> * Copyright (C) 2013 Thomas Poxrucker <poxrucker_t@web.de> * Copyright (C) 2013 Alexander Treml <alex.treml@directbox.com> * * 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/>. */ package de.sep2011.funckit.view; import de.sep2011.funckit.Application; import de.sep2011.funckit.Application.OperatingSystem; import de.sep2011.funckit.controller.listener.AboutFunckitActionListener; import de.sep2011.funckit.controller.listener.ExitApplicationActionListener; import de.sep2011.funckit.controller.listener.HelpActionListener; import de.sep2011.funckit.controller.listener.edit.CopyActionListener; import de.sep2011.funckit.controller.listener.edit.CutActionListener; import de.sep2011.funckit.controller.listener.edit.DeleteSelectedElementsActionListener; import de.sep2011.funckit.controller.listener.edit.PasteActionListener; import de.sep2011.funckit.controller.listener.edit.RedoActionListener; import de.sep2011.funckit.controller.listener.edit.SelectAllActionListener; import de.sep2011.funckit.controller.listener.edit.UndoActionListener; import de.sep2011.funckit.controller.listener.edit.WizardActionListener; import de.sep2011.funckit.controller.listener.project.ExportComponentActionListener; import de.sep2011.funckit.controller.listener.project.OpenActionListener; import de.sep2011.funckit.controller.listener.project.SaveFileActionListener; import de.sep2011.funckit.controller.listener.project.SaveFileAsActionListener; import de.sep2011.funckit.controller.listener.settings.ChangeColorActionListener; import de.sep2011.funckit.controller.listener.settings.GridLockActionListener; import de.sep2011.funckit.controller.listener.settings.GridOnOffActionListener; import de.sep2011.funckit.controller.listener.settings.LafChangeActionListener; import de.sep2011.funckit.controller.listener.settings.LanguageChangeActionListener; import de.sep2011.funckit.controller.listener.settings.LowQualityOnOffActionListener; import de.sep2011.funckit.controller.listener.settings.RealTimeValidationOnOffActionListener; import de.sep2011.funckit.controller.listener.settings.RestoreDefaultActionListener; import de.sep2011.funckit.controller.listener.settings.SimulationUndoActionListener; import de.sep2011.funckit.controller.listener.settings.ToggleTooltipsActionListener; import de.sep2011.funckit.controller.listener.view.ModelFitsIntoCircuitListener; import de.sep2011.funckit.controller.listener.view.Zoom100PercentListener; import de.sep2011.funckit.controller.listener.view.ZoomInActionListener; import de.sep2011.funckit.controller.listener.view.ZoomOutActionListener; import de.sep2011.funckit.model.sessionmodel.EditPanelModel; import de.sep2011.funckit.model.sessionmodel.Project; import de.sep2011.funckit.model.sessionmodel.SessionModel; import de.sep2011.funckit.model.sessionmodel.Settings; import de.sep2011.funckit.observer.EditPanelModelInfo; import de.sep2011.funckit.observer.EditPanelModelObserver; import de.sep2011.funckit.observer.ProjectInfo; import de.sep2011.funckit.observer.ProjectObserver; import de.sep2011.funckit.observer.SessionModelInfo; import de.sep2011.funckit.observer.SessionModelObserver; import de.sep2011.funckit.observer.SettingsInfo; import de.sep2011.funckit.observer.SettingsObserver; import de.sep2011.funckit.util.FunckitGuiUtil; import de.sep2011.funckit.util.internationalization.Language; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.UIManager; import javax.swing.UIManager.LookAndFeelInfo; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedHashSet; import java.util.Locale; import java.util.Set; import static de.sep2011.funckit.util.internationalization.Language.tr; import static java.awt.event.KeyEvent.ALT_MASK; import static java.awt.event.KeyEvent.SHIFT_MASK; import static java.awt.event.KeyEvent.VK_0; import static java.awt.event.KeyEvent.VK_A; import static java.awt.event.KeyEvent.VK_BACK_SPACE; import static java.awt.event.KeyEvent.VK_C; import static java.awt.event.KeyEvent.VK_DELETE; import static java.awt.event.KeyEvent.VK_E; import static java.awt.event.KeyEvent.VK_ENTER; import static java.awt.event.KeyEvent.VK_F1; import static java.awt.event.KeyEvent.VK_G; import static java.awt.event.KeyEvent.VK_MINUS; import static java.awt.event.KeyEvent.VK_N; import static java.awt.event.KeyEvent.VK_O; import static java.awt.event.KeyEvent.VK_PLUS; import static java.awt.event.KeyEvent.VK_Q; import static java.awt.event.KeyEvent.VK_S; import static java.awt.event.KeyEvent.VK_V; import static java.awt.event.KeyEvent.VK_X; import static java.awt.event.KeyEvent.VK_Y; import static java.awt.event.KeyEvent.VK_Z; import static javax.swing.KeyStroke.getKeyStroke; /** * Represents menu bar object for access to most actions like opening, saving or * importing projects or change settings. */ public class FunckitMenuBar extends JMenuBar implements SessionModelObserver, SettingsObserver, ProjectObserver, EditPanelModelObserver { private static final long serialVersionUID = 957124217216842770L; public static final String[] EDITABLE_COLORS = new String[]{ Settings.ELEMENT_BORDER_COLOR, Settings.ELEMENT_FILL_COLOR, Settings.ELEMENT_NAME_COLOR, Settings.ELEMENT_ERROR_BORDER_COLOR, Settings.ELEMENT_SELECTED_BORDER_COLOR, Settings.ELEMENT_SELECTED_FILL_COLOR, Settings.ELEMENT_OUTPUT_LABEL_COLOR, Settings.ELEMENT_INFO_BORDER_COLOR, Settings.ELEMENT_INFO_FILL_COLOR, Settings.ELEMENT_ACTIVE_BORDER_COLOR, Settings.ELEMENT_ACTIVE_FILL_COLOR, Settings.WIRE_COLOR, Settings.GATE_FILL_COLOR, Settings.GATE_BORDER_COLOR, Settings.SWITCH_BORDER_COLOR, Settings.SWITCH_FILL_COLOR, Settings.LIGHT_BORDER_COLOR, Settings.LIGHT_FILL_COLOR, Settings.GHOST_BORDER_COLOR, Settings.GHOST_FILL_COLOR, Settings.GHOST_TEXT_COLOR, Settings.ELEMENT_INPUT_LABEL_COLOR, Settings.ELEMENT_OUTPUT_LABEL_COLOR, Settings.SELECTION_BORDER_COLOR, Settings.SELECTION_FILL_COLOR }; private final View view; /* Menu items for file menu. */ /** * Item for creating a new project. */ private JMenuItem newProjectItem; /** * Item for loading an existing project. */ private JMenuItem openItem; /** * Item for saving current project. */ private JMenuItem saveItem; /** * Item for saving as current project. */ private JMenuItem saveAsItem; /** * Item for importing circuits. */ // JMenuItem importComponentItem; /** * Item for exporting circuits. */ private JMenuItem exportComponentItem; /** * Button to quit application. */ private JMenuItem exitItem; /* Items for edit menu. */ /** * Item for undoing edit actions. */ private JMenuItem undoItem; /** * Item for redoing edit actions. */ private JMenuItem redoItem; /** * Item for deletion of elements on the current panel model. */ private JMenuItem deleteElementsItem; /* Items for help menu. */ /** * Item for opening a help system. */ private JMenuItem helpItem; /** * Item for zoom 100 percent. */ private JMenuItem hundredProZoomItem; /** * Item for displaying author and version information. */ private JMenuItem aboutItem; /* Menu items for settings menu. */ /** * Item for de- or activating live check. */ private JCheckBoxMenuItem liveCheckItem; /** * Item for de- or activating the gridlock. */ private JCheckBoxMenuItem gridLockItem; /** * Item for de- or activating the step back in simulation. */ private JCheckBoxMenuItem simulationUndoItem; /* Items for view edit menu. */ /** * Item for displaying elements bigger. */ private JMenuItem biggerItem; /** * Item for displaying elements smaller. */ private JMenuItem smallerItem; /** * Ja fuer was wohl, alla? */ private JMenuItem modelFitsInView; /** * Item for toggling grid on edit panel. */ private JCheckBoxMenuItem toggleGridItem; private Set<JCheckBoxMenuItem> languageItems; private JMenuItem copyItem; private JMenuItem pasteItem; private JMenuItem cutItem; private JMenu lafMenu; private JCheckBoxMenuItem toggleLowQualityItem; private JMenuItem selectAllItem; private JMenuItem wizardItem; private JCheckBoxMenuItem toggleTooltipsItem; private JMenu colorMenu; /** * Create a new {@link FunckitMenuBar}. * * @param view the associated View object */ public FunckitMenuBar(View view) { this.view = view; createFileMenu(); createEditMenu(); createSettingsMenu(); createViewMenu(); createHelpMenu(); updateItemState(); initObserver(); } private void createFileMenu() { /* * Following the menu with keyname "file" is created. It is structured * in several items separated by whitespaces. Sometimes gui separators * are inserted between them. For better overview keep construction of * common items in one context (without whitespaces). */ JMenu fileMenu = new JMenu(tr("menuBar.file")); fileMenu.setMnemonic(tr("menuBar.Mnemonic.file").charAt(0)); switch (view.getSessionModel().getViewType()) { case VIEW_TYPE_STANDALONE: add(fileMenu); break; } newProjectItem = new JMenuItem(tr("menuBar.file.newProject")); newProjectItem.setAccelerator(getKeyStroke(VK_N, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); newProjectItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { view.openNewProject(null); } }); newProjectItem.setMnemonic(tr("menuBar.Mnemonic.file.newProject").charAt(0)); openItem = new JMenuItem(tr("menuBar.file.open...")); openItem.addActionListener(new OpenActionListener(view, view.getController())); openItem.setAccelerator(getKeyStroke(VK_O, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); openItem.setMnemonic(tr("menuBar.Mnemonic.file.open...").charAt(0)); saveItem = new JMenuItem(tr("menuBar.file.save")); saveItem.addActionListener(new SaveFileActionListener(view, view.getController())); saveItem.setAccelerator(getKeyStroke(VK_S, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); saveItem.setMnemonic(tr("menuBar.Mnemonic.file.save").charAt(0)); saveAsItem = new JMenuItem(tr("menuBar.file.saveAs...")); saveAsItem.addActionListener(new SaveFileAsActionListener(view, view.getController())); saveAsItem.setAccelerator(getKeyStroke(VK_S, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask() | SHIFT_MASK)); saveAsItem.setMnemonic(tr("menuBar.Mnemonic.file.saveAs...").charAt(0)); exportComponentItem = new JMenuItem(tr("menuBar.file.exportComponent...")); exportComponentItem.setAccelerator(getKeyStroke(VK_E, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); exportComponentItem.addActionListener(new ExportComponentActionListener(view, view .getController())); exportComponentItem.setMnemonic(tr("menuBar.Mnemonic.file.exportComponent...").charAt(0)); exitItem = new JMenuItem(tr("menuBar.file.exit")); exitItem.setAccelerator(getKeyStroke(VK_Q, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); exitItem.addActionListener(new ExitApplicationActionListener(view, view.getController())); exitItem.setMnemonic(tr("menuBar.Mnemonic.file.exit").charAt(0)); switch (view.getSessionModel().getViewType()) { case VIEW_TYPE_STANDALONE: fileMenu.add(newProjectItem); fileMenu.addSeparator(); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(saveAsItem); fileMenu.addSeparator(); fileMenu.add(exportComponentItem); fileMenu.addSeparator(); fileMenu.add(exitItem); break; } } private void createEditMenu() { // create edit menu JMenu editMenu = new JMenu(tr("menuBar.edit")); editMenu.setMnemonic(tr("menuBar.Mnemonic.edit").charAt(0)); switch (view.getSessionModel().getViewType()) { case VIEW_TYPE_PRESENTER: break; default: add(editMenu); break; } undoItem = new JMenuItem(tr("menuBar.edit.undo")); undoItem.addActionListener(new UndoActionListener(view, view.getController())); undoItem.setAccelerator(getKeyStroke(VK_Z, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); undoItem.setMnemonic(tr("menuBar.Mnemonic.edit.undo").charAt(0)); redoItem = new JMenuItem(tr("menuBar.edit.redo")); redoItem.addActionListener(new RedoActionListener(view, view.getController())); redoItem.setAccelerator(getKeyStroke(VK_Y, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); redoItem.setMnemonic(tr("menuBar.Mnemonic.edit.redo").charAt(0)); cutItem = new JMenuItem(tr("menuBar.edit.cut")); cutItem.addActionListener(new CutActionListener(view, view.getController())); cutItem.setAccelerator(getKeyStroke(VK_X, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); cutItem.setMnemonic(tr("menuBar.Mnemonic.edit.cut").charAt(0)); copyItem = new JMenuItem(tr("menuBar.edit.copy")); copyItem.addActionListener(new CopyActionListener(view, view.getController())); copyItem.setAccelerator(getKeyStroke(VK_C, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); copyItem.setMnemonic(tr("menuBar.Mnemonic.edit.copy").charAt(0)); pasteItem = new JMenuItem(tr("menuBar.edit.paste")); pasteItem.addActionListener(new PasteActionListener(view, view.getController())); pasteItem.setAccelerator(getKeyStroke(VK_V, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); pasteItem.setMnemonic(tr("menuBar.Mnemonic.edit.paste").charAt(0)); deleteElementsItem = new JMenuItem(tr("menuBar.edit.delete")); deleteElementsItem.addActionListener(new DeleteSelectedElementsActionListener(view, view .getController())); if (Application.OS == OperatingSystem.OSX) { FunckitGuiUtil.addButtonClickKeystroke(deleteElementsItem, getKeyStroke(VK_BACK_SPACE, 0)); } deleteElementsItem.setAccelerator(getKeyStroke(VK_DELETE, 0)); deleteElementsItem.setMnemonic(tr("menuBar.Mnemonic.edit.delete").charAt(0)); selectAllItem = new JMenuItem(tr("menuBar.edit.selectAll")); selectAllItem.addActionListener(new SelectAllActionListener(view, view.getController())); selectAllItem.setAccelerator(getKeyStroke(VK_A, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); selectAllItem.setMnemonic(tr("menuBar.Mnemonic.edit.selectAll").charAt(0)); wizardItem = new JMenuItem(tr("menuBar.edit.wizard")); wizardItem.addActionListener(new WizardActionListener(view, view.getController())); wizardItem.setAccelerator(getKeyStroke(VK_ENTER, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask() | ALT_MASK)); wizardItem.setMnemonic(tr("menuBar.Mnemonic.edit.wizard").charAt(0)); editMenu.add(undoItem); editMenu.add(redoItem); editMenu.addSeparator(); editMenu.add(cutItem); editMenu.add(copyItem); editMenu.add(pasteItem); editMenu.addSeparator(); editMenu.add(deleteElementsItem); editMenu.add(selectAllItem); editMenu.addSeparator(); editMenu.add(wizardItem); } private void createSettingsMenu() { Settings settings = view.getSessionModel().getSettings(); // create settings menu JMenu settingsMenu = new JMenu(tr("menuBar.settings")); settingsMenu.setMnemonic(tr("menuBar.Mnemonic.settings").charAt(0)); add(settingsMenu); JMenu languageMenu = new JMenu(tr("menuBar.settings.language")); languageMenu.setMnemonic(tr("menuBar.Mnemonic.settings.language").charAt(0)); lafMenu = new JMenu(tr("menuBar.settings.lafSubMenu")); lafMenu.setMnemonic(tr("menuBar.Mnemonic.settings.lafSubMenu").charAt(0)); fillLafSubmenu(); languageItems = new LinkedHashSet<JCheckBoxMenuItem>(); for (Locale loc : Language.getAvailableLocales()) { JCheckBoxMenuItem languageItem = new JCheckBoxMenuItem(loc.getDisplayLanguage()); languageMenu.add(languageItem); languageItem.setActionCommand(loc.getLanguage()); languageItem.addActionListener(new LanguageChangeActionListener(view, view .getController())); languageItem.setSelected(loc.equals(Language.getCurrentLocale())); languageItems.add(languageItem); } liveCheckItem = new JCheckBoxMenuItem(tr("menuBar.settings.liveCheck")); liveCheckItem.setMnemonic(tr("menuBar.Mnemonic.settings.liveCheck").charAt(0)); liveCheckItem.addActionListener(new RealTimeValidationOnOffActionListener(view)); liveCheckItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.REALTIME_VALIDATION)); gridLockItem = new JCheckBoxMenuItem(tr("menuBar.settings.lockGrid")); gridLockItem.addActionListener(new GridLockActionListener(view, view.getController())); gridLockItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.GRID_LOCK)); gridLockItem.setMnemonic(tr("menuBar.Mnemonic.settings.lockGrid").charAt(0)); simulationUndoItem = new JCheckBoxMenuItem(tr("menuBar.settings.simulationUndo")); simulationUndoItem.addActionListener(new SimulationUndoActionListener(view, view .getController())); simulationUndoItem.setSelected(settings .getBoolean(Settings.SIMULATION_UNDO_ENABLED)); simulationUndoItem.setMnemonic(tr("menuBar.Mnemonic.settings.simulationUndo").charAt(0)); toggleLowQualityItem = new JCheckBoxMenuItem(tr("menuBar.settings.toggleLowQuality")); toggleLowQualityItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.LOW_RENDERING_QUALITY_MODE)); toggleLowQualityItem .setMnemonic(tr("menuBar.Mnemonic.settings.toggleLowQuality").charAt(0)); toggleLowQualityItem.addActionListener(new LowQualityOnOffActionListener(view, view .getController())); toggleTooltipsItem = new JCheckBoxMenuItem( tr("menuBar.settings.toggleTooltips")); toggleTooltipsItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.SHOW_TOOLTIPS)); toggleTooltipsItem.setMnemonic(tr("menuBar.Mnemonic.settings.toggleTooltips").charAt(0)); toggleTooltipsItem.addActionListener(new ToggleTooltipsActionListener(view, view .getController())); JMenuItem restoreDefaultItem = new JMenuItem(tr("menuBar.settings.restoreDefault")); restoreDefaultItem.addActionListener(new RestoreDefaultActionListener(view, view .getController())); if (settings.getBoolean(Settings.EXPERT_MODE)) { colorMenu = new JMenu(tr("menuBar.settings.colorMenu")); colorMenu.setMnemonic(tr("menuBar.Mnemonic.settings.colorMenu").charAt(0)); fillColorMenu(); settingsMenu.add(colorMenu); } switch (view.getSessionModel().getViewType()) { case VIEW_TYPE_ELEANING_SOLVE: settingsMenu.add(liveCheckItem); settingsMenu.add(gridLockItem); settingsMenu.add(simulationUndoItem); settingsMenu.add(toggleLowQualityItem); settingsMenu.add(toggleTooltipsItem); break; case VIEW_TYPE_STANDALONE : settingsMenu.add(languageMenu); settingsMenu.add(lafMenu); settingsMenu.addSeparator(); settingsMenu.add(liveCheckItem); settingsMenu.add(gridLockItem); settingsMenu.add(simulationUndoItem); settingsMenu.add(toggleLowQualityItem); settingsMenu.add(toggleTooltipsItem); settingsMenu.addSeparator(); settingsMenu.add(restoreDefaultItem); break; case VIEW_TYPE_PRESENTER: settingsMenu.add(gridLockItem); settingsMenu.add(simulationUndoItem); settingsMenu.add(toggleLowQualityItem); settingsMenu.add(toggleTooltipsItem); break; } } private void fillColorMenu() { for (String color : EDITABLE_COLORS) { JMenuItem menuItem = new JMenuItem(tr(color)); menuItem.setActionCommand(color); menuItem.addActionListener(new ChangeColorActionListener(view, view.getController())); colorMenu.add(menuItem); } } private void createViewMenu() { // create view menu JMenu viewMenu = new JMenu(tr("menuBar.view")); viewMenu.setMnemonic(tr("menuBar.Mnemonic.view").charAt(0)); add(viewMenu); biggerItem = new JMenuItem(tr("menuBar.view.zoomIn")); biggerItem.addActionListener(new ZoomInActionListener(view, view.getController())); biggerItem.setAccelerator(getKeyStroke(VK_PLUS, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); biggerItem.setMnemonic(tr("menuBar.Mnemonic.view.zoomIn").charAt(0)); smallerItem = new JMenuItem(tr("menuBar.view.zoomOut")); smallerItem.addActionListener(new ZoomOutActionListener(view, view.getController())); smallerItem.setAccelerator(getKeyStroke(VK_MINUS, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); smallerItem.setMnemonic(tr("menuBar.Mnemonic.view.zoomOut").charAt(0)); hundredProZoomItem = new JMenuItem(tr("menuBar.view.zoom100pro")); hundredProZoomItem .addActionListener(new Zoom100PercentListener(view, view.getController())); hundredProZoomItem.setAccelerator(getKeyStroke(VK_0, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); hundredProZoomItem.setMnemonic(tr("menuBar.Mnemonic.view.zoom100pro").charAt(0)); modelFitsInView = new JMenuItem(tr("menuBar.view.modelFitsInView")); modelFitsInView.addActionListener(new ModelFitsIntoCircuitListener(view, view .getController())); // modelFitsInView.setAccelerator(); modelFitsInView.setMnemonic(tr("menuBar.Mnemonic.view.modelFitsInView").charAt(0)); toggleGridItem = new JCheckBoxMenuItem(tr("menuBar.view.toggleGrid")); toggleGridItem.addActionListener(new GridOnOffActionListener(view, view.getController())); toggleGridItem.setAccelerator(getKeyStroke(VK_G, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); toggleGridItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.SHOW_GRID)); toggleGridItem.setMnemonic(tr("menuBar.Mnemonic.view.toggleGrid").charAt(0)); viewMenu.add(biggerItem); viewMenu.add(smallerItem); viewMenu.add(hundredProZoomItem); viewMenu.addSeparator(); viewMenu.add(modelFitsInView); viewMenu.addSeparator(); viewMenu.add(toggleGridItem); } private void createHelpMenu() { // create help menu JMenu helpMenu = new JMenu(tr("menuBar.help")); helpMenu.setMnemonic(tr("menuBar.Mnemonic.help").charAt(0)); add(helpMenu); helpItem = new JMenuItem(tr("menuBar.help.funckitHelp")); helpItem.setAccelerator(getKeyStroke(VK_F1, 0)); helpItem.addActionListener(new HelpActionListener(view, view.getController())); helpItem.setMnemonic(tr("menuBar.Mnemonic.help.funckitHelp").charAt(0)); aboutItem = new JMenuItem(tr("menuBar.help.about...")); aboutItem.addActionListener(new AboutFunckitActionListener(view, view.getController())); aboutItem.setMnemonic(tr("menuBar.Mnemonic.help.about...").charAt(0)); helpMenu.add(helpItem); helpMenu.addSeparator(); helpMenu.add(aboutItem); } private void fillLafSubmenu() { for (LookAndFeelInfo lafi : UIManager.getInstalledLookAndFeels()) { JMenuItem mi = new JMenuItem(lafi.getName()); mi.setActionCommand(lafi.getClassName()); mi.addActionListener(new LafChangeActionListener(view, view.getController())); lafMenu.add(mi); } } private void initObserver() { SessionModel sm = view.getSessionModel(); sm.addObserver(this); sm.getSettings().addObserver(this); for (Project pro : sm.getProjects()) { pro.addObserver(this); for (EditPanelModel epm : pro.getOpenedEditPanelModels()) { epm.addObserver(this); } } } /** * Grey out item and related. */ private void updateItemState() { SessionModel sm = view.getSessionModel(); Project currentProject = sm.getCurrentProject(); EditPanelModel editPanelModel = currentProject == null ? null : currentProject .getSelectedEditPanelModel(); saveItem.setEnabled(currentProject != null); saveAsItem.setEnabled(currentProject != null); /* first handle simulation */ if (currentProject != null && currentProject.getSimulation() != null) { newProjectItem.setEnabled(true); openItem.setEnabled(true); saveItem.setEnabled(true); saveAsItem.setEnabled(true); // importComponentItem.setEnabled(false); exportComponentItem.setEnabled(false); copyItem.setEnabled(false); cutItem.setEnabled(false); pasteItem.setEnabled(false); undoItem.setEnabled(false); redoItem.setEnabled(false); selectAllItem.setEnabled(false); wizardItem.setEnabled(false); } else { // here we handle edit mode newProjectItem.setEnabled(true); openItem.setEnabled(true); saveItem.setEnabled(true); saveAsItem.setEnabled(true); // importComponentItem.setEnabled(true); exportComponentItem.setEnabled(true); copyItem.setEnabled(true); cutItem.setEnabled(true); pasteItem.setEnabled(true); wizardItem.setEnabled(true); if (currentProject == null) { undoItem.setEnabled(false); redoItem.setEnabled(false); saveItem.setEnabled(false); saveAsItem.setEnabled(false); wizardItem.setEnabled(false); } else { undoItem.setEnabled(currentProject.getGraphCommandDispatcher().canStepBack()); redoItem.setEnabled(currentProject.getGraphCommandDispatcher().canStepForward()); saveItem.setEnabled(true); saveAsItem.setEnabled(true); } if (editPanelModel == null) { copyItem.setEnabled(false); cutItem.setEnabled(false); pasteItem.setEnabled(false); deleteElementsItem.setEnabled(false); biggerItem.setEnabled(false); smallerItem.setEnabled(false); hundredProZoomItem.setEnabled(false); modelFitsInView.setEnabled(false); selectAllItem.setEnabled(false); wizardItem.setEnabled(false); } else { copyItem.setEnabled(!editPanelModel.getSelectedElements().isEmpty()); cutItem.setEnabled(!editPanelModel.getSelectedElements().isEmpty()); pasteItem.setEnabled(!sm.getCopyBuffer().getElements().isEmpty()); deleteElementsItem.setEnabled(!editPanelModel.getSelectedElements().isEmpty()); biggerItem.setEnabled(true); smallerItem.setEnabled(true); hundredProZoomItem.setEnabled(true); modelFitsInView.setEnabled(true); selectAllItem.setEnabled(true); } } } @Override public void sessionModelChanged(SessionModel source, SessionModelInfo i) { if (i.hasProjectAdded()) { i.getChangedProject().addObserver(this); for (EditPanelModel epm : i.getChangedProject().getOpenedEditPanelModels()) { epm.addObserver(this); } } if (i.hasProjectRemoved()) { i.getChangedProject().deleteObserver(this); for (EditPanelModel epm : i.getChangedProject().getOpenedEditPanelModels()) { epm.deleteObserver(this); } } updateItemState(); } @Override public void settingsChanged(Settings source, SettingsInfo i) { if (Settings.Language.equals(i.getChangedSetting())) { Locale loc = new Locale(source.getString(Settings.Language)); for (JCheckBoxMenuItem langi : languageItems) { langi.setSelected(loc.equals(new Locale(langi.getActionCommand()))); } } if (Settings.LOW_RENDERING_QUALITY_MODE.equals(i.getChangedSetting())) { toggleLowQualityItem .setSelected(source.getBoolean(Settings.LOW_RENDERING_QUALITY_MODE)); } if (i.getChangedSetting().equals(Settings.SIMULATION_UNDO_ENABLED)) { simulationUndoItem.setSelected(source.getBoolean(Settings.SIMULATION_UNDO_ENABLED)); } if (i.getChangedSetting().equals(Settings.GRID_LOCK)) { gridLockItem.setSelected(source.getBoolean(Settings.GRID_LOCK)); } if (i.getChangedSetting().equals(Settings.SHOW_GRID)) { toggleGridItem.setSelected(source.getBoolean(Settings.SHOW_GRID)); } if (i.getChangedSetting().equals(Settings.REALTIME_VALIDATION)) { liveCheckItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.REALTIME_VALIDATION)); } if (i.getChangedSetting().equals(Settings.SHOW_TOOLTIPS)) { toggleTooltipsItem.setSelected(view.getSessionModel().getSettings() .getBoolean(Settings.SHOW_TOOLTIPS)); } } @Override public void projectChanged(Project source, ProjectInfo i) { if (i.hasEditPanelModelAdded()) { i.getChangedModel().addObserver(this); } if (i.hasEditPanelModelRemoved()) { i.getChangedModel().deleteObserver(this); } updateItemState(); } @Override public void editPanelModelChanged(EditPanelModel source, EditPanelModelInfo i) { updateItemState(); } }