package prefuse.controls;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.MouseEvent;
import prefuse.Display;
import prefuse.util.ui.UILib;
/**
* Control that can be used to rotate the display. This results in a
* transformation of the display itself, such that all aspects are
* rotated. For example, after a rotation of 180 degrees, upright
* text strings will subsequently upside down. To rotate item positions
* but leave other aspects such as orientation intact, you can
* instead create a new {@link prefuse.action.Action} module that rotates
* just the item co-ordinates.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class RotationControl extends ControlAdapter {
private Point down = new Point();
private double baseAngle = 0; // the baseline angle of the rotation
private int m_button; // the mouse button to use
/**
* Create a new RotateControl. Rotations will be initiated by dragging
* the mouse with the left mouse button pressed.
*/
public RotationControl() {
this(Control.LEFT_MOUSE_BUTTON);
}
/**
* Create a new RotateControl
* @param mouseButton the mouse button that should initiate a rotation. One
* of {@link Control#LEFT_MOUSE_BUTTON},
* {@link Control#MIDDLE_MOUSE_BUTTON}, or
* {@link Control#RIGHT_MOUSE_BUTTON}.
*/
public RotationControl(int mouseButton) {
m_button = mouseButton;
}
/**
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e) {
if ( UILib.isButtonPressed(e, m_button) ) {
Display display = (Display)e.getComponent();
display.setCursor(
Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
down.setLocation(e.getPoint());
baseAngle = Double.NaN;
}
}
/**
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e) {
if ( UILib.isButtonPressed(e, m_button) ) {
int dy = e.getY() - down.y;
int dx = e.getX() - down.x;
double angle = Math.atan2(dy, dx);
// only rotate once the base angle has been established
if ( !Double.isNaN(baseAngle) ) {
Display display = (Display)e.getComponent();
display.rotate(down, angle-baseAngle);
}
baseAngle = angle;
}
}
/**
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent e) {
if ( UILib.isButtonPressed(e, m_button) ) {
e.getComponent().setCursor(Cursor.getDefaultCursor());
}
}
} // end of class RotationControl