/* * 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.controller.listener.OpenPropertyDialogActionListener; import de.sep2011.funckit.controller.listener.edit.CopyActionListener; import de.sep2011.funckit.controller.listener.edit.CutActionListener; 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.editpanel.EditPanelContextMenuBrickListener; import de.sep2011.funckit.controller.listener.project.OpenAsNewPojectActionListener; import de.sep2011.funckit.model.graphmodel.Brick; import de.sep2011.funckit.model.graphmodel.Component; import de.sep2011.funckit.model.graphmodel.Element; import de.sep2011.funckit.model.sessionmodel.EditPanelModel; import de.sep2011.funckit.model.sessionmodel.NewBrickListManager; import de.sep2011.funckit.model.sessionmodel.SessionModel; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import java.awt.Toolkit; import java.util.List; import java.util.Set; import static de.sep2011.funckit.util.internationalization.Language.tr; import static de.sep2011.funckit.model.sessionmodel.SessionModel.ViewType.VIEW_TYPE_ELEANING_SOLVE; import static de.sep2011.funckit.model.sessionmodel.SessionModel.ViewType.VIEW_TYPE_STANDALONE; import static java.awt.event.KeyEvent.VK_A; import static java.awt.event.KeyEvent.VK_C; 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; public class ContextMenu extends JPopupMenu { private static final long serialVersionUID = 5294294952347128848L; private JMenuItem undoItem; private JMenuItem redoItem; private final EditPanelModel editPanelModel; private final View view; private Multimap<Object, SessionModel.ViewType> viewTypeObjectMap; ContextMenu(View view, EditPanelModel editPanelModel) { viewTypeObjectMap = HashMultimap.create(); this.editPanelModel = editPanelModel; this.view = view; this.addPopupMenuListener(new FunckitPopupMenuListener()); } /** * method to add the Cut functionality to the Menu. */ private void addCut(View view) { JMenuItem cutItem = new JMenuItem(tr("menuBar.edit.cut")); viewTypeObjectMap.put(cutItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(cutItem, VIEW_TYPE_ELEANING_SOLVE); cutItem.addActionListener(new CutActionListener(view, view.getController())); cutItem.setAccelerator(getKeyStroke(VK_X, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); addViewTypeDependant(cutItem); } /** * method to add the Copy functionality to the Menu. */ private void addCopy(View view) { JMenuItem copyItem = new JMenuItem(tr("menuBar.edit.copy")); copyItem.addActionListener(new CopyActionListener(view, view.getController())); copyItem.setAccelerator(getKeyStroke(VK_C, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); viewTypeObjectMap.put(copyItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(copyItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(copyItem); } /** * method to add the Paste functionality to the Menu. */ private void addPaste(View view) { JMenuItem pasteItem = new JMenuItem(tr("menuBar.edit.paste")); pasteItem.addActionListener(new PasteActionListener(view, view.getController())); pasteItem.setAccelerator(getKeyStroke(VK_V, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); viewTypeObjectMap.put(pasteItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(pasteItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(pasteItem); } private void addCreate(final View view) { JMenuItem createBrickItem = new JMenu(tr("menuBar.edit.CreateBrick")); viewTypeObjectMap.put(createBrickItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(createBrickItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(createBrickItem); JMenuItem createInternalComponentItem = new JMenu( tr("menuBar.edit.CreateInternalComponent")); viewTypeObjectMap.put(createInternalComponentItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(createInternalComponentItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(createInternalComponentItem); JMenuItem createExternalComponentItem = new JMenu( tr("menuBar.edit.CreateExternalComponent")); viewTypeObjectMap.put(createExternalComponentItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(createExternalComponentItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(createExternalComponentItem); NewBrickListManager newBrickListManager = view.getSessionModel().getNewBrickListManager(); List<Brick> brickList = newBrickListManager.getNewBrickList(); for (final Brick b : brickList) { switch (newBrickListManager.getType(b)) { case TYPE_BRICK: { JMenuItem createSelectBrickItem = new JMenuItem(b.getName()); createSelectBrickItem.addMouseListener(new EditPanelContextMenuBrickListener(view .getSessionModel(), view.getController(), b)); createBrickItem.add(createSelectBrickItem); break; } case TYPE_INTERNAL_COMPONENT: { JMenuItem createSelectInternalComponentItem = new JMenuItem(b.getName()); createSelectInternalComponentItem .addMouseListener(new EditPanelContextMenuBrickListener(view.getSessionModel(), view.getController(), b)); createInternalComponentItem.add(createSelectInternalComponentItem); break; } case TYPE_EXTERNAL_COMPONENT: { JMenuItem createSelectExternalComponentItem = new JMenuItem(b.getName()); createSelectExternalComponentItem .addMouseListener(new EditPanelContextMenuBrickListener(view.getSessionModel(), view.getController(), b)); createExternalComponentItem.add(createSelectExternalComponentItem); break; } } } } private void addUndo() { undoItem = new JMenuItem(tr("menuBar.edit.undo")); undoItem.addActionListener(new UndoActionListener(view, view.getController())); undoItem.setAccelerator(getKeyStroke(VK_Z, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); viewTypeObjectMap.put(undoItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(undoItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(undoItem); } private void addRedo() { redoItem = new JMenuItem(tr("menuBar.edit.redo")); redoItem.addActionListener(new RedoActionListener(view, view.getController())); redoItem.setAccelerator(getKeyStroke(VK_Y, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); viewTypeObjectMap.put(redoItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(redoItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(redoItem); } private void addSelectAll() { JMenuItem selectAllItem = new JMenuItem(tr("menuBar.edit.selectAll")); selectAllItem.addActionListener(new SelectAllActionListener(view, view.getController())); selectAllItem.setAccelerator(getKeyStroke(VK_A, Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask())); viewTypeObjectMap.put(selectAllItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(selectAllItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(selectAllItem); } private void addProperties() { JMenuItem propertiesItem = new JMenuItem(tr("contextMenu.properties")); propertiesItem.addActionListener(new OpenPropertyDialogActionListener(view, view .getController())); viewTypeObjectMap.put(propertiesItem, VIEW_TYPE_STANDALONE); viewTypeObjectMap.put(propertiesItem, VIEW_TYPE_ELEANING_SOLVE); addViewTypeDependant(propertiesItem); } private void addOpenAsNewComponent(Component component) { JMenuItem openAsNewComponentItem = new JMenuItem(tr("contextMenu.openAsNewComponent")); openAsNewComponentItem.addActionListener(new OpenAsNewPojectActionListener(view, view .getController(), component.getType())); viewTypeObjectMap.put(openAsNewComponentItem, VIEW_TYPE_STANDALONE); addViewTypeDependant(openAsNewComponentItem); } private void removeAllFromContextMenu() { this.removeAll(); } public void addViewTypeDependant(JMenuItem item) { if(viewTypeObjectMap.containsEntry(item, view.getSessionModel().getViewType())) { add(item); } } private class FunckitPopupMenuListener implements PopupMenuListener { @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { removeAllFromContextMenu(); // Is not in the simulation and has main circuit if (!view.getSessionModel().getCurrentProject().hasSimulation() && editPanelModel.hasMainCircuit()) { // Nothing is selected if (editPanelModel.getSelectedElements().isEmpty()) { } addCreate(view); addSeparator(); addUndo(); addRedo(); addSeparator(); addSelectAll(); undoItem.setEnabled(view.getSessionModel().getCurrentGraphCommandDispatcher() .canStepBack()); redoItem.setEnabled(view.getSessionModel().getCurrentGraphCommandDispatcher() .canStepForward()); boolean selElemeEmpty = editPanelModel.getSelectedElements().isEmpty(); boolean copybuffEmpty = view.getSessionModel().getCopyBuffer().getElements() .isEmpty(); if (!selElemeEmpty || !copybuffEmpty) { addSeparator(); } if (!selElemeEmpty) { addCut(view); addCopy(view); } if (!copybuffEmpty) { addPaste(view); } if (!editPanelModel.getSelectedElements().isEmpty()) { // JUST ONE BRICK SELECTED Set<Element> elementList = editPanelModel.getSelectedElements(); if (elementList.size() == 1) { addSeparator(); Element selectedElem = elementList.iterator().next(); addProperties(); if (selectedElem instanceof Component) { addOpenAsNewComponent((Component) selectedElem); } } } // is in the simulation } else { } } @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { removeAllFromContextMenu(); } @Override public void popupMenuCanceled(PopupMenuEvent e) { removeAllFromContextMenu(); } } }