package prefuse.controls;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import prefuse.Display;
import prefuse.util.ui.UILib;
import prefuse.visual.VisualItem;
/**
* Zooms the display, changing the scale of the viewable region. By default,
* zooming is achieved by pressing the right mouse button on the background
* of the visualization and dragging the mouse up or down. Moving the mouse up
* zooms out the display around the spot the mouse was originally pressed.
* Moving the mouse down similarly zooms in the display, making items
* larger.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class ZoomControl extends AbstractZoomControl {
private int yLast;
private Point2D down = new Point2D.Float();
private int button = RIGHT_MOUSE_BUTTON;
/**
* Create a new zoom control.
*/
public ZoomControl() {
// do nothing
}
/**
* Create a new zoom control.
* @param mouseButton the mouse button that should initiate a zoom. One of
* {@link Control#LEFT_MOUSE_BUTTON}, {@link Control#MIDDLE_MOUSE_BUTTON},
* or {@link Control#RIGHT_MOUSE_BUTTON}.
*/
public ZoomControl(int mouseButton) {
button = mouseButton;
}
/**
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e) {
if ( UILib.isButtonPressed(e, button) ) {
Display display = (Display)e.getComponent();
if (display.isTranformInProgress()) {
yLast = -1;
System.err.println("can't move");
return;
}
display.setCursor(
Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
display.getAbsoluteCoordinate(e.getPoint(), down);
yLast = e.getY();
}
}
/**
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e) {
if ( UILib.isButtonPressed(e, button) ) {
Display display = (Display)e.getComponent();
if (display.isTranformInProgress() || yLast == -1) {
yLast = -1;
return;
}
int y = e.getY();
int dy = y-yLast;
double zoom = 1 + ((double)dy) / 100;
int status = zoom(display, down, zoom, true);
int cursor = Cursor.N_RESIZE_CURSOR;
if ( status == NO_ZOOM )
cursor = Cursor.WAIT_CURSOR;
display.setCursor(Cursor.getPredefinedCursor(cursor));
yLast = y;
}
}
/**
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent e) {
if ( UILib.isButtonPressed(e, button) ) {
e.getComponent().setCursor(Cursor.getDefaultCursor());
}
}
/**
* @see prefuse.controls.Control#itemPressed(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemPressed(VisualItem item, MouseEvent e) {
if ( m_zoomOverItem )
mousePressed(e);
}
/**
* @see prefuse.controls.Control#itemDragged(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemDragged(VisualItem item, MouseEvent e) {
if ( m_zoomOverItem )
mouseDragged(e);
}
/**
* @see prefuse.controls.Control#itemReleased(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemReleased(VisualItem item, MouseEvent e) {
if ( m_zoomOverItem )
mouseReleased(e);
}
} // end of class ZoomControl