OSDN Git Service

Merged gcj-eclipse branch to trunk.
[pf3gnuchains/gcc-fork.git] / libjava / classpath / native / jni / gtk-peer / GtkDragSourceContextPeer.c
index 6dfbfcc..62ffa13 100644 (file)
@@ -42,7 +42,8 @@ exception statement from your version. */
 #include <gtk/gtk.h>
 
 static GtkWidget * get_widget (GtkWidget *widget);
-  
+static void connect_signals_for_widget (GtkWidget *widget);
+                                         
 #define ACTION_COPY 1
 #define ACTION_MOVE 2
 #define ACTION_COPY_OR_MOVE  3
@@ -63,21 +64,35 @@ static GtkWidget * get_widget (GtkWidget *widget);
 #define AWT_HAND_CURSOR 12
 #define AWT_MOVE_CURSOR 13
 
+static jmethodID dragEnterID;
+static jmethodID dragExitID;
+static jmethodID dragDropEndID;
+static jmethodID dragMouseMovedID;
+static jmethodID dragOverID;
+static jmethodID dragActionChangedID;
+static jmethodID acceptDragID;
+static jmethodID rejectDragID;
+static jmethodID acceptDropID;
+static jmethodID rejectDropID;
+static jmethodID dropCompleteID;
+
 GtkWidget *widget;
+GtkWidget *tgt;
+jobject *gref;
+jobject javaObj;
 
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_create 
   (JNIEnv *env, jobject obj, jobject comp)
-{
-  void *ptr;
-  
+{  
   gdk_threads_enter ();
-  
+  javaObj = obj;
   NSA_SET_GLOBAL_REF (env, obj);  
   NSA_SET_GLOBAL_REF (env, comp);
   
-  ptr = NSA_GET_PTR (env, comp);
-  widget = get_widget (GTK_WIDGET (ptr));
+  gref = NSA_GET_PTR (env, comp);
+  widget = get_widget (GTK_WIDGET (gref));
 
   gdk_threads_leave ();
 }
@@ -93,6 +108,7 @@ Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeSetCursor
 
   gdk_threads_enter ();
 
+  javaObj = obj;
   ptr = NSA_GET_GLOBAL_REF (env, obj);
   
   switch (type)
@@ -158,31 +174,81 @@ JNIEXPORT void JNICALL
 Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_connectSignals 
   (JNIEnv *env, jobject obj, jobject comp)
 {
-  jobject *gref;
-  void *ptr;
+  jclass gtkdragsourcecontextpeer;
+  jclass gtkdroptargetcontextpeer;
   
   gdk_threads_enter ();
 
-  ptr = NSA_GET_GLOBAL_REF (env, obj);
+  javaObj = obj;
   gref = NSA_GET_GLOBAL_REF (env, comp);
+  
+  connect_signals_for_widget (widget);
+
+  gtkdragsourcecontextpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(),
+                         "gnu/java/awt/dnd/peer/gtk/GtkDragSourceContextPeer");
+  
+  dragEnterID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
+                                            gtkdragsourcecontextpeer,
+                                               "dragEnter", "(II)V");
+  dragExitID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
+                                            gtkdragsourcecontextpeer,
+                                               "dragExit", "(III)V");
+  dragDropEndID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
+                                             gtkdragsourcecontextpeer,
+                                               "dragDropEnd", "(IZII)V");
+  dragMouseMovedID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                             gtkdragsourcecontextpeer,
+                                               "dragMouseMoved", "(II)V");
+  dragOverID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                             gtkdragsourcecontextpeer,
+                                               "dragOver", "(II)V");
+  dragActionChangedID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                             gtkdragsourcecontextpeer,
+                                               "dragActionChanged", "(II)V");
+
+
+  gtkdroptargetcontextpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(),
+                         "gnu/java/awt/dnd/peer/gtk/GtkDropTargetContextPeer");
+                         
+  acceptDragID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
+                                            gtkdroptargetcontextpeer,
+                                               "acceptDrag", "(I)V");
+  rejectDragID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
+                                            gtkdroptargetcontextpeer,
+                                               "rejectDrag", "()V");
+  acceptDropID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
+                                             gtkdroptargetcontextpeer,
+                                               "acceptDrop", "(I)V");
+  rejectDropID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                             gtkdroptargetcontextpeer,
+                                               "rejectDrop", "()V");
+  dropCompleteID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                             gtkdroptargetcontextpeer,
+                                               "dropComplete", "(Z)V");
+  
+  gdk_threads_leave ();
+}
+
+static void
+connect_signals_for_widget (GtkWidget *w)
+{
+  /* FIXME: Not implemented. */
+  w = NULL;
+}
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_setTarget
+  (JNIEnv *env, jobject obj, jobject target)
+{
+  void *ptr;
+  
+  gdk_threads_enter ();
+  
+  javaObj = obj;
+  ptr = NSA_GET_PTR (env, target);
+  tgt = get_widget (GTK_WIDGET (ptr));
+  connect_signals_for_widget (tgt);
 
- /* 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 ();
 }
 
@@ -200,7 +266,8 @@ Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeStartDrag
   GdkDragAction action = GDK_ACTION_DEFAULT;
   
   gdk_threads_enter ();
-
+  
+  javaObj = obj;
   ptr = NSA_GET_GLOBAL_REF (env, obj);
 
   data = (*env)->GetStringUTFChars (env, target, NULL);
@@ -225,7 +292,9 @@ Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeStartDrag
       action = GDK_ACTION_DEFAULT;
     }
 
-  gtk_drag_highlight (widget);
+  gtk_drag_dest_set (widget, GTK_DEST_DEFAULT_ALL, tar,
+                                             sizeof (tar) / sizeof (GtkTargetEntry),
+                                             action);
   context = gtk_drag_begin (widget, 
              gtk_target_list_new (tar, sizeof (tar) / sizeof (GtkTargetEntry)), 
              action, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, event);
@@ -235,6 +304,11 @@ Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeStartDrag
     image = cp_gtk_image_get_pixbuf (env, img);
     gtk_drag_set_icon_pixbuf (context, image, x, y);
   }
+  
+  if (tgt != NULL)
+    gtk_drag_dest_set (tgt, GTK_DEST_DEFAULT_ALL, tar,
+                                        sizeof (tar) / sizeof (GtkTargetEntry),
+                                         action);
 
   gdk_event_free (event);
   (*env)->ReleaseStringUTFChars (env, target, data);