/* * @(#)BasicDragGestureRecognizer.java 1.7 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package javax.swing.plaf.basic; import java.awt.Toolkit; import java.awt.event.*; import java.awt.dnd.DragSource; import javax.swing.*; import sun.awt.dnd.SunDragSourceContextPeer; /** * Default drag gesture recognition for drag operations performed by classses * that have a dragEnabled property. The gesture for a drag in * this package is a mouse press over a selection followed by some movement * by enough pixels to keep it from being treated as a click. * * @author Timothy Prinzing * @version 1.7 12/19/03 */ class BasicDragGestureRecognizer implements MouseListener, MouseMotionListener { private MouseEvent dndArmedEvent = null; private static int getMotionThreshold() { return DragSource.getDragThreshold(); } protected int mapDragOperationFromModifiers(MouseEvent e) { int mods = e.getModifiersEx(); if ((mods & InputEvent.BUTTON1_DOWN_MASK) != InputEvent.BUTTON1_DOWN_MASK) { return TransferHandler.NONE; } JComponent c = getComponent(e); TransferHandler th = c.getTransferHandler(); return SunDragSourceContextPeer.convertModifiersToDropAction(mods, th.getSourceActions(c)); } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { dndArmedEvent = null; if (isDragPossible(e) && mapDragOperationFromModifiers(e) != TransferHandler.NONE) { dndArmedEvent = e; e.consume(); } } public void mouseReleased(MouseEvent e) { dndArmedEvent = null; } public void mouseEntered(MouseEvent e) { //dndArmedEvent = null; } public void mouseExited(MouseEvent e) { //if (dndArmedEvent != null && mapDragOperationFromModifiers(e) == TransferHandler.NONE) { // dndArmedEvent = null; //} } public void mouseDragged(MouseEvent e) { if (dndArmedEvent != null) { e.consume(); int action = mapDragOperationFromModifiers(e); if (action == TransferHandler.NONE) { return; } int dx = Math.abs(e.getX() - dndArmedEvent.getX()); int dy = Math.abs(e.getY() - dndArmedEvent.getY()); if ((dx > getMotionThreshold()) || (dy > getMotionThreshold())) { // start transfer... shouldn't be a click at this point JComponent c = getComponent(e); TransferHandler th = c.getTransferHandler(); th.exportAsDrag(c, dndArmedEvent, action); dndArmedEvent = null; } } } public void mouseMoved(MouseEvent e) { } private TransferHandler getTransferHandler(MouseEvent e) { JComponent c = getComponent(e); return c == null ? null : c.getTransferHandler(); } /** * Determines if the following are true: * *

* This is implemented to check for a TransferHandler. * Subclasses should perform the remaining conditions. */ protected boolean isDragPossible(MouseEvent e) { JComponent c = getComponent(e); return (c == null) ? true : (c.getTransferHandler() != null); } protected JComponent getComponent(MouseEvent e) { Object src = e.getSource(); if (src instanceof JComponent) { JComponent c = (JComponent) src; return c; } return null; } }