/* * DragGestureRecognizer.java * * Created on March 4, 2005, 7:40 PM */ package kiyut.swing.dnd; import java.awt.event.*; import java.awt.dnd.DragSource; import javax.swing.*; import javax.swing.event.*; /** DragGestureRecognizer for custom Swing Component * * @author Kiyut */ public class CustomDragGestureRecognizer extends MouseInputAdapter { /** Armed Event */ protected MouseEvent armedEvent = null; /** Drag Threshold, by default it same with DragSource.getDragThreshold */ protected int threshold = DragSource.getDragThreshold(); /** Creates a new instance of DragGestureRecognizer */ public CustomDragGestureRecognizer() { } /** {@inheritDoc} */ public void mousePressed(MouseEvent evt) { armedEvent = null; if (isDragPossible(evt) && getDragAction(evt) != TransferHandler.NONE) { armedEvent = evt; evt.consume(); } } /** {@inheritDoc} */ public void mouseReleased(MouseEvent evt) { armedEvent = null; } /** {@inheritDoc} */ public void mouseDragged(MouseEvent evt) { if (armedEvent != null) { evt.consume(); int action = getDragAction(evt); if (action == TransferHandler.NONE) { return; } int dx = Math.abs(evt.getX() - armedEvent.getX()); int dy = Math.abs(evt.getY() - armedEvent.getY()); if ((dx > threshold) || (dy > threshold)) { JComponent c = (JComponent)evt.getSource(); TransferHandler th = c.getTransferHandler(); th.exportAsDrag(c, armedEvent, action); armedEvent = null; } } } /** * Determines if the following are true: * <ul> * <li>the press event is located over a selection * <li>the dragEnabled property is true * <li>A TranferHandler is installed * </ul> * <p> * This is implemented to check for a TransferHandler. * Subclasses should perform the remaining conditions. * @param evt MouseEvent */ protected boolean isDragPossible(MouseEvent evt) { boolean b = false; JComponent c = (JComponent)evt.getSource(); return (c == null) ? true : (c.getTransferHandler() != null); } /** Determine TransferHandler Action from mouse event * @param evt MouseEvent */ protected int getDragAction(MouseEvent evt) { //If they are holding down the control key, COPY rather than MOVE int ctrlMask = InputEvent.CTRL_DOWN_MASK; int action = ((evt.getModifiersEx() & ctrlMask) == ctrlMask) ? TransferHandler.COPY : TransferHandler.MOVE; return action; } }