]> git.saurik.com Git - wxWidgets.git/commitdiff
More DnD.
authorRobert Roebling <robert@roebling.de>
Thu, 21 Oct 1999 13:09:06 +0000 (13:09 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 21 Oct 1999 13:09:06 +0000 (13:09 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4100 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/clipbrd.h
include/wx/dnd.h
include/wx/gtk/dnd.h
include/wx/gtk1/dnd.h
setup.h.in
src/common/appcmn.cpp
src/common/clipcmn.cpp
src/gtk/dnd.cpp
src/gtk1/dnd.cpp

index 7f79269aed56619cdf55cf6868f584482d148942..47f0af66b5e441b4964cee32ed42dbb8f3eac47b 100644 (file)
@@ -73,15 +73,6 @@ public:
     // X11 has two clipboards which get selected by this call. Empty on MSW.
     virtual void UsePrimarySelection( bool WXUNUSED(primary) = FALSE ) { }
 
-#ifdef WXWIN_COMPATIBILITY_2
-    // deprecated version
-    bool GetData(wxDataObject *data)
-    {
-        wxCHECK_MSG(data, FALSE, wxT("NULL pointer in wxClipboard"));
-
-        return GetData(*data);
-    }
-#endif // WXWIN_COMPATIBILITY_2
 };
 
 // ----------------------------------------------------------------------------
index 82fb690739cdd2add729cb0ab37a4a7e20a17d56..3bee4fc7c35200c883d67fcd2fd120ecf7eac357 100644 (file)
@@ -45,8 +45,10 @@ public:
 
     // set the data which is transfered by drag and drop
     void SetData(wxDataObject& data) 
-      { if (m_data) delete m_data; 
-        m_data = &data; }
+      { m_data = &data; }
+      
+    wxDataObject *GetDataObject()
+      { return m_data; }
 
     // start drag action, see enum wxDragResult for return value description
     //
index edc321382d78315802601c0259b95b3b435e7fad..aa45735342373687be73ceb7db91971e578018a0 100644 (file)
@@ -33,7 +33,6 @@ class wxWindow;
 class wxDropTarget;
 class wxTextDropTarget;
 class wxFileDropTarget;
-class wxPrivateDropTarget;
 
 class wxDropSource;
 
@@ -70,6 +69,37 @@ public:
     void SetDragTime( guint time ) { m_dragTime = time; }
 };
 
+// ----------------------------------------------------------------------------
+// A simple wxDropTarget derived class for text data: you only need to
+// override OnDropText() to get something working
+// ----------------------------------------------------------------------------
+
+class wxTextDropTarget : public wxDropTarget
+{
+public:
+    wxTextDropTarget();
+
+    virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text) = 0;
+
+    virtual bool OnData(wxCoord x, wxCoord y);
+};
+
+// ----------------------------------------------------------------------------
+// A drop target which accepts files (dragged from File Manager or Explorer)
+// ----------------------------------------------------------------------------
+
+class wxFileDropTarget : public wxDropTarget
+{
+public:
+    wxFileDropTarget();
+
+    // parameters are the number of files and the array of file names
+    virtual bool OnDropFiles(wxCoord x, wxCoord y,
+                             const wxArrayString& filenames) = 0;
+
+    virtual bool OnData(wxCoord x, wxCoord y);
+};
+
 //-------------------------------------------------------------------------
 // wxDropSource
 //-------------------------------------------------------------------------
@@ -100,7 +130,6 @@ public:
     GtkWidget     *m_widget;
     wxWindow      *m_window;
     wxDragResult   m_retValue;
-    wxDataObject  *m_data;
 
     wxCursor      m_defaultCursor;
     wxCursor      m_goaheadCursor;
index edc321382d78315802601c0259b95b3b435e7fad..aa45735342373687be73ceb7db91971e578018a0 100644 (file)
@@ -33,7 +33,6 @@ class wxWindow;
 class wxDropTarget;
 class wxTextDropTarget;
 class wxFileDropTarget;
-class wxPrivateDropTarget;
 
 class wxDropSource;
 
@@ -70,6 +69,37 @@ public:
     void SetDragTime( guint time ) { m_dragTime = time; }
 };
 
