X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e1ef6b5da5df7f9730bffb4c3578e1aba28169e4..15811f2f674720ba7da5353066ef71cd5621c081:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 97c0559a8b..7218b339f2 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -77,6 +77,15 @@ #include "wx/msw/missing.h" +#if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + +// dummy value used for m_dropTarget, different from any valid pointer value +// (which are all even under Windows) and NULL +static wxDropTarget * + wxRICHTEXT_DEFAULT_DROPTARGET = wx_reinterpret_cast(wxDropTarget *, 1); + +#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -289,6 +298,14 @@ void wxTextCtrl::Init() wxTextCtrl::~wxTextCtrl() { +#if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + if ( m_dropTarget == wxRICHTEXT_DEFAULT_DROPTARGET ) + { + // don't try to destroy this dummy pointer in the base class dtor + m_dropTarget = NULL; + } +#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + delete m_privateContextMenu; } @@ -308,6 +325,20 @@ bool wxTextCtrl::Create(wxWindow *parent, if ( !MSWCreateText(value, pos, size) ) return false; +#if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + if ( IsRich() ) + { + // rich text controls have a default associated drop target which + // allows them to receive (rich) text dropped on them, which is nice, + // but prevents us from associating a user-defined drop target with + // them as we need to unregister the old one first + // + // to make it work, we set m_dropTarget to this special value initially + // and check for it in our SetDropTarget() + m_dropTarget = wxRICHTEXT_DEFAULT_DROPTARGET; + } +#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + return true; } @@ -2405,6 +2436,22 @@ bool wxTextCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) return wxTextCtrlBase::MSWOnNotify(idCtrl, lParam, result); } +#if wxUSE_DRAG_AND_DROP + +void wxTextCtrl::SetDropTarget(wxDropTarget *dropTarget) +{ + if ( m_dropTarget == wxRICHTEXT_DEFAULT_DROPTARGET ) + { + // get rid of the built-in drop target + ::RevokeDragDrop(GetHwnd()); + m_dropTarget = NULL; + } + + wxTextCtrlBase::SetDropTarget(dropTarget); +} + +#endif // wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // colour setting for the rich edit controls // ----------------------------------------------------------------------------