//(c) Copyright 2005, Scott Vorthmann. All rights reserved. package org.vorthmann.ui; import java.awt.Component; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import javax.swing.event.MouseInputAdapter; import javax.swing.event.MouseInputListener; import org.vorthmann.j3d.MouseTool; /** * A MouseInputAdapter that separates press-release sequences into pure clicks and * press-drag-release sequences. * Press-release-click sequences are never generated. * Drag events (and the initial press) are not generated until HYSTERESIS msec have passed since the actual press. * If the mouse is released before that time has passed, a clicked event is generated. * * Thus, even if the mouse is moving, press-release within HYSTERESIS msec becomes a click event, * with no drag events. * * This class also excludes "popup trigger" events. * * @author Scott Vorthmann * */ public class LeftMouseDragAdapter extends MouseInputAdapter implements MouseTool { private static final long HYSTERESIS = 200; // milliseconds private MouseInputListener mDelegate; private transient long mPressTime; private transient MouseEvent mPressEvent; private transient boolean mPressSent, mPopupTrigger; private final long hysteresis; public LeftMouseDragAdapter( MouseInputListener drags, long hysteresis ) { super(); mDelegate = drags; this .hysteresis = hysteresis; } public LeftMouseDragAdapter( MouseInputListener drags ) { this( drags, HYSTERESIS ); } @Override public void mousePressed( MouseEvent e ) { if ( e .isPopupTrigger() ) { mPopupTrigger = true; return; } mPopupTrigger = false; mPressTime = System .currentTimeMillis(); mPressEvent = e; } @Override public void mouseDragged( MouseEvent arg0 ) { if ( arg0 .isPopupTrigger() || mPopupTrigger ) return; long time = System .currentTimeMillis(); if ( time - mPressTime > this .hysteresis ) { if ( mPressEvent != null ) { mDelegate .mousePressed( mPressEvent ); // TODO massage this into a press event mPressEvent = null; mPressSent = true; } mDelegate .mouseDragged( arg0 ); } } @Override public void mouseReleased( MouseEvent arg0 ) { if ( arg0 .isPopupTrigger() || mPopupTrigger ) return; if ( mPressSent ) mDelegate .mouseReleased( arg0 ); else mDelegate .mouseClicked( arg0 ); // TODO massage this into a click event mPressSent = false; } @Override public void mouseClicked( MouseEvent arg0 ) { // all clicks generated in mouseReleased } @Override public void mouseWheelMoved( MouseWheelEvent arg0 ) {} @Override public void attach( Component canvas ) { canvas .addMouseListener( this ); canvas .addMouseMotionListener( this ); canvas .addMouseWheelListener( this ); } @Override public void detach( Component canvas ) { canvas .removeMouseListener( this ); canvas .removeMouseMotionListener( this ); canvas .removeMouseWheelListener( this ); } }