+// ----------------------------------------------------------------------------
+// A simple wxDropTarget derived class for text data: you only need to
+// override OnDropText() to get something working
+// ----------------------------------------------------------------------------
+
+class wxTextDropTarget : public wxDropTarget
+{
+public:
+    wxTextDropTarget();
+
+    virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text) = 0;
+
+    virtual bool OnData(wxCoord x, wxCoord y);
+};
+
+// ----------------------------------------------------------------------------
+// A drop target which accepts files (dragged from File Manager or Explorer)
+// ----------------------------------------------------------------------------
+
+class wxFileDropTarget : public wxDropTarget
+{
+public:
+    wxFileDropTarget();
+
+    // parameters are the number of files and the array of file names
+    virtual bool OnDropFiles(wxCoord x, wxCoord y,
+                             const wxArrayString& filenames) = 0;
+
+    virtual bool OnData(wxCoord x, wxCoord y);
+};
+
 //-------------------------------------------------------------------------
 // wxDropSource
 //-------------------------------------------------------------------------
@@ -100,7 +130,6 @@ public:
     GtkWidget     *m_widget;
     wxWindow      *m_window;
     wxDragResult   m_retValue;
-    wxDataObject  *m_data;
 
     wxCursor      m_defaultCursor;
     wxCursor      m_goaheadCursor;
index bee58e8a1c3716e5a6bedb4abf37ab36e0f9a680..cdcdbb7b0d5650b82e4fa82cbe76698f7330f134 100644 (file)
  * Use Apple Ieee-double converter
  */
 #define wxUSE_APPLE_IEEE 0
-
+/*
+ * Compatibility with 2.0 API.
+ */
+#define WXWIN_COMPATIBILITY_2 1
 /*
  * Enables debugging: memory tracing, assert, etc., contains debug level
  */
index 8cb28408e7bcdf4eb427c7c8dad95367c44b4553..7cf023dc9f68d327f0916670f6ce1303a89132e9 100644 (file)
 #endif
 
 #include "wx/thread.h"
-#include "wx/clipbrd.h"
-
-// ===========================================================================
-// implementation
-// ===========================================================================
-
-// ----------------------------------------------------------------------------
-// some global data defined here
-// ----------------------------------------------------------------------------
-
-IMPLEMENT_DYNAMIC_CLASS(wxClipboardModule, wxModule)
 
 // ---------------------------------------------------------------------------
 // wxAppBase
index 7dc2ef20307c885a8aa8a1e64d8ec730e349e758..94dbdd07efa63fa9fad928648059d7f36a0a9808 100644 (file)
@@ -42,12 +42,13 @@ wxClipboardBase::wxClipboardBase()
 // wxClipboardModule: module responsible for initializing the global clipboard
 // object
 //
-// NB: IMPLEMENT_DYNAMIC_CLASS() for it is in common/appcmn.cpp
 // ----------------------------------------------------------------------------
 
 class wxClipboardModule : public wxModule
 {
 public:
+    wxClipboardModule() { }
+
     bool OnInit()
         { wxTheClipboard = new wxClipboard; return TRUE; }
     void OnExit()
@@ -57,3 +58,5 @@ private:
     DECLARE_DYNAMIC_CLASS(wxClipboardModule)
 };
 
+IMPLEMENT_DYNAMIC_CLASS(wxClipboardModule,wxModule)
+
index f59b86d3304c00d2d7b8fcc1408c164fdc8f7c07..a22731b164295f02cd71357d640ad0f187974ace 100644 (file)
@@ -256,6 +256,8 @@ static gboolean target_drag_drop( GtkWidget *widget,
 
     if (!ret)
     {
+        wxLogDebug( wxT( "Drop target: OnDrop returned TRUE") );
+       
         /* cancel the whole thing */
         gtk_drag_finish( context,
                           FALSE,        /* no success */
@@ -264,6 +266,8 @@ static gboolean target_drag_drop( GtkWidget *widget,
     }
     else
     {
+        wxLogDebug( wxT( "Drop target: OnDrop returned TRUE") );
+       
 #if wxUSE_THREADS
         /* disable GUI threads */
         wxapp_uninstall_thread_wakeup();
@@ -324,7 +328,7 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget),
         return;
     }
 
-    wxLogDebug( wxT( "Drop target: data received") );
+    wxLogDebug( wxT( "Drop target: data received event") );
     
     /* inform the wxDropTarget about the current GtkSelectionData.
        this is only valid for the duration of this call */
@@ -332,11 +336,15 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget),
 
     if (drop_target->OnData( x, y ))
     {
+        wxLogDebug( wxT( "Drop target: OnData returned TRUE") );
+       
         /* tell GTK that data transfer was successfull */
         gtk_drag_finish( context, TRUE, FALSE, time );
     }
     else
     {
+        wxLogDebug( wxT( "Drop target: OnData returned FALSE") );
+       
         /* tell GTK that data transfer was not successfull */
         gtk_drag_finish( context, FALSE, FALSE, time );
     }
@@ -448,7 +456,9 @@ bool wxDropTarget::GetData()
        return TRUE;
     }
 
