X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2ee3ee1bc8ac2f95029835ebc115fac0a1fbd02a..6fe8b1535589d1888c33f784ac66a4fbd0bff0c6:/src/common/dobjcmn.cpp diff --git a/src/common/dobjcmn.cpp b/src/common/dobjcmn.cpp index 6a40f0b1d9..868b9c2a58 100644 --- a/src/common/dobjcmn.cpp +++ b/src/common/dobjcmn.cpp @@ -27,6 +27,8 @@ #pragma hdrstop #endif +#if wxUSE_DATAOBJ + #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/debug.h" @@ -47,7 +49,7 @@ WX_DEFINE_LIST(wxSimpleDataObjectList); // ---------------------------------------------------------------------------- static wxDataFormat dataFormatInvalid; -const wxDataFormat& wxFormatInvalid = dataFormatInvalid; +WXDLLEXPORT const wxDataFormat& wxFormatInvalid = dataFormatInvalid; // ============================================================================ // implementation @@ -61,6 +63,33 @@ wxDataObjectBase::~wxDataObjectBase() { } +bool wxDataObjectBase::IsSupported(const wxDataFormat& format, + Direction dir) const +{ + size_t nFormatCount = GetFormatCount(dir); + if ( nFormatCount == 1 ) + { + return format == GetPreferredFormat(dir); + } + else + { + wxDataFormat *formats = new wxDataFormat[nFormatCount]; + GetAllFormats(formats, dir); + + size_t n; + for ( n = 0; n < nFormatCount; n++ ) + { + if ( formats[n] == format ) + break; + } + + delete [] formats; + + // found? + return n < nFormatCount; + } +} + // ---------------------------------------------------------------------------- // wxDataObjectComposite // ---------------------------------------------------------------------------- @@ -229,6 +258,12 @@ void wxFileDataObjectBase::SetFilenames(const wxChar* filenames) // wxCustomDataObject // ---------------------------------------------------------------------------- +wxCustomDataObject::wxCustomDataObject(const wxDataFormat& format) + : wxDataObjectSimple(format) +{ + m_data = (void *)NULL; +} + wxCustomDataObject::~wxCustomDataObject() { Free(); @@ -249,7 +284,7 @@ void *wxCustomDataObject::Alloc(size_t size) void wxCustomDataObject::Free() { - delete [] m_data; + delete [] (char *)m_data; m_size = 0; m_data = (void *)NULL; } @@ -283,3 +318,54 @@ bool wxCustomDataObject::SetData(size_t size, const void *buf) return TRUE; } +// ============================================================================ +// some common dnd related code +// ============================================================================ + +#if wxUSE_DRAG_AND_DROP + +#include "wx/dnd.h" + +// ---------------------------------------------------------------------------- +// wxTextDropTarget +// ---------------------------------------------------------------------------- + +// NB: we can't use "new" in ctor initializer lists because this provokes an +// internal compiler error with VC++ 5.0 (hey, even gcc compiles this!), +// so use SetDataObject() instead + +wxTextDropTarget::wxTextDropTarget() +{ + SetDataObject(new wxTextDataObject); +} + +wxDragResult wxTextDropTarget::OnData(wxCoord x, wxCoord y, wxDragResult def) +{ + if ( !GetData() ) + return wxDragNone; + + wxTextDataObject *dobj = (wxTextDataObject *)m_dataObject; + return OnDropText(x, y, dobj->GetText()) ? def : wxDragNone; +} + +// ---------------------------------------------------------------------------- +// wxFileDropTarget +// ---------------------------------------------------------------------------- + +wxFileDropTarget::wxFileDropTarget() +{ + SetDataObject(new wxFileDataObject); +} + +wxDragResult wxFileDropTarget::OnData(wxCoord x, wxCoord y, wxDragResult def) +{ + if ( !GetData() ) + return wxDragNone; + + wxFileDataObject *dobj = (wxFileDataObject *)m_dataObject; + return OnDropFiles(x, y, dobj->GetFilenames()) ? def : wxDragNone; +} + +#endif // wxUSE_DRAG_AND_DROP + +#endif // wxUSE_DATAOBJ