Hi,

I have added a DnD demo to the AWT demo suite. Also, I have implemented
some more functionality. Unfortunately, it is not working really well,
there is still a lot that needs to be done.

At this point, we can start dragging a widget but we cannot stop
dragging it. This is because the native DropTarget*Peers have not been
implemented.

I know this package is far from complete, but I am having trouble
getting further with it. I figured committing what I have so far will
allow more people to work on it, as I need all the help I can get. If
anyone is interested, I can further explain the status of DnD.

There are FIXMEs indicating what needs to be added in some of the
gnu.java.awt.dnd.peer.* classes and the java.awt.dnd.* classes. 

Thanks,
Lillian


2006-07-17  Lillian Angel  <[EMAIL PROTECTED]>

        * examples/gnu/classpath/examples/awt/Demo.java
        (Demo): Added new window for DnD demo.
        (DragDropWindow): New class.
        * gnu/java/awt/dnd/peer/gtk/GtkDragSourceContextPeer.java:
        Added new fields and declarations for native functions.
        (GtkDragSourceContextPeer): Implemented.
        (getComponentPeer): New function.
        (startDrag): Partially implemented.
        (getCursor): Implemented.
        (setCursor): Implemented.
        * include/GtkDragSourceContextPeer.h: New file.
        * include/Makefile.am: Added new header file.
        * java/awt/Component.java
        (addNotify): Added call to the dropTarget's addNotify.
        * java/awt/dnd/DragSource.java
        (startDrag): Fixed code to use shared instances of peer and
        context.
        (getDragThreshold): Added stub.
        * java/awt/dnd/DropTarget.java
        (DropTarget): Implemented fully.
        (addNotify): Added code to get the peer of the parent that is
        not lightweight.
        * java/awt/dnd/DropTargetDragEvent.java
        (getTransferable): Added stub.
        * native/jni/gtk-peer/GtkDragSourceContextPeer.c: New file.
        * native/jni/gtk-peer/Makefile.am: Added new c file.
        * gnu/java/awt/dnd/peer/gtk/GtkDropTargetContextPeer.java:
        Changed to extend GtkGenericPeer.
        (GtkDropTargetContextPeer): New constructor.
        * gnu/java/awt/dnd/peer/gtk/GtkDropTargetPeer.java:
        Changed to extend GtkGenericPeer.
        (GtkDropTargetContextPeer): New constructor.

Index: examples/gnu/classpath/examples/awt/Demo.java
===================================================================
RCS file: /cvsroot/classpath/classpath/examples/gnu/classpath/examples/awt/Demo.java,v
retrieving revision 1.6
diff -u -r1.6 Demo.java
--- examples/gnu/classpath/examples/awt/Demo.java	23 May 2006 10:45:33 -0000	1.6
+++ examples/gnu/classpath/examples/awt/Demo.java	17 Jul 2006 18:32:26 -0000
@@ -20,11 +20,70 @@
 
 package gnu.classpath.examples.awt;
 
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Canvas;
+import java.awt.Checkbox;
+import java.awt.CheckboxGroup;
+import java.awt.CheckboxMenuItem;
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.DisplayMode;
+import java.awt.FileDialog;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.Label;
 import java.awt.List;
-import java.awt.event.*;
+import java.awt.Menu;
+import java.awt.MenuBar;
+import java.awt.MenuItem;
+import java.awt.MenuShortcut;
+import java.awt.Panel;
+import java.awt.ScrollPane;
+import java.awt.TextField;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+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.dnd.DropTarget;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.dnd.InvalidDnDOperationException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.net.URL;
-import java.util.*;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
 
 class Demo
 {
@@ -156,6 +215,7 @@
       addSubWindow ("Animation", new AnimationWindow ());
       addSubWindow ("Resolution", new ResolutionWindow ());
       addSubWindow ("Fullscreen", new FullscreenWindow ());
+      addSubWindow ("Drag n' Drop", new DragDropWindow ());
 
       Panel sp = new Panel();
       PrettyPanel p = new PrettyPanel();
@@ -799,6 +859,142 @@
     }
   }
 
