package com.horstmann.violet.workspace.editorpart.behavior;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.util.List;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import com.horstmann.violet.framework.injection.resources.ResourceBundleInjector;
import com.horstmann.violet.framework.injection.resources.annotation.ResourceBundleBean;
import com.horstmann.violet.product.diagram.abstracts.IGraph;
import com.horstmann.violet.product.diagram.abstracts.edge.IEdge;
import com.horstmann.violet.product.diagram.abstracts.node.INode;
import com.horstmann.violet.workspace.editorpart.IEditorPart;
import com.horstmann.violet.workspace.editorpart.IEditorPartBehaviorManager;
import com.horstmann.violet.workspace.editorpart.IEditorPartSelectionHandler;
public class ShowMenuOnRightClickBehavior extends AbstractEditorPartBehavior
{
public ShowMenuOnRightClickBehavior(IEditorPart editorPart)
{
ResourceBundleInjector.getInjector().inject(this);
this.editorPart = editorPart;
this.graph = editorPart.getGraph();
this.selectionHandler = editorPart.getSelectionHandler();
}
@Override
public void onMouseClicked(MouseEvent event)
{
boolean isButton3Clicked = (event.getButton() == MouseEvent.BUTTON3);
if (event.getClickCount() == 1 && isButton3Clicked)
{
double zoom = editorPart.getZoomFactor();
final Point2D mousePoint = new Point2D.Double(event.getX() / zoom, event.getY() / zoom);
changeSelectedElementIfNeeded(mousePoint);
getPopupMenu().show(this.editorPart.getSwingComponent(), event.getX(), event.getY());
}
}
private void changeSelectedElementIfNeeded(Point2D mouseLocation)
{
INode node = this.graph.findNode(mouseLocation);
IEdge edge = this.graph.findEdge(mouseLocation);
List<INode> selectedNodes = this.selectionHandler.getSelectedNodes();
if (node != null && !selectedNodes.contains(node))
{
this.selectionHandler.clearSelection();
this.selectionHandler.addSelectedElement(node);
}
List<IEdge> selectedEdges = this.selectionHandler.getSelectedEdges();
if (edge != null && !selectedEdges.contains(edge))
{
this.selectionHandler.clearSelection();
this.selectionHandler.addSelectedElement(edge);
}
}
private JPopupMenu getPopupMenu() {
if (this.popupMenu == null) {
this.popupMenu = new JPopupMenu();
this.popupMenu = fillMenu(this.popupMenu);
}
return this.popupMenu;
}
/**
* Initializes menu
*/
private JPopupMenu fillMenu(JPopupMenu aPopupMenu)
{
undo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<UndoRedoCompoundBehavior> found = behaviorManager.getBehaviors(UndoRedoCompoundBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).undo();
}
});
aPopupMenu.add(undo);
redo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<UndoRedoCompoundBehavior> found = behaviorManager.getBehaviors(UndoRedoCompoundBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).redo();
}
});
aPopupMenu.add(redo);
properties.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<EditSelectedBehavior> found = behaviorManager.getBehaviors(EditSelectedBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).editSelected();
}
});
aPopupMenu.add(properties);
cut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<CutCopyPasteBehavior> found = behaviorManager.getBehaviors(CutCopyPasteBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).cut();
}
});
aPopupMenu.add(cut);
copy.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<CutCopyPasteBehavior> found = behaviorManager.getBehaviors(CutCopyPasteBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).copy();
}
});
aPopupMenu.add(copy);
paste.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<CutCopyPasteBehavior> found = behaviorManager.getBehaviors(CutCopyPasteBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).paste();
}
});
aPopupMenu.add(paste);
delete.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
ShowMenuOnRightClickBehavior.this.editorPart.removeSelected();
}
});
aPopupMenu.add(delete);
selectAll.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IEditorPartBehaviorManager behaviorManager = ShowMenuOnRightClickBehavior.this.editorPart.getBehaviorManager();
List<SelectAllBehavior> found = behaviorManager.getBehaviors(SelectAllBehavior.class);
if (found.size() != 1) {
return;
}
found.get(0).selectAllGraphElements();
}
});
aPopupMenu.add(selectAll);
return aPopupMenu;
}
private JPopupMenu popupMenu;
private IGraph graph;
private IEditorPartSelectionHandler selectionHandler;
@ResourceBundleBean(key = "edit.undo")
private JMenuItem undo;
@ResourceBundleBean(key = "edit.redo")
private JMenuItem redo;
@ResourceBundleBean(key = "edit.properties")
private JMenuItem properties;
@ResourceBundleBean(key = "edit.cut")
private JMenuItem cut;
@ResourceBundleBean(key = "edit.copy")
private JMenuItem copy;
@ResourceBundleBean(key = "edit.paste")
private JMenuItem paste;
@ResourceBundleBean(key = "edit.delete")
private JMenuItem delete;
@ResourceBundleBean(key = "edit.select_all")
private JMenuItem selectAll;
private IEditorPart editorPart;
}