Quite a while ago I implemented one missing method in TransferHandler.
It is not working yet though due to problems with DnD in the GTK peers.
I started fixing those but then got sidetracked. I am committing the
TransferHandler bits anyway, since I believe this should be OK, and is
quite independent from the GTK problems.

2007-02-10  Roman Kennke  <[EMAIL PROTECTED]>

        * javax/swing/TransferHandler.java
        (SwingDragGestureRecognizer): New inner class.
        (SwingDragHandler): New inner class.
        (recognizer): New field.
        (exportAsDrag): Implemented missing method.

/Roman

Index: javax/swing/TransferHandler.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/TransferHandler.java,v
retrieving revision 1.19
diff -u -1 -5 -r1.19 TransferHandler.java
--- javax/swing/TransferHandler.java	28 Oct 2006 10:38:21 -0000	1.19
+++ javax/swing/TransferHandler.java	10 Feb 2007 13:32:33 -0000
@@ -26,39 +26,47 @@
 As a special exception, the copyright holders of this library give you
 permission to link this library with independent modules to produce an
 executable, regardless of the license terms of these independent
 modules, and to copy and distribute the resulting executable under
 terms of your choice, provided that you also meet, for each linked
 independent module, the terms and conditions of the license of that
 module.  An independent module is a module which is not derived from
 or based on this library.  If you modify this library, you may extend
 this exception to your version of the library, but you are not
 obligated to do so.  If you do not wish to do so, delete this
 exception statement from your version. */
 
 
 package javax.swing;
 
-import gnu.classpath.NotImplementedException;
-
 import java.awt.Toolkit;
 import java.awt.datatransfer.Clipboard;
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragGestureRecognizer;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceContext;
+import java.awt.dnd.DragSourceDragEvent;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceEvent;
+import java.awt.dnd.DragSourceListener;
 import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
 import java.io.IOException;
 import java.io.Serializable;
 import java.lang.reflect.Method;
 
 public class TransferHandler implements Serializable
 {
 
   /**
    * An implementation of [EMAIL PROTECTED] Transferable} that can be used to export
    * data from a component's property.
    */
@@ -198,55 +206,154 @@
      * @param component a component, used to get the toolkit.
      * @return the clipboard
      */
     private static Clipboard getClipboard(JComponent component)
     {
       try
 	{
 	  return component.getToolkit().getSystemClipboard();
 	}
       catch (SecurityException se)
 	{
 	  return null;
 	}
     }
   }
-  
+
+  private static class SwingDragGestureRecognizer extends DragGestureRecognizer
+  {
+
+    protected SwingDragGestureRecognizer(DragGestureListener dgl)
+    {
+      super(DragSource.getDefaultDragSource(), null, NONE, dgl);
+    }
+
+    void gesture(JComponent c, MouseEvent e, int src, int drag)
+    {
+      setComponent(c);
+      setSourceActions(src);
+      appendEvent(e);
+      fireDragGestureRecognized(drag, e.getPoint());
+    }
+
+    protected void registerListeners()
+    {
+      // Nothing to do here.
+    }
+
+    protected void unregisterListeners()
+    {
+      // Nothing to do here.
+    }
+    
+  }
+
+  private static class SwingDragHandler
+    implements DragGestureListener, DragSourceListener
+  {
+
+    private boolean autoscrolls;
+
+    public void dragGestureRecognized(DragGestureEvent e)
+    {
+      JComponent c = (JComponent) e.getComponent();
+      TransferHandler th = c.getTransferHandler();
+      Transferable t = th.createTransferable(c);
+      if (t != null)
+        {
+          autoscrolls = c.getAutoscrolls();
+          c.setAutoscrolls(false);
+          try
+            {
+              e.startDrag(null, t, this);
+              return;
+            }
+          finally
+            {
+              c.setAutoscrolls(autoscrolls);
+            }
+        }
+      th.exportDone(c, t, NONE);
+    }
+
+    public void dragDropEnd(DragSourceDropEvent e)
+    {
+      DragSourceContext ctx = e.getDragSourceContext();
+      JComponent c = (JComponent) ctx.getComponent();
+      TransferHandler th = c.getTransferHandler();
+      if (e.getDropSuccess())
+        {
+          th.exportDone(c, ctx.getTransferable(), e.getDropAction());
+        }
+      else
+        {
+          th.exportDone(c, ctx.getTransferable(), e.getDropAction());
+        }
+      c.setAutoscrolls(autoscrolls);
+    }
+
+    public void dragEnter(DragSourceDragEvent e)
+    {
+      // Nothing to do here.
+    }
+
+    public void dragExit(DragSourceEvent e)
+    {
+      // Nothing to do here.
+    }
+
+    public void dragOver(DragSourceDragEvent e)
+    {
+      // Nothing to do here.
+    }
+
+    public void dropActionChanged(DragSourceDragEvent e)
+    {
+      // Nothing to do here.
+    }
+    
+  }
+
   private static final long serialVersionUID = -967749805571669910L;
 
   private static final String COMMAND_COPY = "copy";
   private static final String COMMAND_CUT = "cut";
   private static final String COMMAND_PASTE = "paste";
   
   public static final int NONE = 0;
   public static final int COPY = 1;
   public static final int MOVE = 2;
   public static final int COPY_OR_MOVE = 3;
 
   private static Action copyAction = new TransferAction(COMMAND_COPY);
   private static Action cutAction = new TransferAction(COMMAND_CUT);
   private static Action pasteAction = new TransferAction(COMMAND_PASTE);
   
   private int sourceActions;
   private Icon visualRepresentation;
 
   /**
    * The name of the property into/from which this TransferHandler
    * imports/exports. 
    */
   private String propertyName;
 
+  /**
+   * The DragGestureRecognizer for Swing.
+   */
+  private SwingDragGestureRecognizer recognizer;
+
   public static Action getCopyAction()
   {
     return copyAction;
   }
 
   public static Action getCutAction()
   {
     return cutAction;
   }
 
   public static Action getPasteAction()
   {
     return pasteAction;
   }
 
@@ -319,34 +426,51 @@
    *         from the specified component, or null if the component doesn't
    *         have a readable property like the transfer handler
    */
   protected Transferable createTransferable(JComponent c) 
   {
     Transferable transferable = null;
     if (propertyName != null)
       {
         PropertyDescriptor prop = getPropertyDescriptor(c);
         if (prop != null)
           transferable = new PropertyTransferable(c, prop);
       }
     return transferable;
   }
 
-  public void exportAsDrag(JComponent c, InputEvent e, int action) 
-    throws NotImplementedException
+  public void exportAsDrag(JComponent c, InputEvent e, int action)
   {
-    // TODO: Implement this properly
+    int src = getSourceActions(c);
+    int drag = src & action;
+    if (! (e instanceof MouseEvent))
+      {
+        drag = NONE;
+      }
+    if (drag != NONE)
+      {
+        if (recognizer == null)
+          {
+            SwingDragHandler ds = new SwingDragHandler();
+            recognizer = new SwingDragGestureRecognizer(ds);
+          }
+        recognizer.gesture(c, (MouseEvent) e, src, drag);
+      }
+    else
+      {
+        exportDone(c, null, NONE);
+      }
   }
 
   /**
    * This method is invoked after data has been exported.
    * Subclasses should implement this method to remove the data that has been
    * transferred when the action was <code>MOVE</code>.
    *
    * The default implementation does nothing because MOVE is not supported.
    *
    * @param c the source component
    * @param data the data that has been transferred or <code>null</code>
    *        when the action is NONE
    * @param action the action that has been performed
    */
   protected void exportDone(JComponent c, Transferable data, int action)

Reply via email to