break;
case wxDF_PRIVATE:
wxPrivateDropTarget *pdt = (wxPrivateDropTarget *)this;
- strcpy( buf, "applications/" );
- strcat( buf, WXSTRINGCAST pdt->GetID() );
+ strcpy( buf, WXSTRINGCAST pdt->GetID() );
format.target = buf;
valid++;
default:
" ......................... "};
+//-----------------------------------------------------------------------------
+// globals
+//-----------------------------------------------------------------------------
+
+wxDropSource *gs_currentDropSource = (wxDropSource*) NULL;
+
+//-----------------------------------------------------------------------------
+// "drop_enter_event"
+//-----------------------------------------------------------------------------
+
+static void gtk_target_enter_callback( GtkWidget *WXUNUSED(widget),
+ GdkEventDropEnter *WXUNUSED(event),
+ wxDropTarget *target )
+{
+ if (target)
+ target->OnEnter();
+}
+
+//-----------------------------------------------------------------------------
+// "drop_leave_event"
+//-----------------------------------------------------------------------------
+
+static void gtk_target_leave_callback( GtkWidget *WXUNUSED(widget),
+ GdkEventDropLeave *WXUNUSED(event),
+ wxDropTarget *target )
+{
+ if (target)
+ target->OnLeave();
+}
+
//-----------------------------------------------------------------------------
// "drop_data_available_event"
//-----------------------------------------------------------------------------
wxDropTarget::wxDropTarget()
{
+ m_format = (wxDataFormat*) NULL;
}
wxDropTarget::~wxDropTarget()
{
+ if (m_format) delete m_format;
+}
+
+wxDataFormat &wxDropTarget::GetFormat(size_t n) const
+{
+ return (*m_format);
}
void wxDropTarget::UnregisterWidget( GtkWidget *widget )
for ( size_t i = 0; i < GetFormatCount(); i++ )
{
- wxDataFormat df = GetFormat( i );
- switch (df)
+ switch (GetFormat(i).GetType())
{
case wxDF_TEXT:
{
{
if (i > 0) formats += ";";
wxPrivateDropTarget *pdt = (wxPrivateDropTarget *)this;
- formats += "applications/";
formats += pdt->GetId();
valid++;
break;
gtk_signal_connect( GTK_OBJECT(widget), "drop_data_available_event",
GTK_SIGNAL_FUNC(gtk_target_callback), (gpointer) this );
+
+ gtk_signal_connect( GTK_OBJECT(widget), "drop_enter_event",
+ GTK_SIGNAL_FUNC(gtk_target_enter_callback), (gpointer) this );
+
+ gtk_signal_connect( GTK_OBJECT(widget), "drop_leave_event",
+ GTK_SIGNAL_FUNC(gtk_target_leave_callback), (gpointer) this );
}
// ----------------------------------------------------------------------------
// wxTextDropTarget
// ----------------------------------------------------------------------------
+wxTextDropTarget::wxTextDropTarget()
+{
+ m_format = new wxDataFormat( wxDF_TEXT );
+}
+
bool wxTextDropTarget::OnDrop( long x, long y, const void *data, size_t WXUNUSED(size) )
{
OnDropText( x, y, (const char*)data );
return 1;
}
-wxDataFormat wxTextDropTarget::GetFormat(size_t WXUNUSED(n)) const
-{
- return wxDF_TEXT;
-}
-
// ----------------------------------------------------------------------------
// wxPrivateDropTarget
// ----------------------------------------------------------------------------
wxPrivateDropTarget::wxPrivateDropTarget()
{
m_id = wxTheApp->GetAppName();
+ m_format = new wxDataFormat( m_id );
}
-size_t wxPrivateDropTarget::GetFormatCount() const
+void wxPrivateDropTarget::SetId( const wxString& id )
{
- return 1;
+ m_id = id;
+ m_format->SetId( id );
}
-wxDataFormat wxPrivateDropTarget::GetFormat(size_t WXUNUSED(n)) const
+size_t wxPrivateDropTarget::GetFormatCount() const
{
- return wxDF_PRIVATE;
+ return 1;
}
// ----------------------------------------------------------------------------
// wxFileDropTarget
// ----------------------------------------------------------------------------
+wxFileDropTarget::wxFileDropTarget()
+{
+ m_format = new wxDataFormat( wxDF_FILENAME );
+}
+
bool wxFileDropTarget::OnDropFiles( long x, long y, size_t nFiles, const char * const aszFiles[] )
{
printf( "Got %d dropped files.\n", (int)nFiles );
return 1;
}
-wxDataFormat wxFileDropTarget::GetFormat(size_t WXUNUSED(n)) const
-{
- return wxDF_FILENAME;
-}
-
//-------------------------------------------------------------------------
// wxDropSource
//-------------------------------------------------------------------------
static void
shape_motion (GtkWidget *widget,
- GdkEventMotion */*event*/);
+ GdkEventMotion * /*event*/);
//-----------------------------------------------------------------------------
-// drag request
+// "drag_request_event"
+//-----------------------------------------------------------------------------
-void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDropSource *source )
+void gtk_drag_callback( GtkWidget *widget, GdkEventDragRequest *event, wxDropSource *source )
{
- wxDataObject *data = source->m_data;
-
- switch (data->GetFormat())
+ wxDataBroker *data = source->m_data;
+
+ if (!data) return;
+
+ wxNode *node = data->m_dataObjects.First();
{
- case wxDF_PRIVATE:
- {
- wxPrivateDataObject *pdo = (wxPrivateDataObject*) data;
-
- gtk_widget_dnd_data_set( widget,
- event,
- (unsigned char*) pdo->GetData(),
- (int) pdo->GetDataSize() );
-
- break;
- }
- case wxDF_TEXT:
+ wxDataObject *dobj = (wxDataObject*) node->Data();
+
+ if ((strcmp(event->data_type,"file:ALL") == 0) &&
+ (dobj->GetFormat().GetType() == wxDF_FILENAME))
{
- wxTextDataObject *text_object = (wxTextDataObject*) data;
+ wxFileDataObject *file_object = (wxFileDataObject*) dobj;
- wxString text = text_object->GetText();
+ wxString text = file_object->GetFiles();
char *s = WXSTRINGCAST text;
gtk_widget_dnd_data_set( widget,
- event,
+ (GdkEvent*)event,
(unsigned char*) s,
(int) text.Length()+1 );
- break;
+ source->m_retValue = wxDragCopy;
+
+ return;
}
- case wxDF_FILENAME:
+ if ((strcmp(event->data_type,"text/plain") == 0) &&
+ (dobj->GetFormat().GetType() == wxDF_TEXT))
{
- wxFileDataObject *file_object = (wxFileDataObject*) data;
+ wxTextDataObject *text_object = (wxTextDataObject*) dobj;
- wxString text = file_object->GetFiles();
+ wxString text = text_object->GetText();
char *s = WXSTRINGCAST text;
gtk_widget_dnd_data_set( widget,
- event,
+ (GdkEvent*)event,
(unsigned char*) s,
(int) text.Length()+1 );
- break;
+ source->m_retValue = wxDragCopy;
+
+ return;
}
- default:
+ if (dobj->GetFormat().GetType() == wxDF_PRIVATE)
{
- return;
+ wxPrivateDataObject *pdo = (wxPrivateDataObject*) dobj;
+
+ if (pdo->GetId() == event->data_type)
+ {
+ gtk_widget_dnd_data_set( widget,
+ (GdkEvent*)event,
+ (unsigned char*) pdo->GetData(),
+ (int) pdo->GetSize() );
+
+ source->m_retValue = wxDragCopy;
+
+ return;
+ }
}
+
+ node = node->Next();
}
-
- source->m_retValue = wxDragCopy;
}
wxDropSource::wxDropSource( wxWindow *win )
m_widget = win->m_widget;
if (win->m_wxwindow) m_widget = win->m_wxwindow;
- m_data = (wxDataObject *) NULL;
+ m_data = (wxDataBroker*) NULL;
m_retValue = wxDragCancel;
m_defaultCursor = wxCursor( wxCURSOR_NO_ENTRY );
m_goaheadCursor = wxCursor( wxCURSOR_HAND );
}
-wxDropSource::wxDropSource( wxDataObject &data, wxWindow *win )
+wxDropSource::wxDropSource( wxDataObject *data, wxWindow *win )
{
g_blockEventsOnDrag = TRUE;
if (win->m_wxwindow) m_widget = win->m_wxwindow;
m_retValue = wxDragCancel;
- m_data = &data;
+ if (data)
+ {
+ m_data = new wxDataBroker();
+ m_data->Add( data );
+ }
+ else
+ {
+ m_data = (wxDataBroker*) NULL;
+ }
m_defaultCursor = wxCursor( wxCURSOR_NO_ENTRY );
m_goaheadCursor = wxCursor( wxCURSOR_HAND );
}
-void wxDropSource::SetData( wxDataObject &data )
+wxDropSource::wxDropSource( wxDataBroker *data, wxWindow *win )
+{
+ g_blockEventsOnDrag = TRUE;
+
+ m_window = win;
+ m_widget = win->m_widget;
+ if (win->m_wxwindow) m_widget = win->m_wxwindow;
+ m_retValue = wxDragCancel;
+
+ m_data = data;
+
+ m_defaultCursor = wxCursor( wxCURSOR_NO_ENTRY );
+ m_goaheadCursor = wxCursor( wxCURSOR_HAND );
+}
+
+void wxDropSource::SetData( wxDataObject *data )
+{
+ if (m_data) delete m_data;
+
+ if (data)
+ {
+ m_data = new wxDataBroker();
+ m_data->Add( data );
+ }
+ else
+ {
+ m_data = (wxDataBroker*) NULL;
+ }
+}
+
+void wxDropSource::SetData( wxDataBroker *data )
{
- m_data = &data;
+ if (m_data) delete m_data;
+
+ m_data = data;
}
wxDropSource::~wxDropSource(void)
{
-// if (m_data) delete m_data;
+ if (m_data) delete m_data;
g_blockEventsOnDrag = FALSE;
}
wxGetMousePosition( &x, &y );
gdk_dnd_display_drag_cursor( x, y, FALSE, TRUE );
-
+
+ gs_currentDropSource = this;
+
while (gdk_dnd.drag_really || gdk_dnd.drag_perhaps) wxYield();
+
+ gs_currentDropSource = (wxDropSource*) NULL;
UnregisterWindow();
wxString formats;
- wxDataFormat df = m_data->GetFormat();
-
- switch (df)
+ wxNode *node = m_data->m_dataObjects.First();
+ while (node)
{
- case wxDF_TEXT:
- {
- formats += "text/plain";
- break;
- }
- case wxDF_FILENAME:
- {
- formats += "file:ALL";
- break;
- }
- case wxDF_PRIVATE:
- {
- wxPrivateDataObject* pdo = (wxPrivateDataObject*) m_data;
- formats += "applications/";
- formats += pdo->GetId();
- break;
+ wxDataObject* dobj = (wxDataObject*) node->Data();
+
+ switch (dobj->GetFormat().GetType())
+ {
+ case wxDF_TEXT:
+ {
+ formats += "text/plain";
+ break;
+ }
+ case wxDF_FILENAME:
+ {
+ formats += "file:ALL";
+ break;
+ }
+ case wxDF_PRIVATE:
+ {
+ wxPrivateDataObject* pdo = (wxPrivateDataObject*) m_data;
+ formats += pdo->GetId();
+ break;
+ }
+ default:
+ break;
}
- default:
- break;
+ node = node->Next();
}
char *str = WXSTRINGCAST formats;
static void
shape_motion (GtkWidget *widget,
- GdkEventMotion */*event*/)
+ GdkEventMotion * /*event*/ )
{
gint xp, yp;
CursorOffset * p;
* Can't use event->x / event->y here
* because I need absolute coordinates.
*/
+
gdk_window_get_pointer (root_win, &xp, &yp, &mask);
gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
+
+ if (gs_currentDropSource) gs_currentDropSource->GiveFeedback( wxDragCopy, FALSE );
}
GtkWidget *