package prefuse.controls; import java.awt.Cursor; import java.awt.event.MouseEvent; import prefuse.Display; import prefuse.util.ui.UILib; import prefuse.visual.VisualItem; /** * Pans the display, changing the viewable region of the visualization. * By default, panning is accomplished by clicking on the background of a * visualization with the left mouse button and then dragging. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class PanControl extends ControlAdapter { private boolean m_panOverItem; private int m_xDown, m_yDown; private int m_button; /** * Create a new PanControl. */ public PanControl() { this(LEFT_MOUSE_BUTTON, false); } /** * Create a new PanControl. * @param panOverItem if true, the panning control will work even while * the mouse is over a visual item. */ public PanControl(boolean panOverItem) { this(LEFT_MOUSE_BUTTON, panOverItem); } /** * Create a new PanControl. * @param mouseButton the mouse button that should initiate a pan. One of * {@link Control#LEFT_MOUSE_BUTTON}, {@link Control#MIDDLE_MOUSE_BUTTON}, * or {@link Control#RIGHT_MOUSE_BUTTON}. */ public PanControl(int mouseButton) { this(mouseButton, false); } /** * Create a new PanControl * @param mouseButton the mouse button that should initiate a pan. One of * {@link Control#LEFT_MOUSE_BUTTON}, {@link Control#MIDDLE_MOUSE_BUTTON}, * or {@link Control#RIGHT_MOUSE_BUTTON}. * @param panOverItem if true, the panning control will work even while * the mouse is over a visual item. */ public PanControl(int mouseButton, boolean panOverItem) { m_button = mouseButton; m_panOverItem = panOverItem; } // ------------------------------------------------------------------------ /** * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent) */ public void mousePressed(MouseEvent e) { if ( UILib.isButtonPressed(e, m_button) ) { e.getComponent().setCursor( Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); m_xDown = e.getX(); m_yDown = e.getY(); } } /** * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent) */ public void mouseDragged(MouseEvent e) { if ( UILib.isButtonPressed(e, m_button) ) { Display display = (Display)e.getComponent(); int x = e.getX(), y = e.getY(); int dx = x-m_xDown, dy = y-m_yDown; display.pan(dx,dy); m_xDown = x; m_yDown = y; display.repaint(); } } /** * @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()); m_xDown = -1; m_yDown = -1; } } /** * @see prefuse.controls.Control#itemPressed(prefuse.visual.VisualItem, java.awt.event.MouseEvent) */ public void itemPressed(VisualItem item, MouseEvent e) { if ( m_panOverItem ) mousePressed(e); } /** * @see prefuse.controls.Control#itemDragged(prefuse.visual.VisualItem, java.awt.event.MouseEvent) */ public void itemDragged(VisualItem item, MouseEvent e) { if ( m_panOverItem ) mouseDragged(e); } /** * @see prefuse.controls.Control#itemReleased(prefuse.visual.VisualItem, java.awt.event.MouseEvent) */ public void itemReleased(VisualItem item, MouseEvent e) { if ( m_panOverItem ) mouseReleased(e); } } // end of class PanControl