X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3f364be84b91d4e19729634ebf0b119145303a35..e9c54ec33655bfa9a57eb7955b114621fb940e1f:/src/common/dobjcmn.cpp?ds=sidebyside diff --git a/src/common/dobjcmn.cpp b/src/common/dobjcmn.cpp index f806dcdec6..93a2d21d23 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" @@ -42,6 +44,13 @@ WX_DEFINE_LIST(wxSimpleDataObjectList); +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +static wxDataFormat dataFormatInvalid; +WXDLLEXPORT const wxDataFormat& wxFormatInvalid = dataFormatInvalid; + // ============================================================================ // implementation // ============================================================================ @@ -54,10 +63,44 @@ 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 // ---------------------------------------------------------------------------- +wxDataObjectComposite::wxDataObjectComposite() +{ + m_preferred = 0; + + m_dataObjects.DeleteContents(TRUE); +} + wxDataObjectSimple * wxDataObjectComposite::GetObject(const wxDataFormat& format) const { @@ -90,13 +133,50 @@ wxDataObjectComposite::GetPreferredFormat(Direction WXUNUSED(dir)) const { wxSimpleDataObjectList::Node *node = m_dataObjects.Item( m_preferred ); - wxCHECK_MSG( node, wxDF_INVALID, wxT("no preferred format") ); + wxCHECK_MSG( node, wxFormatInvalid, wxT("no preferred format") ); wxDataObjectSimple* dataObj = node->GetData(); return dataObj->GetFormat(); } +#if defined(__WXMSW__) + +size_t wxDataObjectComposite::GetBufferOffset( const wxDataFormat& format ) +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, 0, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetBufferOffset( format ); +} + +const void* wxDataObjectComposite::GetSizeFromBuffer( const void* buffer, + size_t* size, + const wxDataFormat& format ) +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, NULL, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetSizeFromBuffer( buffer, size, format ); +} + +void* wxDataObjectComposite::SetSizeInBuffer( void* buffer, size_t size, + const wxDataFormat& format ) +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, NULL, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->SetSizeInBuffer( buffer, size, format ); +} + +#endif + size_t wxDataObjectComposite::GetFormatCount(Direction WXUNUSED(dir)) const { // TODO what about the Get/Set only formats? @@ -154,19 +234,36 @@ bool wxDataObjectComposite::SetData(const wxDataFormat& format, size_t wxTextDataObject::GetDataSize() const { - return GetTextLength(); +#if defined(__WXGTK20__) && wxUSE_UNICODE + // Use UTF8 not UCS4 + wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetText().c_str() ); + return strlen( (const char*) buffer ) + 1; +#else + return GetTextLength() * sizeof(wxChar); +#endif } bool wxTextDataObject::GetDataHere(void *buf) const { - strcpy((char *)buf, GetText().mb_str()); +#if defined(__WXGTK20__) && wxUSE_UNICODE + // Use UTF8 not UCS4 + wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetText().c_str() ); + strcpy( (char*) buf, (const char*) buffer ); +#else + wxStrcpy((wxChar *)buf, GetText().c_str()); +#endif return TRUE; } bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf) { - SetText(wxString((const char *)buf)); +#if defined(__WXGTK20__) && wxUSE_UNICODE + // Use UTF8 not UCS4 + SetText( wxConvUTF8.cMB2WX( (const char*) buf ) ); +#else + SetText(wxString((const wxChar *)buf)); +#endif return TRUE; } @@ -175,6 +272,10 @@ bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf) // wxFileDataObjectBase // ---------------------------------------------------------------------------- +// VZ: I don't need this in MSW finally, so if it is needed in wxGTK, it should +// be moved to gtk/dataobj.cpp +#if 0 + wxString wxFileDataObjectBase::GetFilenames() const { wxString str; @@ -212,10 +313,18 @@ void wxFileDataObjectBase::SetFilenames(const wxChar* filenames) } } +#endif // 0 + // ---------------------------------------------------------------------------- // wxCustomDataObject // ---------------------------------------------------------------------------- +wxCustomDataObject::wxCustomDataObject(const wxDataFormat& format) + : wxDataObjectSimple(format) +{ + m_data = (void *)NULL; +} + wxCustomDataObject::~wxCustomDataObject() { Free(); @@ -236,7 +345,7 @@ void *wxCustomDataObject::Alloc(size_t size) void wxCustomDataObject::Free() { - delete [] m_data; + delete [] (char *)m_data; m_size = 0; m_data = (void *)NULL; } @@ -257,7 +366,7 @@ bool wxCustomDataObject::GetDataHere(void *buf) const return TRUE; } -bool wxCustomDataObject::SetData(size_t len, const void *buf) +bool wxCustomDataObject::SetData(size_t size, const void *buf) { Free(); @@ -265,8 +374,59 @@ bool wxCustomDataObject::SetData(size_t len, const void *buf) if ( !m_data ) return FALSE; - memcpy(m_data, buf, m_size = len); + memcpy(m_data, buf, m_size = size); 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