package bayesGame.separationGame;
import java.awt.Cursor;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.util.Collection;
import bayesGame.BayesGame;
import edu.uci.ics.jung.algorithms.layout.GraphElementAccessor;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.util.Pair;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.AbstractGraphMousePlugin;
import edu.uci.ics.jung.visualization.picking.PickedState;
public class NetworkGameMousePlugin extends AbstractGraphMousePlugin implements MouseListener, MouseMotionListener {
protected BooleanNode vertex;
protected TravelEdge edge;
private BooleanNode previousNode;
private TravelEdge travelThroughEdge;
protected int addToSelectionModifiers;
public NetworkGameMousePlugin(int modifiers) {
super(modifiers);
// TODO Auto-generated constructor stub
}
public NetworkGameMousePlugin(int selectionModifiers, int addToSelectionModifiers){
super(selectionModifiers);
this.addToSelectionModifiers = addToSelectionModifiers;
this.cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
}
public NetworkGameMousePlugin(){
this(InputEvent.BUTTON1_MASK, InputEvent.BUTTON1_MASK | InputEvent.SHIFT_MASK);
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
previousNode = null;
travelThroughEdge = null;
down = e.getPoint();
VisualizationViewer<BooleanNode,TravelEdge> vv = (VisualizationViewer)e.getSource();
GraphElementAccessor<BooleanNode,TravelEdge> pickSupport = vv.getPickSupport();
PickedState<BooleanNode> pickedVertexState = vv.getPickedVertexState();
PickedState<TravelEdge> pickedEdgeState = vv.getPickedEdgeState();
if(pickSupport != null && pickedVertexState != null) {
Layout<BooleanNode,TravelEdge> layout = vv.getGraphLayout();
Point2D ip = e.getPoint();
vertex = pickSupport.getVertex(layout, ip.getX(), ip.getY());
if(vertex != null){
if(pickedVertexState.isPicked(vertex) == false) {
pickedVertexState.clear();
pickedVertexState.pick(vertex, true);
}
Graph<BooleanNode, TravelEdge> graph = layout.getGraph();
Collection<TravelEdge> inEdges = graph.getInEdges(vertex);
Collection<TravelEdge> outEdges = graph.getOutEdges(vertex);
TravelEdge[] inEdgesArray = inEdges.toArray(new TravelEdge[inEdges.size()]);
TravelEdge[] outEdgesArray = outEdges.toArray(new TravelEdge[outEdges.size()]);
checkEdge(inEdgesArray, graph);
if (previousNode == null){
checkEdge(outEdgesArray, graph);
}
if ((previousNode != null) && !(previousNode.equals(vertex))){
if ((inEdges.contains(travelThroughEdge) && travelThroughEdge.canTravelDownwards) || (outEdges.contains(travelThroughEdge) && travelThroughEdge.canTravelUpwards)){
previousNode.setCurrentNode(false);
previousNode.setStartNode(true);
vertex.setCurrentNode(true);
SeparationGame.incrementValidMoves();
vv.repaint();
if (vertex.isEndNode()){
System.out.println("End node reached!");
SeparationGame.endNodeReached();
}
} else {
System.out.println("Cannot travel there!");
SeparationGame.incrementInvalidMoves();
}
}
/*
boolean verstate = vertex.getObserved();
vertex.setObserved(!verstate);
vv.repaint();
*/
}
}
}
private void checkEdge(TravelEdge[] arr, Graph<BooleanNode,TravelEdge> graph){
for (TravelEdge ed : arr){
Pair endpoints = graph.getEndpoints(ed);
BooleanNode firstNode = (BooleanNode) endpoints.getFirst();
BooleanNode secondNode = (BooleanNode) endpoints.getSecond();
if (firstNode.isCurrentNode()){
previousNode = firstNode;
travelThroughEdge = ed;
} else if (secondNode.isCurrentNode()){
previousNode = secondNode;
travelThroughEdge = ed;
}
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}