/*
* Copyright 2006, United States Government as represented by the Administrator
* for the National Aeronautics and Space Administration. No copyright is
* claimed in the United States under Title 17, U.S. Code. All Other Rights
* Reserved.
*/
package gov.nasa.ial.mde.ui;
import gov.nasa.ial.mde.solver.Solver;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
/**
* The <code>GraphNavKeys</code> class allows for the arrow keys and the mouse
* to be used to navigate the graph.
*
* @version 1.0
* @since 1.0
*/
public class GraphNavKeys implements KeyListener, MouseListener {
private Solver solver;
private Rectangle graphBounds;
private JPanel graphPanel;
/**
* Constructs a <code>GraphNavKeys</code> for the specified solver, graph
* panel and graph bounds.
*
* @param solver the solver to be called when navigating the graph.
* @param graphPanel the graph that we are navigating.
* @param graphBounds the bounds of the graph.
*/
public GraphNavKeys(Solver solver, JPanel graphPanel, Rectangle graphBounds) {
this.solver = solver;
this.graphBounds = graphBounds;
this.graphPanel = graphPanel;
}
/**
* Ignored for now.
*
* @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
*/
public void keyTyped(KeyEvent ke) {
// do nothing for now
}
/**
* Ignored for now.
*
* @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
*/
public void keyReleased(KeyEvent ke) {
// do nothing for now
}
/**
* Handle the arrow key events for navigating the graph.
*
* @param ke the key event to handle.
* @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
*/
public void keyPressed(KeyEvent ke) {
double offset;
switch (ke.getKeyCode()) {
case KeyEvent.VK_HOME:
// Reset the solution by using the preferred bounds.
solver.solve(solver.getPreferredBounds());
break;
case KeyEvent.VK_DOWN:
offset = 0.02 * (solver.getTop() - solver.getBottom());
solver.solve(solver.getLeft(), solver.getRight(), solver.getTop() - offset, solver.getBottom() - offset);
break;
case KeyEvent.VK_UP:
offset = 0.02 * (solver.getTop() - solver.getBottom());
solver.solve(solver.getLeft(), solver.getRight(), solver.getTop() + offset, solver.getBottom() + offset);
break;
case KeyEvent.VK_LEFT:
offset = 0.02 * (solver.getRight() - solver.getLeft());
solver.solve(solver.getLeft() - offset, solver.getRight() - offset, solver.getTop(), solver.getBottom());
break;
case KeyEvent.VK_RIGHT:
offset = 0.02 * (solver.getRight() - solver.getLeft());
solver.solve(solver.getLeft() + offset, solver.getRight() + offset, solver.getTop(), solver.getBottom());
break;
}
}
/**
* Ignored for now.
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent e) {
// do nothing for now.
} // end mouseEntered
/**
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent e) {
// do nothing for now.
} // end mouseExited
/**
* Ignored for now.
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e) {
// do nothing for now.
} // end mousePressed
/**
* Ignored for now.
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent e) {
// do nothing for now.
} // end mouseReleased
/**
* Handle the mouse click event to allow for navigation of the graph.
*
* @param me the mouse event to handle.
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
public void mouseClicked(MouseEvent me) {
graphPanel.grabFocus();
int x = me.getX();
int y = me.getY();
double deltaX = (x - graphBounds.width / 2.0) * ((solver.getRight() - solver.getLeft())) / graphBounds.width;
double deltaY = (graphBounds.height / 2.0 - y) * ((solver.getTop() - solver.getBottom())) / graphBounds.height;
solver.solve(solver.getLeft() + deltaX,
solver.getRight() + deltaX,
solver.getTop() + deltaY,
solver.getBottom() + deltaY);
}
}