1. /*
  2. * @(#)BasicDragGestureRecognizer.java 1.7 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.basic;
  8. import java.awt.Toolkit;
  9. import java.awt.event.*;
  10. import java.awt.dnd.DragSource;
  11. import javax.swing.*;
  12. import sun.awt.dnd.SunDragSourceContextPeer;
  13. /**
  14. * Default drag gesture recognition for drag operations performed by classses
  15. * that have a <code>dragEnabled</code> property. The gesture for a drag in
  16. * this package is a mouse press over a selection followed by some movement
  17. * by enough pixels to keep it from being treated as a click.
  18. *
  19. * @author Timothy Prinzing
  20. * @version 1.7 12/19/03
  21. */
  22. class BasicDragGestureRecognizer implements MouseListener, MouseMotionListener {
  23. private MouseEvent dndArmedEvent = null;
  24. private static int getMotionThreshold() {
  25. return DragSource.getDragThreshold();
  26. }
  27. protected int mapDragOperationFromModifiers(MouseEvent e) {
  28. int mods = e.getModifiersEx();
  29. if ((mods & InputEvent.BUTTON1_DOWN_MASK) != InputEvent.BUTTON1_DOWN_MASK) {
  30. return TransferHandler.NONE;
  31. }
  32. JComponent c = getComponent(e);
  33. TransferHandler th = c.getTransferHandler();
  34. return SunDragSourceContextPeer.convertModifiersToDropAction(mods, th.getSourceActions(c));
  35. }
  36. public void mouseClicked(MouseEvent e) {
  37. }
  38. public void mousePressed(MouseEvent e) {
  39. dndArmedEvent = null;
  40. if (isDragPossible(e) && mapDragOperationFromModifiers(e) != TransferHandler.NONE) {
  41. dndArmedEvent = e;
  42. e.consume();
  43. }
  44. }
  45. public void mouseReleased(MouseEvent e) {
  46. dndArmedEvent = null;
  47. }
  48. public void mouseEntered(MouseEvent e) {
  49. //dndArmedEvent = null;
  50. }
  51. public void mouseExited(MouseEvent e) {
  52. //if (dndArmedEvent != null && mapDragOperationFromModifiers(e) == TransferHandler.NONE) {
  53. // dndArmedEvent = null;
  54. //}
  55. }
  56. public void mouseDragged(MouseEvent e) {
  57. if (dndArmedEvent != null) {
  58. e.consume();
  59. int action = mapDragOperationFromModifiers(e);
  60. if (action == TransferHandler.NONE) {
  61. return;
  62. }
  63. int dx = Math.abs(e.getX() - dndArmedEvent.getX());
  64. int dy = Math.abs(e.getY() - dndArmedEvent.getY());
  65. if ((dx > getMotionThreshold()) || (dy > getMotionThreshold())) {
  66. // start transfer... shouldn't be a click at this point
  67. JComponent c = getComponent(e);
  68. TransferHandler th = c.getTransferHandler();
  69. th.exportAsDrag(c, dndArmedEvent, action);
  70. dndArmedEvent = null;
  71. }
  72. }
  73. }
  74. public void mouseMoved(MouseEvent e) {
  75. }
  76. private TransferHandler getTransferHandler(MouseEvent e) {
  77. JComponent c = getComponent(e);
  78. return c == null ? null : c.getTransferHandler();
  79. }
  80. /**
  81. * Determines if the following are true:
  82. * <ul>
  83. * <li>the press event is located over a selection
  84. * <li>the dragEnabled property is true
  85. * <li>A TranferHandler is installed
  86. * </ul>
  87. * <p>
  88. * This is implemented to check for a TransferHandler.
  89. * Subclasses should perform the remaining conditions.
  90. */
  91. protected boolean isDragPossible(MouseEvent e) {
  92. JComponent c = getComponent(e);
  93. return (c == null) ? true : (c.getTransferHandler() != null);
  94. }
  95. protected JComponent getComponent(MouseEvent e) {
  96. Object src = e.getSource();
  97. if (src instanceof JComponent) {
  98. JComponent c = (JComponent) src;
  99. return c;
  100. }
  101. return null;
  102. }
  103. }