+  static class DragDropWindow
+      extends SubFrame
+      implements ActionListener, DropTargetListener
+  {
+    DragLabel source = new DragLabel(
+                                     "Drag and drop me to the following JButton",
+                                     Label.CENTER);
+
+    Button target = new Button();
+
+    public void init()
+    {
+      source.setForeground(Color.red);
+      add(source, BorderLayout.NORTH);
+
+      target.addActionListener(this);
+      add(target, BorderLayout.SOUTH);
+
+      new DropTarget(target, DnDConstants.ACTION_COPY_OR_MOVE, this);
+
+      setSize(205, 100);
+
+      pack();
+    }
+
+    public void actionPerformed(ActionEvent e)
+    {
+      Button b = (Button) e.getSource();
+      b.setLabel("");
+    }
+
+    public void dragEnter(DropTargetDragEvent e)
+    {
+    }
+
+    public void dragExit(DropTargetEvent e)
+    {
+    }
+
+    public void dragOver(DropTargetDragEvent e)
+    {
+    }
+
+    public void drop(DropTargetDropEvent e)
+    {
+      try
+        {
+          Transferable t = e.getTransferable();
+
+          if (e.isDataFlavorSupported(DataFlavor.stringFlavor))
+            {
+              e.acceptDrop(e.getDropAction());
+
+              String s;
+              s = (String) t.getTransferData(DataFlavor.stringFlavor);
+
+              target.setLabel(s);
+
+              e.dropComplete(true);
+            }
+          else
+            e.rejectDrop();
+        }
+      catch (java.io.IOException e2)
+        {
+        }
+      catch (UnsupportedFlavorException e2)
+        {
+        }
+    }
+
+    public void dropActionChanged(DropTargetDragEvent e)
+    {
+    }
+
+    class DragLabel
+        extends Label
+        implements DragGestureListener, DragSourceListener
+    {
+      private DragSource ds = DragSource.getDefaultDragSource();
+
+      public DragLabel(String s, int alignment)
+      {
+        super(s, alignment);
+        int action = DnDConstants.ACTION_COPY_OR_MOVE;
+        ds.createDefaultDragGestureRecognizer(this, action, this);
+      }
+
+      public void dragGestureRecognized(DragGestureEvent e)
+      {
+        try
+          {
+            Transferable t = new StringSelection(getText());
+            e.startDrag(DragSource.DefaultCopyNoDrop, t, this);
+          }
+        catch (InvalidDnDOperationException e2)
+          {
+            System.out.println(e2);
+          }
+      }
+
+      public void dragDropEnd(DragSourceDropEvent e)
+      {
+        if (e.getDropSuccess() == false)
+          return;
+
+        int action = e.getDropAction();
+        if ((action & DnDConstants.ACTION_MOVE) != 0)
+          setText("");
+      }
+
+      public void dragEnter(DragSourceDragEvent e)
+      {
+        DragSourceContext ctx = e.getDragSourceContext();
+
+        int action = e.getDropAction();
+        if ((action & DnDConstants.ACTION_COPY) != 0)
+          ctx.setCursor(DragSource.DefaultCopyDrop);
+        else
+          ctx.setCursor(DragSource.DefaultCopyNoDrop);
+      }
+
+      public void dragExit(DragSourceEvent e)
+      {
+      }
+
+      public void dragOver(DragSourceDragEvent e)
+      {
+      }
+
+      public void dropActionChanged(DragSourceDragEvent e)
+      {
+      }
+    }
+  }
+  
   static class FullscreenWindow extends SubFrame
   {
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
Index: gnu/java/awt/dnd/peer/gtk/GtkDragSourceContextPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/dnd/peer/gtk/GtkDragSourceContextPeer.java,v
retrieving revision 1.1
diff -u -r1.1 GtkDragSourceContextPeer.java
--- gnu/java/awt/dnd/peer/gtk/GtkDragSourceContextPeer.java	6 Jul 2006 19:47:05 -0000	1.1
+++ gnu/java/awt/dnd/peer/gtk/GtkDragSourceContextPeer.java	17 Jul 2006 18:32:26 -0000
@@ -38,40 +38,84 @@
 
 package gnu.java.awt.dnd.peer.gtk;
 
+import gnu.java.awt.peer.gtk.GtkGenericPeer;
+
+import java.awt.Component;
 import java.awt.Cursor;
 import java.awt.Image;
 import java.awt.Point;
+import java.awt.Window;
 import java.awt.dnd.DragGestureEvent;
 import java.awt.dnd.DragSourceContext;
 import java.awt.dnd.InvalidDnDOperationException;
 import java.awt.dnd.peer.DragSourceContextPeer;
+import java.awt.peer.ComponentPeer;
+import java.awt.peer.LightweightPeer;
 
 public class GtkDragSourceContextPeer
+    extends GtkGenericPeer
     implements DragSourceContextPeer
 {
 
   private DragGestureEvent dge;
+  private ComponentPeer peer;
+  private Cursor cursor;
+  
+  native void nativeStartDrag(Image i, int x, int y, int action, String target);
+  native void connectSignals(ComponentPeer comp);
+  native void create(ComponentPeer comp);
+  native void nativeSetCursor(int cursor);
   
   public GtkDragSourceContextPeer(DragGestureEvent e)
   {
+    super(e.getComponent());
     dge = e;
+    
+    Component comp = e.getComponent();
+    
+    peer = getComponentPeer(comp);
+    create(peer);
+    connectSignals(peer);
+    cursor = comp.getCursor();
+  }
+  
+  ComponentPeer getComponentPeer(Component c)
+  {
+    Component curr = c;
+    while (curr.getPeer() instanceof LightweightPeer)
+      curr = curr.getParent();
+    
+    if (curr != null)
+      return curr.getPeer();
+    return null;
   }
   
   public void startDrag(DragSourceContext context, Cursor c, Image i, Point p)
       throws InvalidDnDOperationException
-  {
-    // FIXME: Not Implemented
+  {   
+    if (p == null)
+      p = new Point();
+    
+    // FIXME: use proper DataFlavor, not "text/plain".
+    // Also, add check to determine if dragging.
+    
+    setCursor(c);
+    nativeStartDrag(i, p.x, p.y, context.getTrigger().getDragAction(),
+                    "text/plain");
   }
 
   public Cursor getCursor()
   {
-    // FIXME: Not Implemented
-    return null;
+    return cursor;
   }
 
   public void setCursor(Cursor c) throws InvalidDnDOperationException
   {
-    // FIXME: Not Implemented
+    if (c != null)
+      {
+        nativeSetCursor(c.getType());
+        cursor = c;
+      }
   }
 
   public void transferablesFlavorsChanged()
Index: gnu/java/awt/dnd/peer/gtk/GtkDropTargetContextPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/dnd/peer/gtk/GtkDropTargetContextPeer.java,v
retrieving revision 1.1
diff -u -r1.1 GtkDropTargetContextPeer.java
--- gnu/java/awt/dnd/peer/gtk/GtkDropTargetContextPeer.java	6 Jul 2006 19:47:05 -0000	1.1
+++ gnu/java/awt/dnd/peer/gtk/GtkDropTargetContextPeer.java	17 Jul 2006 18:32:26 -0000
@@ -38,6 +38,8 @@
 
 package gnu.java.awt.dnd.peer.gtk;
 
+import gnu.java.awt.peer.gtk.GtkGenericPeer;
+
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.dnd.DropTarget;
@@ -45,9 +47,15 @@
 import java.awt.dnd.peer.DropTargetContextPeer;
 
 public class GtkDropTargetContextPeer
+    extends GtkGenericPeer
     implements DropTargetContextPeer
 {
 
+  public GtkDropTargetContextPeer()
+  {
+    super(null);
+  }
+  
   public void setTargetActions(int actions)
   {
     // FIXME: Not Implemented
Index: gnu/java/awt/dnd/peer/gtk/GtkDropTargetPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/dnd/peer/gtk/GtkDropTargetPeer.java,v
retrieving revision 1.1
diff -u -r1.1 GtkDropTargetPeer.java
--- gnu/java/awt/dnd/peer/gtk/GtkDropTargetPeer.java	6 Jul 2006 19:47:05 -0000	1.1
+++ gnu/java/awt/dnd/peer/gtk/GtkDropTargetPeer.java	17 Jul 2006 18:32:26 -0000
@@ -38,13 +38,21 @@
 
 package gnu.java.awt.dnd.peer.gtk;
 
+import gnu.java.awt.peer.gtk.GtkGenericPeer;
+
 import java.awt.dnd.DropTarget;
 import java.awt.dnd.peer.DropTargetPeer;
 
 public class GtkDropTargetPeer
+    extends GtkGenericPeer
     implements DropTargetPeer
 {
 
+  public GtkDropTargetPeer()
+  {
+    super(null);
+  }
+  
   public void addDropTarget(DropTarget target)
   {
     // FIXME: Not Implemented
Index: include/GtkDragSourceContextPeer.h
===================================================================
RCS file: include/GtkDragSourceContextPeer.h
diff -N include/GtkDragSourceContextPeer.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ include/GtkDragSourceContextPeer.h	17 Jul 2006 18:32:27 -0000
@@ -0,0 +1,23 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+
+#ifndef __GtkDragSourceContextPeer__
+#define __GtkDragSourceContextPeer__
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+JNIEXPORT void JNICALL Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeStartDrag (JNIEnv *env, jobject, jobject, jint, jint, jint, jstring);
+JNIEXPORT void JNICALL Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_connectSignals (JNIEnv *env, jobject, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_create (JNIEnv *env, jobject, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeSetCursor (JNIEnv *env, jobject, jint) ;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GtkDragSourceContextPeer__ */
Index: include/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/include/Makefile.am,v
retrieving revision 1.68
diff -u -r1.68 Makefile.am
--- include/Makefile.am	15 Jul 2006 19:54:55 -0000	1.68
+++ include/Makefile.am	17 Jul 2006 18:32:27 -0000
@@ -75,7 +75,8 @@
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkToolkit.h \
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h \
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkVolatileImage.h \
-$(top_srcdir)/include/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.h
+$(top_srcdir)/include/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.h \
+$(top_srcdir)/include/GtkDragSourceContextPeer.h
 
 QTPEER_H_FILES = \
 $(top_srcdir)/include/gnu_java_awt_peer_qt_QtCheckboxPeer.h \
Index: java/awt/Component.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/Component.java,v
retrieving revision 1.135
diff -u -r1.135 Component.java
--- java/awt/Component.java	14 Jul 2006 11:50:53 -0000	1.135
+++ java/awt/Component.java	17 Jul 2006 18:32:28 -0000
@@ -3856,6 +3856,8 @@
        the peer. For efficiency, the peer can choose not to
        invalidate if it is happy with the current dimensions,
        etc. */
+       if (dropTarget != null) 
+         dropTarget.addNotify(peer);
       }
   }
 
Index: java/awt/dnd/DragSource.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/dnd/DragSource.java,v
retrieving revision 1.9
diff -u -r1.9 DragSource.java
--- java/awt/dnd/DragSource.java	6 Jul 2006 19:47:05 -0000	1.9
+++ java/awt/dnd/DragSource.java	17 Jul 2006 18:32:28 -0000
@@ -51,7 +51,6 @@
 import java.awt.datatransfer.SystemFlavorMap;
 import java.awt.datatransfer.Transferable;
 import java.awt.dnd.peer.DragSourceContextPeer;
-import java.awt.event.MouseMotionListener;
 import java.io.Serializable;
 import java.util.EventListener;
 
@@ -77,6 +76,8 @@
   private transient DragSourceMotionListener dragSourceMotionListener;
   
   private static DragSource ds;
+  private DragSourceContextPeer peer;
+  private DragSourceContext context;
 
   /**
    * Initializes the drag source.
@@ -140,12 +141,17 @@
     // it to the peer, passing itself as a parameter. Now, the native system has
     // access to the Transferable through the context.
 
+    // FIXME: Add check to determine if dragging.
+    
     try
       {
         flavorMap = map;
-        DragSourceContextPeer peer = Toolkit.getDefaultToolkit().
-                                          createDragSourceContextPeer(trigger);
-        DragSourceContext context = createDragSourceContext(peer, trigger,
+        
+        if (peer == null)
+          peer = Toolkit.getDefaultToolkit().createDragSourceContextPeer(trigger);
+        
+        if (context == null)
+          context = createDragSourceContext(peer, trigger,
                                                             dragCursor,
                                                             dragImage,
                                                             imageOffset, trans,
@@ -306,4 +312,17 @@
     // Return an empty EventListener array.
     return new EventListener [0];
   }
+  
+  /**
+   * TODO
+   * @return
+   * 
+   * @since 1.5
+   */
+  public static int getDragThreshold()
+    throws NotImplementedException
+  {
+    // FIXME: Not implemented.
+    return 0;
+  }
 } // class DragSource
Index: java/awt/dnd/DropTarget.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/dnd/DropTarget.java,v
retrieving revision 1.14
diff -u -r1.14 DropTarget.java
--- java/awt/dnd/DropTarget.java	6 Jul 2006 19:47:05 -0000	1.14
+++ java/awt/dnd/DropTarget.java	17 Jul 2006 18:32:28 -0000
@@ -49,6 +49,7 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.peer.ComponentPeer;
+import java.awt.peer.LightweightPeer;
 import java.io.Serializable;
 import java.util.EventListener;
 import java.util.TooManyListenersException;
@@ -160,12 +161,15 @@
     if (GraphicsEnvironment.isHeadless ())
       throw new HeadlessException ();
 
-    component = c;
-    actions = i;
+    setComponent(c);
+    setDefaultActions(i);
     dropTargetListener = dtl;
     flavorMap = fm;
     
     setActive (b);
+    
+    if (c != null)
+      c.setDropTarget(this);
   }
 
   /**
@@ -275,9 +279,16 @@
 
   public void addNotify(ComponentPeer p)
   {
+    Component c = component;
+    while (c != null && p instanceof LightweightPeer)
+      {
+        p = c.getPeer();
+        c = c.getParent();
+      }
+
     if (p instanceof DropTargetPeer)
       {
-        peer = (DropTargetPeer) p;
+        peer = ((DropTargetPeer) p);
         peer.addDropTarget(this);
       }
     else
Index: java/awt/dnd/DropTargetDragEvent.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/dnd/DropTargetDragEvent.java,v
retrieving revision 1.5
diff -u -r1.5 DropTargetDragEvent.java
--- java/awt/dnd/DropTargetDragEvent.java	5 Jul 2006 17:45:50 -0000	1.5
+++ java/awt/dnd/DropTargetDragEvent.java	17 Jul 2006 18:32:28 -0000
@@ -40,6 +40,7 @@
 
 import java.awt.Point;
 import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
 import java.util.List;
 
 /**
@@ -136,4 +137,17 @@
   {
     context.rejectDrag ();
   }
+  
+  /**
+   * TODO
+   * 
+   * @return
+   * 
+   * @since 1.5
+   */
+  public Transferable getTransferable()
+  {
+    // FIXME: Not implemented
+    return null;
+  }
 } // class DropTargetDragEvent
Index: native/jni/gtk-peer/GtkDragSourceContextPeer.c
===================================================================
RCS file: native/jni/gtk-peer/GtkDragSourceContextPeer.c
diff -N native/jni/gtk-peer/GtkDragSourceContextPeer.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ native/jni/gtk-peer/GtkDragSourceContextPeer.c	17 Jul 2006 18:32:29 -0000
@@ -0,0 +1,256 @@
+/* gtkdragsourcecontextpeer.c -- Native implementation of GtkDragSourceContextPeer
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+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. */
+
+#include "gtkpeer.h"
+#include "GtkDragSourceContextPeer.h"
+
+#include <jni.h>
+#include <gtk/gtk.h>
+
+static GtkWidget * get_widget (GtkWidget *widget);
+  
+#define ACTION_COPY 1
+#define ACTION_MOVE 2
+#define ACTION_COPY_OR_MOVE  3
+#define ACTION_LINK 1073741824
+
+#define AWT_DEFAULT_CURSOR 0
+#define AWT_CROSSHAIR_CURSOR 1
+#define AWT_TEXT_CURSOR 2
+#define AWT_WAIT_CURSOR 3
+#define AWT_SW_RESIZE_CURSOR 4
+#define AWT_SE_RESIZE_CURSOR 5
+#define AWT_NW_RESIZE_CURSOR 6
+#define AWT_NE_RESIZE_CURSOR 7
+#define AWT_N_RESIZE_CURSOR 8
+#define AWT_S_RESIZE_CURSOR 9
+#define AWT_W_RESIZE_CURSOR 10
+#define AWT_E_RESIZE_CURSOR 11
+#define AWT_HAND_CURSOR 12
+#define AWT_MOVE_CURSOR 13
+
+GtkWidget *widget;
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_create 
+  (JNIEnv *env, jobject obj, jobject comp)
+{
+  void *ptr;
+  
+  gdk_threads_enter ();
+  
+  NSA_SET_GLOBAL_REF (env, obj);  
+  NSA_SET_GLOBAL_REF (env, comp);
+  
+  ptr = NSA_GET_PTR (env, comp);
+  widget = get_widget (GTK_WIDGET (ptr));
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeSetCursor
+  (JNIEnv *env, jobject obj, jint type)
+{
+  void *ptr;
+  GdkWindow *win;
+  GdkCursorType gdk_cursor_type;
+  GdkCursor *gdk_cursor;
+
+  gdk_threads_enter ();
+
+  ptr = NSA_GET_GLOBAL_REF (env, obj);
+  
+  switch (type)
+    {
+    case AWT_CROSSHAIR_CURSOR:
+      gdk_cursor_type = GDK_CROSSHAIR;
+      break;
+    case AWT_TEXT_CURSOR:
+      gdk_cursor_type = GDK_XTERM;
+      break;
+    case AWT_WAIT_CURSOR:
+      gdk_cursor_type = GDK_WATCH;
+      break;
+    case AWT_SW_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_BOTTOM_LEFT_CORNER;
+      break;
+    case AWT_SE_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_BOTTOM_RIGHT_CORNER;
+      break;
+    case AWT_NW_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_TOP_LEFT_CORNER;
+      break;
+    case AWT_NE_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_TOP_RIGHT_CORNER;
+      break;
+    case AWT_N_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_TOP_SIDE;
+      break;
+    case AWT_S_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_BOTTOM_SIDE;
+      break;
+    case AWT_W_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_LEFT_SIDE;
+      break;
+    case AWT_E_RESIZE_CURSOR:
+      gdk_cursor_type = GDK_RIGHT_SIDE;
+      break;
+    case AWT_HAND_CURSOR:
+      gdk_cursor_type = GDK_HAND2;
+      break;
+    case AWT_MOVE_CURSOR:
+      gdk_cursor_type = GDK_FLEUR;
+      break;
+    default:
+      gdk_cursor_type = GDK_LEFT_PTR;
+    }
+  
+  win = widget->window;
+  if ((widget->window) == NULL)
+    win = widget->window;
+    
+  gdk_cursor = gdk_cursor_new (gdk_cursor_type);
+
+  gdk_window_set_cursor (win, gdk_cursor);
+  gdk_cursor_unref (gdk_cursor);
+
+  gdk_flush();
+  
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_connectSignals 
+  (JNIEnv *env, jobject obj, jobject comp)
+{
+  jobject *gref;
+  void *ptr;
+  
+  gdk_threads_enter ();
+
+  ptr = NSA_GET_GLOBAL_REF (env, obj);
+  gref = NSA_GET_GLOBAL_REF (env, comp);
+
+ /* Uncomment when needed:
+  g_signal_connect (G_OBJECT (widget), "drag_motion",
+                    G_CALLBACK (drag_motion_cb), *gref);
+  g_signal_connect (G_OBJECT (widget), "drag_begin",
+                    G_CALLBACK (drag_begin_cb), *gref);
+  g_signal_connect (G_OBJECT (widget), "drag_end",
+                    G_CALLBACK (drag_end_cb), *gref);
+  g_signal_connect (G_OBJECT (widget), "drag_data_get",
+                    G_CALLBACK (drag_data_get_cb), *gref);
+  g_signal_connect (G_OBJECT (widget), "drag_drop",
+                    G_CALLBACK (drag_drop_cb), *gref);
+  g_signal_connect (G_OBJECT (widget), "drag_data_delete",
+                    G_CALLBACK (drag_data_delete_cb), *gref);
+  g_signal_connect (G_OBJECT (widget), "drag_data_received",
+                    G_CALLBACK (drag_data_received_cb), *gref);
+  */
+                                 
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeStartDrag
+  (JNIEnv *env, jobject obj, jobject img, jint x, jint y, jint act,
+   jstring target)
+{
+  void *ptr;
+  const gchar *data;
+  GtkTargetEntry tar[1];
+  GdkEvent *event;
+  GdkPixbuf *image = NULL;
+  GdkDragContext *context = NULL;
+  GdkDragAction action = GDK_ACTION_DEFAULT;
+  
+  gdk_threads_enter ();
+
+  ptr = NSA_GET_GLOBAL_REF (env, obj);
+
+  data = (*env)->GetStringUTFChars (env, target, NULL);
+  tar[0].target = (gchar *) data;  
+  event = gdk_event_new (GDK_ALL_EVENTS_MASK);
+  
+  switch (act)
+    {
+    case ACTION_COPY:
+      action = GDK_ACTION_COPY;
+      break;
+    case ACTION_MOVE:
+      action = GDK_ACTION_MOVE;
+      break;
+    case ACTION_COPY_OR_MOVE:
+      action = GDK_ACTION_COPY | GDK_ACTION_MOVE;
+      break;
+    case ACTION_LINK:
+      action = GDK_ACTION_LINK;
+      break;
+    default:
+      action = GDK_ACTION_DEFAULT;
+    }
+
+  gtk_drag_highlight (widget);
+  context = gtk_drag_begin (widget, 
+             gtk_target_list_new (tar, sizeof (tar) / sizeof (GtkTargetEntry)), 
+             action, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, event);
+
+  if (img != NULL)
+  {
+    image = cp_gtk_image_get_pixbuf (env, img);
+    gtk_drag_set_icon_pixbuf (context, image, x, y);
+  }
+
+  gdk_event_free (event);
+  (*env)->ReleaseStringUTFChars (env, target, data);  
+  
+  gdk_threads_leave ();
+}
+
+static GtkWidget *
+get_widget (GtkWidget *widget)
+{
+  GtkWidget *w;
+  
+  if (GTK_IS_EVENT_BOX (widget) || GTK_IS_CONTAINER (widget))
+    w = gtk_bin_get_child (GTK_BIN(widget));
+  else
+    w = widget;
+
+  return w;
+}
Index: native/jni/gtk-peer/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/Makefile.am,v
retrieving revision 1.47
diff -u -r1.47 Makefile.am
--- native/jni/gtk-peer/Makefile.am	15 Jul 2006 19:54:55 -0000	1.47
+++ native/jni/gtk-peer/Makefile.am	17 Jul 2006 18:32:29 -0000
@@ -40,6 +40,7 @@
 			gnu_java_awt_peer_gtk_GtkToolkit.c \
 			gnu_java_awt_peer_gtk_GtkWindowPeer.c \
 			gnu_java_awt_peer_gtk_GtkVolatileImage.c \
+			GtkDragSourceContextPeer.c \
 			cairographics2d.h \
 			gthread-jni.c \
 			gdkdisplay.h \

Reply via email to