// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU Lesser General Public License (LGPL): http://www.gnu.org/licenses/
package graphtea.plugins.main.core.actions;
import graphtea.graph.GraphUtils;
import graphtea.graph.event.EdgeEvent;
import graphtea.graph.event.GraphEvent;
import graphtea.graph.event.VertexEvent;
import graphtea.graph.graph.*;
import graphtea.platform.core.BlackBoard;
import graphtea.platform.core.Listener;
import graphtea.platform.extension.BasicExtension;
import graphtea.plugins.main.GraphData;
import graphtea.plugins.main.extension.GraphActionExtension;
import graphtea.plugins.main.extension.GraphActionInterface;
import graphtea.plugins.main.select.DeleteSelected;
import graphtea.plugins.main.select.MakeSelectionComplementGraph;
import graphtea.plugins.main.select.MakeSelectionCompleteGraph;
import graphtea.plugins.main.select.MakeSelectionEmptyGraph;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.util.HashMap;
/**
* @author Azin Azadi
*/
public class RightClickAction implements BasicExtension, Listener {
BlackBoard b;
GraphData gd;
private JPopupMenu popup = new JPopupMenu();
public HashMap<String, GraphActionInterface> menus = new HashMap<>();
public RightClickAction(BlackBoard b) {
this.b = b;
gd = new GraphData(b);
//listening to G/V/E events
b.addListener(VertexEvent.EVENT_KEY, this);
b.addListener(EdgeEvent.EVENT_KEY, this);
b.addListener(GraphEvent.EVENT_KEY, this);
fillPopupMenu();
}
private void addToMenus(GraphActionExtension gae) {
menus.put(gae.getName(), gae);
}
public void fillPopupMenu() {
addToMenus(new MakeSelectionCompleteGraph());
addToMenus(new MakeSelectionComplementGraph());
addToMenus(new MakeSelectionEmptyGraph());
addToMenus(new DeleteSelected(b));
for (final String name : menus.keySet()) {
JMenuItem item = new JMenuItem(name);
item.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
menus.get(name).action(gd);
}
});
popup.add(item);
}
// JMenuItem item = new JMenuItem("Delete");
// item.addActionListener(new AbstractAction() {
// @Override
// public void actionPerformed(ActionEvent actionEvent) {
// gd.select.
// }
// });
}
public void keyChanged(String key, Object value) {
if (key == VertexEvent.EVENT_KEY) {
VertexEvent ve = (VertexEvent) value;
if (ve.eventType == VertexEvent.CLICKED && ve.mouseBtn == MouseEvent.BUTTON3) {
if (!gd.select.getSelectedVertices().contains(ve.v)) {
gd.select.setSelected(new Vertex[]{ve.v}, new Edge[]{});
}
showPopup(ve.posOnGraph());
}
}
if (key == EdgeEvent.EVENT_KEY) {
EdgeEvent ee = (EdgeEvent) value;
if (ee.eventType == EdgeEvent.CLICKED && ee.mouseBtn == MouseEvent.BUTTON3) {
if (!gd.select.getSelectedEdges().contains(ee.e)) {
gd.select.setSelected(new Vertex[]{}, new Edge[]{ee.e});
}
showPopup(ee.posOnGraph());
}
}
if (key == GraphEvent.EVENT_KEY) {
GraphEvent ge = (GraphEvent) value;
GraphModel g = ge.graph;
if (ge.eventType == GraphEvent.CLICKED && ge.mouseBtn == MouseEvent.BUTTON3) {
showPopup(ge.mousePos);
}
}
}
public void showPopup(GPoint p) {
AbstractGraphRenderer gv = b.getData(AbstractGraphRenderer.EVENT_KEY);
Point vp = GraphUtils.createViewPoint(gd.getGraph(), p);
popup.show(gv, vp.x, vp.y);
}
}