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 \