]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dnd.cpp
Added PushEventHandler, Pop...
[wxWidgets.git] / src / gtk / dnd.cpp
index 896763a93c327f7c5c89340bff179bd7b51ed8b3..72b29d4bf5a438112edf600d22f0c3018a01415a 100644 (file)
@@ -14,6 +14,7 @@
 #include "wx/window.h"
 #include "wx/app.h"
 #include "wx/gdicmn.h"
+#include <wx/intl.h>
 
 #include "gdk/gdkprivate.h"
 
@@ -143,10 +144,12 @@ wxDataFormat wxFileDropTarget::GetFormat(size_t WXUNUSED(n)) const
 //-----------------------------------------------------------------------------
 // drag request
 
-void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDataObject *data )
+void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDropSource *source )
 {
   printf( "Data requested for dropping.\n" );
   
+  wxDataObject *data = source->m_data;
+  
   uint size = data->GetDataSize();
   char *ptr = new char[size];
   data->GetDataHere( ptr );
@@ -154,6 +157,8 @@ void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDataObject *data )
   gtk_widget_dnd_data_set( widget, event, ptr, size );
   
   delete ptr;
+  
+  source->m_retValue = wxDropSource::Copy;
 };
 
 wxDropSource::wxDropSource( wxWindow *win )
@@ -164,7 +169,8 @@ wxDropSource::wxDropSource( wxWindow *win )
   m_widget = win->m_widget;
   if (win->m_wxwindow) m_widget = win->m_wxwindow;
   
-  m_data = NULL;  
+  m_data = NULL;
+  m_retValue = Cancel;
 
   m_defaultCursor = wxCursor( wxCURSOR_NO_ENTRY );
   m_goaheadCursor = wxCursor( wxCURSOR_HAND );
@@ -177,6 +183,7 @@ wxDropSource::wxDropSource( wxDataObject &data, wxWindow *win )
   m_window = win;
   m_widget = win->m_widget;
   if (win->m_wxwindow) m_widget = win->m_wxwindow;
+  m_retValue = Cancel;
   
   m_data = &data;
 
@@ -201,6 +208,8 @@ wxDropSource::DragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
   if (gdk_dnd.dnd_grabbed) return None;
   if (gdk_dnd.drag_really) return None;
   
+  wxASSERT_MSG( m_data, "wxDragSource: no data" );
+  
   if (!m_data) return None;
   if (m_data->GetDataSize() == 0) return None;
   
@@ -254,7 +263,9 @@ wxDropSource::DragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
   
   UnregisterWindow();
   
-  return Copy;
+  g_blockEventsOnDrag = FALSE;
+  
+  return m_retValue;
 };
 
 void wxDropSource::RegisterWindow(void)
@@ -282,7 +293,7 @@ void wxDropSource::RegisterWindow(void)
   gtk_widget_dnd_drag_set( m_widget, TRUE, &str, 1 );
 
   gtk_signal_connect( GTK_OBJECT(m_widget), "drag_request_event",
-    GTK_SIGNAL_FUNC(gtk_drag_callback), (gpointer)m_data );
+    GTK_SIGNAL_FUNC(gtk_drag_callback), (gpointer)this );
 };
 
 void wxDropSource::UnregisterWindow(void)
@@ -291,5 +302,5 @@ void wxDropSource::UnregisterWindow(void)
   
   gtk_widget_dnd_drag_set( m_widget, FALSE, NULL, 0 );
   
-  gtk_signal_disconnect_by_data( GTK_OBJECT(m_widget), (gpointer)m_data );
+  gtk_signal_disconnect_by_data( GTK_OBJECT(m_widget), (gpointer)this );
 };