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