diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/MouseHijacker.java b/projects/samskivert/src/java/com/samskivert/swing/util/MouseHijacker.java new file mode 100644 index 00000000..0ac63a73 --- /dev/null +++ b/projects/samskivert/src/java/com/samskivert/swing/util/MouseHijacker.java @@ -0,0 +1,117 @@ +// +// $Id: MouseHijacker.java,v 1.1 2002/06/27 00:14:52 ray Exp $ + +package com.samskivert.swing.util; + +import java.awt.Component; + +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseMotionListener; + +/** + * Hijacks normal mouse input from reaching the specified component's + * normal listeners. There is one special consideration it makes for your + * component: it tracks mouse movement events and will relay the last + * one to each MouseMotionListener before reinstating it on the component. + * + * Typically this will be used in conjunction with + * installation of your own listeners, like so: + * + *
+ *     public void startStuff (Component comp)
+ *     {
+ *         _hijacker = new MouseHijacker(comp);
+ *         comp.addMouseListener(this);
+ *     }
+ *
+ *     public void mouseClicked (MouseEvent evt)
+ *     {
+ *         doStuff();
+ *         endStuff();
+ *     }
+ *
+ *     protected void endStuff ()
+ *     {
+ *         Component comp = _hijacker.release();
+ *         comp.removeMouseListener(this);
+ *     }
+ *
+ *     protected MouseHijacker _hijacker;
+ * 
+ */ +public class MouseHijacker +{ + /** + * Construct a mouse hijacker and hijack the specified component. + */ + public MouseHijacker (Component comp) + { + _comp = comp; + hijack(); + } + + /** + * Hijack the component's mouse listeners. + */ + public void hijack () + { + _mls = _comp.getMouseListeners(); + for (int ii=0; ii < _mls.length; ii++) { + _comp.removeMouseListener(_mls[ii]); + } + + _mmls = _comp.getMouseMotionListeners(); + for (int ii=0; ii < _mmls.length; ii++) { + _comp.removeMouseMotionListener(_mmls[ii]); + } + + _comp.addMouseMotionListener(_motionCatcher); + } + + /** + * Release the component from the hijacking: reenable all of its + * previous mouse listeners, and return the component for convenience. + */ + public Component release () + { + _comp.removeMouseMotionListener(_motionCatcher); + + for (int ii=0; ii < _mls.length; ii++) { + _comp.addMouseListener(_mls[ii]); + } + _mls = null; + + for (int ii=0; ii < _mmls.length; ii++) { + // fake the last movement + if (_lastMotion != null) { + _mmls[ii].mouseMoved(_lastMotion); + } + _comp.addMouseMotionListener(_mmls[ii]); + } + _mmls = null; + + return _comp; + } + + /** The component we've hijacked. */ + protected Component _comp; + + /** The last mouse moved event, captured. We're so naughty. */ + protected MouseEvent _lastMotion; + + /** Used to capture each motion event while everything's hijacked. */ + protected MouseMotionListener _motionCatcher = new MouseMotionAdapter() { + public void mouseMoved (MouseEvent evt) + { + _lastMotion = evt; + } + }; + + /** The previous mouse listeners. */ + protected MouseListener[] _mls; + + /** The previous mouse motion listeners. */ + protected MouseMotionListener[] _mmls; +}