From 23cf28b3dbbd8bcff65a0b24ffa962eb3addd845 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 28 Apr 2000 12:45:15 +0000 Subject: [PATCH] made dnd cursors/icons slightly more usable (and much more documented) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7305 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/dropsrc.tex | 27 +++++++++-- docs/latex/wx/function.tex | 15 +++++++ include/wx/gtk/dnd.h | 30 +++++++++++-- include/wx/gtk1/dnd.h | 30 +++++++++++-- include/wx/msw/ole/dropsrc.h | 10 +++++ samples/dnd/dnd.cpp | 18 ++++---- samples/dnd/dnd.rc | 3 ++ samples/dnd/dnd_copy.cur | Bin 0 -> 326 bytes samples/dnd/dnd_copy.xpm | 45 +++++++++++++++++++ samples/dnd/dnd_move.cur | Bin 0 -> 326 bytes samples/dnd/dnd_move.xpm | 44 ++++++++++++++++++ samples/dnd/dnd_none.cur | Bin 0 -> 326 bytes samples/dnd/dnd_none.xpm | 45 +++++++++++++++++++ src/gtk/dnd.cpp | 84 ++++++++++++++++++++++++----------- src/gtk1/dnd.cpp | 84 ++++++++++++++++++++++++----------- 15 files changed, 363 insertions(+), 72 deletions(-) create mode 100644 samples/dnd/dnd_copy.cur create mode 100644 samples/dnd/dnd_copy.xpm create mode 100644 samples/dnd/dnd_move.cur create mode 100644 samples/dnd/dnd_move.xpm create mode 100644 samples/dnd/dnd_none.cur create mode 100644 samples/dnd/dnd_none.xpm diff --git a/docs/latex/wx/dropsrc.tex b/docs/latex/wx/dropsrc.tex index b9ec41ca95..2ba59c8779 100644 --- a/docs/latex/wx/dropsrc.tex +++ b/docs/latex/wx/dropsrc.tex @@ -37,12 +37,31 @@ enum wxDragResult \membersection{wxDropSource::wxDropSource}\label{wxdropsourcewxdropsource} -\func{}{wxDropSource}{\param{wxWindow*}{ win = NULL}} +\func{}{wxDropSource}{\param{wxWindow*}{ win = NULL},\param{const wxIconOrCursor\& }{iconCopy = wxNullIconOrCursor}, \param{const wxIconOrCursor\& }{iconCopy = wxNullIconOrCursor}, \param{const wxIconOrCursor\& }{iconNone = wxNullIconOrCursor}} -Default/wxGTK-specific constructor. If you use the default constructor you must -call \helpref{SetData}{wxdropsourcesetdata} later. +\func{}{wxDropSource}{\param{wxDataObject\&}{ data}, \param{wxWindow*}{ win = NULL},\param{const wxIconOrCursor\& }{iconCopy = wxNullIconOrCursor}, \param{const wxIconOrCursor\& }{iconCopy = wxNullIconOrCursor}, \param{const wxIconOrCursor\& }{iconNone = wxNullIconOrCursor}} -Note that {\it win} is required by the GTK port and therefore should always be set. +The constructors for wxDataObject. + +If you use the constructor without {\it data} parameter you must call +\helpref{SetData}{wxdropsourcesetdata} later. + +Note that the exact type of {\it iconCopy} and subsequent parameters differs +between wxMSW and wxGTK: these are cursors under Windows but icons for GTK. +You should use the macro \helpref{wxDROP\_ICON}{wxdropicon} in portable +programs instead of directly using either of these types. + +\wxheading{Parameters} + +\docparam{win}{The window which initiates the drag and drop operation.} + +\docparam{iconCopy}{The icon or cursor used for feedback for copy operation.} + +\docparam{iconMove}{The icon or cursor used for feedback for move operation.} + +\docparam{iconNone}{The icon or cursor used for feedback when operation can't be done.} + +{\it win} is the window which initiates the drag and drop operation. \membersection{wxDropSource::\destruct{wxDropSource}}\label{wxdropsourcedtor} diff --git a/docs/latex/wx/function.tex b/docs/latex/wx/function.tex index 6a7003196c..777de9e7a5 100644 --- a/docs/latex/wx/function.tex +++ b/docs/latex/wx/function.tex @@ -1100,6 +1100,21 @@ The clipboard must have previously been opened for this call to succeed. \section{Miscellaneous functions}\label{miscellany} +\membersection{::wxDROP\_ICON}{wxdropicon} + +\func{wxIconOrCursor}{wxDROP\_ICON}{\param{const char *}{name}} + +This macro creates either a cursor (MSW) or an icon (elsewhere) with the given +name. Under MSW, the cursor is loaded from the resource file and the icon is +loaded from XPM file under other platforms. + +This macro should be used with +\helpref{wxDropSource constructor}{wxdropsourcewxdropsource}. + +\wxheading{Include files} + + + \membersection{::wxNewId} \func{long}{wxNewId}{\void} diff --git a/include/wx/gtk/dnd.h b/include/wx/gtk/dnd.h index e6e45f03a8..52199517b4 100644 --- a/include/wx/gtk/dnd.h +++ b/include/wx/gtk/dnd.h @@ -36,6 +36,16 @@ class wxFileDropTarget; class wxDropSource; +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// this macro may be used instead for wxDropSource ctor arguments: it will use +// the icon 'name' from an XPM file under GTK, but will expand to something +// else under MSW. If you don't use it, you will have to use #ifdef in the +// application code. +#define wxDROP_ICON(name) wxICON(name) + //------------------------------------------------------------------------- // wxDropTarget //------------------------------------------------------------------------- @@ -78,12 +88,16 @@ class wxDropSource: public wxDropSourceBase public: /* constructor. set data later with SetData() */ wxDropSource( wxWindow *win = (wxWindow *)NULL, - const wxIcon &go = wxNullIcon ); + const wxIcon © = wxNullIcon, + const wxIcon &move = wxNullIcon, + const wxIcon &none = wxNullIcon); /* constructor for setting one data object */ wxDropSource( wxDataObject& data, wxWindow *win, - const wxIcon &go = wxNullIcon ); + const wxIcon © = wxNullIcon, + const wxIcon &move = wxNullIcon, + const wxIcon &none = wxNullIcon); ~wxDropSource(); @@ -94,7 +108,7 @@ public: void RegisterWindow(); void UnregisterWindow(); - void PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ); + void PrepareIcon( int action, GdkDragContext *context ); GtkWidget *m_widget; GtkWidget *m_iconWindow; @@ -102,9 +116,17 @@ public: wxWindow *m_window; wxDragResult m_retValue; - wxIcon m_icon; + wxIcon m_iconCopy, + m_iconMove, + m_iconNone; bool m_waiting; + +private: + // common part of both ctors + void SetIcons(const wxIcon& copy, + const wxIcon& move, + const wxIcon& none); }; #endif diff --git a/include/wx/gtk1/dnd.h b/include/wx/gtk1/dnd.h index e6e45f03a8..52199517b4 100644 --- a/include/wx/gtk1/dnd.h +++ b/include/wx/gtk1/dnd.h @@ -36,6 +36,16 @@ class wxFileDropTarget; class wxDropSource; +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// this macro may be used instead for wxDropSource ctor arguments: it will use +// the icon 'name' from an XPM file under GTK, but will expand to something +// else under MSW. If you don't use it, you will have to use #ifdef in the +// application code. +#define wxDROP_ICON(name) wxICON(name) + //------------------------------------------------------------------------- // wxDropTarget //------------------------------------------------------------------------- @@ -78,12 +88,16 @@ class wxDropSource: public wxDropSourceBase public: /* constructor. set data later with SetData() */ wxDropSource( wxWindow *win = (wxWindow *)NULL, - const wxIcon &go = wxNullIcon ); + const wxIcon © = wxNullIcon, + const wxIcon &move = wxNullIcon, + const wxIcon &none = wxNullIcon); /* constructor for setting one data object */ wxDropSource( wxDataObject& data, wxWindow *win, - const wxIcon &go = wxNullIcon ); + const wxIcon © = wxNullIcon, + const wxIcon &move = wxNullIcon, + const wxIcon &none = wxNullIcon); ~wxDropSource(); @@ -94,7 +108,7 @@ public: void RegisterWindow(); void UnregisterWindow(); - void PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ); + void PrepareIcon( int action, GdkDragContext *context ); GtkWidget *m_widget; GtkWidget *m_iconWindow; @@ -102,9 +116,17 @@ public: wxWindow *m_window; wxDragResult m_retValue; - wxIcon m_icon; + wxIcon m_iconCopy, + m_iconMove, + m_iconNone; bool m_waiting; + +private: + // common part of both ctors + void SetIcons(const wxIcon& copy, + const wxIcon& move, + const wxIcon& none); }; #endif diff --git a/include/wx/msw/ole/dropsrc.h b/include/wx/msw/ole/dropsrc.h index 079514324b..4765f2e6df 100644 --- a/include/wx/msw/ole/dropsrc.h +++ b/include/wx/msw/ole/dropsrc.h @@ -28,6 +28,16 @@ class wxIDropSource; class WXDLLEXPORT wxDataObject; class WXDLLEXPORT wxWindow; +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// this macro may be used instead for wxDropSource ctor arguments: it will use +// the cursor 'name' from the resources under MSW, but will expand to +// something else under GTK. If you don't use it, you will have to use #ifdef +// in the application code. +#define wxDROP_ICON(name) wxCursor(#name) + // ---------------------------------------------------------------------------- // wxDropSource is used to start the drag-&-drop operation on associated // wxDataObject object. It's responsible for giving UI feedback while dragging. diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index f581776844..96b14ad477 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -46,6 +46,10 @@ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include "mondrian.xpm" + + #include "dnd_copy.xpm" + #include "dnd_move.xpm" + #include "dnd_none.xpm" #endif // ---------------------------------------------------------------------------- @@ -1065,16 +1069,10 @@ void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) ) textData.AddFile( "/file1.txt" ); textData.AddFile( "/file2.txt" ); */ - wxDropSource source(textData, this - -#ifdef __WXMSW__ - ,wxCURSOR_PENCIL, // for copy - wxCURSOR_SPRAYCAN, // for move - wxCURSOR_QUESTION_ARROW // for nothing -#elif defined(__WXGTK__) - ,wxICON(mondrian) -#endif - ); + wxDropSource source(textData, this, + wxDROP_ICON(dnd_copy), + wxDROP_ICON(dnd_move), + wxDROP_ICON(dnd_none)); const char *pc; diff --git a/samples/dnd/dnd.rc b/samples/dnd/dnd.rc index 7655c62a4c..21cba3bc3c 100644 --- a/samples/dnd/dnd.rc +++ b/samples/dnd/dnd.rc @@ -1,3 +1,6 @@ mondrian ICON "mondrian.ico" #include "wx/msw/wx.rc" +dnd_copy CURSOR "dnd_copy.cur" +dnd_move CURSOR "dnd_move.cur" +dnd_none CURSOR "dnd_none.cur" diff --git a/samples/dnd/dnd_copy.cur b/samples/dnd/dnd_copy.cur new file mode 100644 index 0000000000000000000000000000000000000000..ce349aa3324a9dee883052b92064b2d63300ede7 GIT binary patch literal 326 zcmaLRu?@m75QX92Ae4e49YUfYB_$h>Q5b+7V3Vw3i9tw5o01~R%X5enBm!rB_W3ON z4i*H80@kcJ2G{@xbBWS|*AV0JzD&EM>GCVfYDn@1_AfXkEnH14;bE2Y-DPx!E#F+4 n3(xRBnp{fiOo~hCmIO~8)S0^vy3)0n_&rwA-QRwC&bR3S<|=*2 literal 0 HcmV?d00001 diff --git a/samples/dnd/dnd_copy.xpm b/samples/dnd/dnd_copy.xpm new file mode 100644 index 0000000000..7144747bb9 --- /dev/null +++ b/samples/dnd/dnd_copy.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static char * dnd_copy_xpm[] = { +/* width height ncolors chars_per_pixel */ +"32 32 6 1", +/* colors */ +" s None c None", +". c black", +"X c wheat", +"o c tan", +"O c #6699FF", +"r c red", +/* pixels */ +" ................... r ", +" .XXXXXXXXXXXXXXXXX.. r ", +" .XXXXXXXXXXXXXXXXX.o.rrrrrrr", +" .XXXXXXXXXXXXXXXXX.oo. r ", +" .XXXXXXXXXXXXXXXXX.ooo. r ", +" .XXXXXXXXXXXXXXXXX.oooo. ", +" .XXXXXXXXXXXXXXXXX....... ", +" .XXXXXOOOOOOOOOOXXXooooo. ", +" .XXXXXXXXXXXXXXXXXXooooo. ", +" .XXXXXOOOOOOOOOOXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXOOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXOOOOOOOOOOXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXOOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXOOOOOOOOOOXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXOOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXOOOOOOOXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" ......................... "}; + diff --git a/samples/dnd/dnd_move.cur b/samples/dnd/dnd_move.cur new file mode 100644 index 0000000000000000000000000000000000000000..ce349aa3324a9dee883052b92064b2d63300ede7 GIT binary patch literal 326 zcmaLRu?@m75QX92Ae4e49YUfYB_$h>Q5b+7V3Vw3i9tw5o01~R%X5enBm!rB_W3ON z4i*H80@kcJ2G{@xbBWS|*AV0JzD&EM>GCVfYDn@1_AfXkEnH14;bE2Y-DPx!E#F+4 n3(xRBnp{fiOo~hCmIO~8)S0^vy3)0n_&rwA-QRwC&bR3S<|=*2 literal 0 HcmV?d00001 diff --git a/samples/dnd/dnd_move.xpm b/samples/dnd/dnd_move.xpm new file mode 100644 index 0000000000..9a0eaf4dcc --- /dev/null +++ b/samples/dnd/dnd_move.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char * dnd_move_xpm[] = { +/* width height ncolors chars_per_pixel */ +"32 32 5 1", +/* colors */ +" s None c None", +". c black", +"X c wheat", +"o c tan", +"O c #6699FF", +/* pixels */ +" ................... ", +" .XXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXXX.o. ", +" .XXXXXXXXXXXXXXXXX.oo. ", +" .XXXXXXXXXXXXXXXXX.ooo. ", +" .XXXXXXXXXXXXXXXXX.oooo. ", +" .XXXXXXXXXXXXXXXXX....... ", +" .XXXXXOOOOOOOOOOXXXooooo. ", +" .XXXXXXXXXXXXXXXXXXooooo. ", +" .XXXXXOOOOOOOOOOXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXOOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXOOOOOOOOOOXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXOOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXOOOOOOOOOOXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXOOOOOOOOOOXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXOOOOOOOXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" ......................... "}; + diff --git a/samples/dnd/dnd_none.cur b/samples/dnd/dnd_none.cur new file mode 100644 index 0000000000000000000000000000000000000000..ce349aa3324a9dee883052b92064b2d63300ede7 GIT binary patch literal 326 zcmaLRu?@m75QX92Ae4e49YUfYB_$h>Q5b+7V3Vw3i9tw5o01~R%X5enBm!rB_W3ON z4i*H80@kcJ2G{@xbBWS|*AV0JzD&EM>GCVfYDn@1_AfXkEnH14;bE2Y-DPx!E#F+4 n3(xRBnp{fiOo~hCmIO~8)S0^vy3)0n_&rwA-QRwC&bR3S<|=*2 literal 0 HcmV?d00001 diff --git a/samples/dnd/dnd_none.xpm b/samples/dnd/dnd_none.xpm new file mode 100644 index 0000000000..dfd7f0cdad --- /dev/null +++ b/samples/dnd/dnd_none.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static char * dnd_none_xpm[] = { +/* width height ncolors chars_per_pixel */ +"32 32 6 1", +/* colors */ +" s None c None", +". c black", +"X c wheat", +"o c tan", +"O c #6699FF", +"r c red", +/* pixels */ +" ................... ", +" .XXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXXX.o. ", +" .XXXXXXXXXXXXXXXXX.oo. ", +" .XXXXXXXXXXXXXXXXX.ooo. ", +" .XXXXXXXXXXXXXXXXX.oooo. ", +" .XXXXXXXXXXXXXXXXX....... ", +" .rXXXXOOOOOOOOOOXXXoooor. ", +" .XrXXXXXXXXXXXXXXXXoooro. ", +" .XXrXXOOOOOOOOOOXXXXXrXX. ", +" .XXXrXXXXXXXXXXXXXXXrXXX. ", +" .XXXXrXXOOOOOOOOOXXrXXXX. ", +" .XXXXXrXXXXXXXXXXXrXXXXX. ", +" .XXXXXXrOOOOOOOOOrXXXXXX. ", +" .XXXXXXXrXXXXXXXrXXXXXXX. ", +" .XXXXXOOOrOOOOOrXXXXXXXX. ", +" .XXXXXXXXXrXXXrXXXXXXXXX. ", +" .XXXXXXXOOOrOrOOOXXXXXXX. ", +" .XXXXXXXXXXXrXXXXXXXXXXX. ", +" .XXXXXXOOOOrOrOOOXXXXXXX. ", +" .XXXXXXXXXrXXXrXXXXXXXXX. ", +" .XXXXXOOOrOOOOOrXXXXXXXX. ", +" .XXXXXXXrXXXXXXXrXXXXXXX. ", +" .XXXXXXrOOOOOOOOOrXXXXXX. ", +" .XXXXXrXXXXXXXXXXXrXXXXX. ", +" .XXXXrOOOOOOOXXXXXXrXXXX. ", +" .XXXrXXXXXXXXXXXXXXXrXXX. ", +" .XXrXXXXXXXXXXXXXXXXXrXX. ", +" .XrXXXXXXXXXXXXXXXXXXXrX. ", +" .rXXXXXXXXXXXXXXXXXXXXXr. ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" ......................... "}; + diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index 272530603b..8a22b26a2a 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -500,11 +500,11 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), 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->GetDataObject(); - + if (!data) { wxLogDebug( wxT("Drop source: no data object") ); @@ -562,7 +562,7 @@ static void source_drag_data_delete( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { - if (g_isIdle) + if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_data_delete\n" ); @@ -576,7 +576,7 @@ static void source_drag_begin( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { - if (g_isIdle) + if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_begin.\n" ); @@ -620,7 +620,10 @@ gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigur // wxDropSource //--------------------------------------------------------------------------- -wxDropSource::wxDropSource( wxWindow *win, const wxIcon &icon ) +wxDropSource::wxDropSource(wxWindow *win, + const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) { m_waiting = TRUE; @@ -632,11 +635,14 @@ wxDropSource::wxDropSource( wxWindow *win, const wxIcon &icon ) m_retValue = wxDragCancel; - m_icon = icon; - if (wxNullIcon == icon) m_icon = wxIcon( page_xpm ); + SetIcons(iconCopy, iconMove, iconNone); } -wxDropSource::wxDropSource( wxDataObject& data, wxWindow *win, const wxIcon &icon ) +wxDropSource::wxDropSource(wxDataObject& data, + wxWindow *win, + const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) { m_waiting = TRUE; @@ -650,19 +656,47 @@ wxDropSource::wxDropSource( wxDataObject& data, wxWindow *win, const wxIcon &ico m_retValue = wxDragCancel; - m_icon = icon; - if (wxNullIcon == icon) m_icon = wxIcon( page_xpm ); + SetIcons(iconCopy, iconMove, iconNone); +} + +void wxDropSource::SetIcons(const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) +{ + m_iconCopy = iconCopy; + m_iconMove = iconMove; + m_iconNone = iconNone; + + if ( !m_iconCopy.Ok() ) + m_iconCopy = wxIcon(page_xpm); + if ( !m_iconMove.Ok() ) + m_iconMove = m_iconCopy; + if ( !m_iconNone.Ok() ) + m_iconNone = m_iconCopy; } wxDropSource::~wxDropSource() { } -void wxDropSource::PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ) +void wxDropSource::PrepareIcon( int action, GdkDragContext *context ) { - GdkBitmap *mask = (GdkBitmap *) NULL; - if (m_icon.GetMask()) mask = m_icon.GetMask()->GetBitmap(); - GdkPixmap *pixmap = m_icon.GetPixmap(); + // get the right icon to display + wxIcon *icon = NULL; + if ( action & GDK_ACTION_MOVE ) + icon = &m_iconMove; + else if ( action & GDK_ACTION_COPY ) + icon = &m_iconCopy; + else + icon = &m_iconNone; + + GdkBitmap *mask; + if ( icon->GetMask() ) + mask = icon->GetMask()->GetBitmap(); + else + mask = (GdkBitmap *)NULL; + + GdkPixmap *pixmap = icon->GetPixmap(); gint width,height; gdk_window_get_size (pixmap, &width, &height); @@ -689,7 +723,7 @@ void wxDropSource::PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ) if (mask) gtk_widget_shape_combine_mask (m_iconWindow, mask, 0, 0); - gtk_drag_set_icon_widget( context, m_iconWindow, hot_x, hot_y ); + gtk_drag_set_icon_widget( context, m_iconWindow, 0, 0 ); } wxDragResult wxDropSource::DoDragDrop( bool allowMove ) @@ -746,22 +780,22 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) if (button_number) { GdkDragAction action = GDK_ACTION_COPY; - if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); + if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); GdkDragContext *context = gtk_drag_begin( m_widget, - target_list, - action, - button_number, /* number of mouse button which started drag */ - (GdkEvent*) &event ); + target_list, + action, + button_number, /* number of mouse button which started drag */ + (GdkEvent*) &event ); m_dragContext = context; - PrepareIcon( 0, 0, context ); + PrepareIcon( action, context ); while (m_waiting) gtk_main_iteration(); - - if (context->action == GDK_ACTION_COPY) + + if (context->action == GDK_ACTION_COPY) m_retValue = wxDragCopy; - if (context->action == GDK_ACTION_MOVE) + if (context->action == GDK_ACTION_MOVE) m_retValue = wxDragMove; } @@ -780,7 +814,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) void wxDropSource::RegisterWindow() { if (!m_widget) return; - + gtk_signal_connect( GTK_OBJECT(m_widget), "drag_data_get", GTK_SIGNAL_FUNC (source_drag_data_get), (gpointer) this); gtk_signal_connect (GTK_OBJECT(m_widget), "drag_data_delete", diff --git a/src/gtk1/dnd.cpp b/src/gtk1/dnd.cpp index 272530603b..8a22b26a2a 100644 --- a/src/gtk1/dnd.cpp +++ b/src/gtk1/dnd.cpp @@ -500,11 +500,11 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), 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->GetDataObject(); - + if (!data) { wxLogDebug( wxT("Drop source: no data object") ); @@ -562,7 +562,7 @@ static void source_drag_data_delete( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { - if (g_isIdle) + if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_data_delete\n" ); @@ -576,7 +576,7 @@ static void source_drag_begin( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { - if (g_isIdle) + if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_begin.\n" ); @@ -620,7 +620,10 @@ gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigur // wxDropSource //--------------------------------------------------------------------------- -wxDropSource::wxDropSource( wxWindow *win, const wxIcon &icon ) +wxDropSource::wxDropSource(wxWindow *win, + const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) { m_waiting = TRUE; @@ -632,11 +635,14 @@ wxDropSource::wxDropSource( wxWindow *win, const wxIcon &icon ) m_retValue = wxDragCancel; - m_icon = icon; - if (wxNullIcon == icon) m_icon = wxIcon( page_xpm ); + SetIcons(iconCopy, iconMove, iconNone); } -wxDropSource::wxDropSource( wxDataObject& data, wxWindow *win, const wxIcon &icon ) +wxDropSource::wxDropSource(wxDataObject& data, + wxWindow *win, + const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) { m_waiting = TRUE; @@ -650,19 +656,47 @@ wxDropSource::wxDropSource( wxDataObject& data, wxWindow *win, const wxIcon &ico m_retValue = wxDragCancel; - m_icon = icon; - if (wxNullIcon == icon) m_icon = wxIcon( page_xpm ); + SetIcons(iconCopy, iconMove, iconNone); +} + +void wxDropSource::SetIcons(const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) +{ + m_iconCopy = iconCopy; + m_iconMove = iconMove; + m_iconNone = iconNone; + + if ( !m_iconCopy.Ok() ) + m_iconCopy = wxIcon(page_xpm); + if ( !m_iconMove.Ok() ) + m_iconMove = m_iconCopy; + if ( !m_iconNone.Ok() ) + m_iconNone = m_iconCopy; } wxDropSource::~wxDropSource() { } -void wxDropSource::PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ) +void wxDropSource::PrepareIcon( int action, GdkDragContext *context ) { - GdkBitmap *mask = (GdkBitmap *) NULL; - if (m_icon.GetMask()) mask = m_icon.GetMask()->GetBitmap(); - GdkPixmap *pixmap = m_icon.GetPixmap(); + // get the right icon to display + wxIcon *icon = NULL; + if ( action & GDK_ACTION_MOVE ) + icon = &m_iconMove; + else if ( action & GDK_ACTION_COPY ) + icon = &m_iconCopy; + else + icon = &m_iconNone; + + GdkBitmap *mask; + if ( icon->GetMask() ) + mask = icon->GetMask()->GetBitmap(); + else + mask = (GdkBitmap *)NULL; + + GdkPixmap *pixmap = icon->GetPixmap(); gint width,height; gdk_window_get_size (pixmap, &width, &height); @@ -689,7 +723,7 @@ void wxDropSource::PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ) if (mask) gtk_widget_shape_combine_mask (m_iconWindow, mask, 0, 0); - gtk_drag_set_icon_widget( context, m_iconWindow, hot_x, hot_y ); + gtk_drag_set_icon_widget( context, m_iconWindow, 0, 0 ); } wxDragResult wxDropSource::DoDragDrop( bool allowMove ) @@ -746,22 +780,22 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) if (button_number) { GdkDragAction action = GDK_ACTION_COPY; - if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); + if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); GdkDragContext *context = gtk_drag_begin( m_widget, - target_list, - action, - button_number, /* number of mouse button which started drag */ - (GdkEvent*) &event ); + target_list, + action, + button_number, /* number of mouse button which started drag */ + (GdkEvent*) &event ); m_dragContext = context; - PrepareIcon( 0, 0, context ); + PrepareIcon( action, context ); while (m_waiting) gtk_main_iteration(); - - if (context->action == GDK_ACTION_COPY) + + if (context->action == GDK_ACTION_COPY) m_retValue = wxDragCopy; - if (context->action == GDK_ACTION_MOVE) + if (context->action == GDK_ACTION_MOVE) m_retValue = wxDragMove; } @@ -780,7 +814,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) void wxDropSource::RegisterWindow() { if (!m_widget) return; - + gtk_signal_connect( GTK_OBJECT(m_widget), "drag_data_get", GTK_SIGNAL_FUNC (source_drag_data_get), (gpointer) this); gtk_signal_connect (GTK_OBJECT(m_widget), "drag_data_delete",