-    return FALSE;
+    m_dataObject->SetData( dragFormat, (size_t)m_dragData->length, (const void*)m_dragData->data );
+
+    return TRUE;
 }
 
 void wxDropTarget::UnregisterWidget( GtkWidget *widget )
@@ -503,6 +513,41 @@ void wxDropTarget::RegisterWidget( GtkWidget *widget )
                       GTK_SIGNAL_FUNC(target_drag_data_received), (gpointer) this );
 }
 
+// ----------------------------------------------------------------------------
+// wxTextDropTarget
+// ----------------------------------------------------------------------------
+
+wxTextDropTarget::wxTextDropTarget()
+                : wxDropTarget(new wxTextDataObject)
+{
+}
+
+bool wxTextDropTarget::OnData(wxCoord x, wxCoord y)
+{
+    if ( !GetData() )
+        return FALSE;
+
+    return OnDropText(x, y, ((wxTextDataObject *)m_dataObject)->GetText());
+}
+
+// ----------------------------------------------------------------------------
+// wxFileDropTarget
+// ----------------------------------------------------------------------------
+
+wxFileDropTarget::wxFileDropTarget()
+                : wxDropTarget(new wxFileDataObject)
+{
+}
+
+bool wxFileDropTarget::OnData(wxCoord x, wxCoord y)
+{
+    if ( !GetData() )
+        return FALSE;
+
+    return OnDropFiles(x, y,
+                       ((wxFileDataObject *)m_dataObject)->GetFilenames());
+}
+
 //----------------------------------------------------------------------------
 // "drag_data_get"
 //----------------------------------------------------------------------------
@@ -517,33 +562,41 @@ source_drag_data_get  (GtkWidget          *WXUNUSED(widget),
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-#ifdef __WXDEBUG__
-    char *name = gdk_atom_name( selection_data->target );
-    if (name) wxLogDebug( wxT("Drop source: format requested: %s"), name );
-#endif
+    wxDataFormat format( selection_data->target );
+    
+    wxLogDebug( wxT("Drop source: format requested: %s"), format.GetId().c_str() );
 
     drop_source->m_retValue = wxDragCancel;
     
-    wxDataObject *data = drop_source->m_data;
+    wxDataObject *data = drop_source->GetDataObject();
     
     if (!data)
+    {
+        wxLogDebug( wxT("Drop source: no data object") );
        return;
+    }
 
-    if (!data->IsSupportedFormat(selection_data->target))
+    if (!data->IsSupportedFormat(format))
+    {
+        wxLogDebug( wxT("Drop source: unsupported format") );
        return;
+    }
 
-    if (data->GetDataSize(selection_data->target) == 0)
+    if (data->GetDataSize(format) == 0)
+    {
+        wxLogDebug( wxT("Drop source: empty data") );
        return;
+    }
     
-    size_t size = data->GetDataSize(selection_data->target);
+    size_t size = data->GetDataSize(format);
 
 //  printf( "data size: %d.\n", (int)data_size );
 
     guchar *d = new guchar[size];
     
-    if (!data->GetDataHere( selection_data->target, (void*)d ))
+    if (!data->GetDataHere( format, (void*)d ))
     {
-        free( d );
+        delete[] d;
        return;
     }
 
@@ -563,7 +616,7 @@ source_drag_data_get  (GtkWidget          *WXUNUSED(widget),
     wxapp_install_thread_wakeup();
 #endif
 
-    free( d );
+    delete[] d;
     
     /* so far only copy, no moves. TODO. */
     drop_source->m_retValue = wxDragCopy;
index f59b86d3304c00d2d7b8fcc1408c164fdc8f7c07..a22731b164295f02cd71357d640ad0f187974ace 100644 (file)
@@ -256,6 +256,8 @@ static gboolean target_drag_drop( GtkWidget *widget,
 
     if (!ret)
     {
+        wxLogDebug( wxT( "Drop target: OnDrop returned TRUE") );
+       
         /* cancel the whole thing */
         gtk_drag_finish( context,
                           FALSE,        /* no success */
@@ -264,6 +266,8 @@ static gboolean target_drag_drop( GtkWidget *widget,
     }
     else
     {
+        wxLogDebug( wxT( "Drop target: OnDrop returned TRUE") );
+       
 #if wxUSE_THREADS
         /* disable GUI threads */
         wxapp_uninstall_thread_wakeup();
@@ -324,7 +328,7 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget),
         return;
     }
 
-    wxLogDebug( wxT( "Drop target: data received") );
+    wxLogDebug( wxT( "Drop target: data received event") );
     
     /* inform the wxDropTarget about the current GtkSelectionData.
        this is only valid for the duration of this call */
@@ -332,11 +336,15 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget),
 
     if (drop_target->OnData( x, y ))
     {
+        wxLogDebug( wxT( "Drop target: OnData returned TRUE") );
+       
         /* tell GTK that data transfer was successfull */
         gtk_drag_finish( context, TRUE, FALSE, time );
     }
     else
     {
+        wxLogDebug( wxT( "Drop target: OnData returned FALSE") );
+       
         /* tell GTK that data transfer was not successfull */
         gtk_drag_finish( context, FALSE, FALSE, time );
     }
@@ -448,7 +456,9 @@ bool wxDropTarget::GetData()
        return TRUE;
     }
 
-    return FALSE;
+    m_dataObject->SetData( dragFormat, (size_t)m_dragData->length, (const void*)m_dragData->data );
+
+    return TRUE;
 }
 
 void wxDropTarget::UnregisterWidget( GtkWidget *widget )
@@ -503,6 +513,41 @@ void wxDropTarget::RegisterWidget( GtkWidget *widget )
                       GTK_SIGNAL_FUNC(target_drag_data_received), (gpointer) this );
 }
 
+// ----------------------------------------------------------------------------
+// wxTextDropTarget
+// ----------------------------------------------------------------------------
+
+wxTextDropTarget::wxTextDropTarget()
+                : wxDropTarget(new wxTextDataObject)
+{
+}
+
+bool wxTextDropTarget::OnData(wxCoord x, wxCoord y)
+{
+    if ( !GetData() )
+        return FALSE;
+
+    return OnDropText(x, y, ((wxTextDataObject *)m_dataObject)->GetText());
+}
+
+// ----------------------------------------------------------------------------
+// wxFileDropTarget
+// ----------------------------------------------------------------------------
+
+wxFileDropTarget::wxFileDropTarget()
+                : wxDropTarget(new wxFileDataObject)
+{
+}
+
+bool wxFileDropTarget::OnData(wxCoord x, wxCoord y)
+{
+    if ( !GetData() )
+        return FALSE;
+
+    return OnDropFiles(x, y,
+                       ((wxFileDataObject *)m_dataObject)->GetFilenames());
+}
+
 //----------------------------------------------------------------------------
 // "drag_data_get"
 //----------------------------------------------------------------------------
@@ -517,33 +562,41 @@ source_drag_data_get  (GtkWidget          *WXUNUSED(widget),
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-#ifdef __WXDEBUG__
-    char *name = gdk_atom_name( selection_data->target );
-    if (name) wxLogDebug( wxT("Drop source: format requested: %s"), name );
-#endif
+    wxDataFormat format( selection_data->target );
+    
+    wxLogDebug( wxT("Drop source: format requested: %s"), format.GetId().c_str() );
 
     drop_source->m_retValue = wxDragCancel;
     
-    wxDataObject *data = drop_source->m_data;
+    wxDataObject *data = drop_source->GetDataObject();
     
     if (!data)
+    {
+        wxLogDebug( wxT("Drop source: no data object") );
        return;
+    }
 
-    if (!data->IsSupportedFormat(selection_data->target))
+    if (!data->IsSupportedFormat(format))
+    {
+        wxLogDebug( wxT("Drop source: unsupported format") );
        return;
+    }
 
-    if (data->GetDataSize(selection_data->target) == 0)
+    if (data->GetDataSize(format) == 0)
+    {
+        wxLogDebug( wxT("Drop source: empty data") );
        return;
+    }
     
-    size_t size = data->GetDataSize(selection_data->target);
+    size_t size = data->GetDataSize(format);
 
 //  printf( "data size: %d.\n", (int)data_size );
 
     guchar *d = new guchar[size];
     
-    if (!data->GetDataHere( selection_data->target, (void*)d ))
+    if (!data->GetDataHere( format, (void*)d ))
     {
-        free( d );
+        delete[] d;
        return;
     }
 
@@ -563,7 +616,7 @@ source_drag_data_get  (GtkWidget          *WXUNUSED(widget),
     wxapp_install_thread_wakeup();
 #endif
 
-    free( d );
+    delete[] d;
     
     /* so far only copy, no moves. TODO. */
     drop_source->m_retValue = wxDragCopy;