X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/493ac0b8b5b3bcfcd3da44ad259ea55e05cf1803..3304646d0657d889ad676485a4b635e2032b0038:/src/mac/carbon/dataobj.cpp diff --git a/src/mac/carbon/dataobj.cpp b/src/mac/carbon/dataobj.cpp index ed8f00717d..041084127d 100644 --- a/src/mac/carbon/dataobj.cpp +++ b/src/mac/carbon/dataobj.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: mac/dataobj.cpp +// Name: src/mac/carbon/dataobj.cpp // Purpose: implementation of wxDataObject class // Author: Stefan Csomor // Modified by: @@ -9,36 +9,30 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- - -#ifdef __GNUG__ - #pragma implementation "dataobj.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_DATAOBJ + +#include "wx/dataobj.h" + #ifndef WX_PRECOMP -#include "wx/intl.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/dcmemory.h" #endif -#include "wx/defs.h" -#include "wx/log.h" -#include "wx/dataobj.h" #include "wx/mstream.h" #include "wx/image.h" +#include "wx/metafile.h" +#include "wx/tokenzr.h" + #include "wx/mac/private.h" -#include "Scrap.h" -// ---------------------------------------------------------------------------- -// functions -// ---------------------------------------------------------------------------- +#ifndef __DARWIN__ +#include +#endif + // ---------------------------------------------------------------------------- // wxDataFormat @@ -50,83 +44,112 @@ wxDataFormat::wxDataFormat() m_format = 0; } -wxDataFormat::wxDataFormat( wxDataFormatId vType ) +wxDataFormat::wxDataFormat( wxDataFormatId vType ) { - SetType(vType); + SetType( vType ); } -wxDataFormat::wxDataFormat( const wxChar* zId) +wxDataFormat::wxDataFormat( const wxChar *zId ) { - SetId(zId); + SetId( zId ); } -wxDataFormat::wxDataFormat( const wxString& rId) +wxDataFormat::wxDataFormat( const wxString& rId ) { - SetId(rId); + SetId( rId ); } -wxDataFormat::wxDataFormat( NativeFormat vFormat) +wxDataFormat::wxDataFormat( NativeFormat vFormat ) { - SetId(vFormat); + SetId( vFormat ); } -void wxDataFormat::SetType( wxDataFormatId Type ) +void wxDataFormat::SetType( wxDataFormatId dataType ) { - m_type = Type; + m_type = dataType; - if (m_type == wxDF_TEXT ) + switch (m_type) + { + case wxDF_TEXT: m_format = kScrapFlavorTypeText; - else if (m_type == wxDF_UNICODETEXT ) - m_format = kScrapFlavorTypeUnicode ; - else if (m_type == wxDF_BITMAP || m_type == wxDF_METAFILE ) + break; + + case wxDF_UNICODETEXT: + m_format = kScrapFlavorTypeUnicode; + break; + + case wxDF_BITMAP: + case wxDF_METAFILE: m_format = kScrapFlavorTypePicture; - else if (m_type == wxDF_FILENAME) - m_format = kDragFlavorTypeHFS ; - else - { - m_format = '????' ; - wxFAIL_MSG( wxT("invalid dataformat") ); - } -} + break; -wxDataFormatId wxDataFormat::GetType() const -{ - return m_type; + case wxDF_FILENAME: + m_format = kDragFlavorTypeHFS; + break; + + default: + wxFAIL_MSG( wxT("invalid data format") ); + + // NB: this translates to '????' ASCII but it can't be used in the code + // because '??' will get parsed as a trigraph! + m_format = 0x3f3f3f3f; + break; + } } wxString wxDataFormat::GetId() const { - char text[5] ; - strncpy( text , (char*) &m_format , 4 ) ; - text[4] = 0 ; - return wxString::FromAscii( text ) ; + wxCHECK_MSG( !IsStandard(), wxEmptyString, + wxT("name of predefined format cannot be retrieved") ); + + return m_id; } -void wxDataFormat::SetId( NativeFormat format ) +void wxDataFormat::SetId( NativeFormat format ) { m_format = format; - if (m_format == kScrapFlavorTypeText) + switch (m_format) + { + case kScrapFlavorTypeText: m_type = wxDF_TEXT; - else - if (m_format == kScrapFlavorTypeUnicode ) + break; + + case kScrapFlavorTypeUnicode: m_type = wxDF_UNICODETEXT; - else - if (m_format == kScrapFlavorTypePicture) + break; + + case kScrapFlavorTypePicture: m_type = wxDF_BITMAP; - else - if (m_format == kDragFlavorTypeHFS ) + break; + + case kDragFlavorTypeHFS: m_type = wxDF_FILENAME; - else + break; + + default: m_type = wxDF_PRIVATE; + char text[5]; + memcpy( text, (const char*)&format, 4 ); + text[4] = 0; + m_id = wxString::FromAscii( text ); + break; + } } void wxDataFormat::SetId( const wxChar* zId ) { - wxString tmp(zId); - m_type = wxDF_PRIVATE; - m_format = 0;// TODO: get the format gdk_atom_intern( wxMBSTRINGCAST tmp.mbc_str(), FALSE ); + m_id = zId; + m_format = 'WXPR'; +} + +bool wxDataFormat::operator==(const wxDataFormat& format) const +{ + if (IsStandard() || format.IsStandard()) + return (format.m_type == m_type); + else + return (m_id == format.m_id); } //------------------------------------------------------------------------- @@ -137,89 +160,108 @@ wxDataObject::wxDataObject() { } -bool wxDataObject::IsSupportedFormat( - const wxDataFormat& rFormat -, Direction vDir -) const +bool wxDataObject::IsSupportedFormat( const wxDataFormat& rFormat, Direction vDir ) const { - size_t nFormatCount = GetFormatCount(vDir); + size_t nFormatCount = GetFormatCount( vDir ); + bool found = false; if (nFormatCount == 1) { - return rFormat == GetPreferredFormat(); + found = (rFormat == GetPreferredFormat()); } else { - wxDataFormat* pFormats = new wxDataFormat[nFormatCount]; - GetAllFormats( pFormats - ,vDir - ); + wxDataFormat *pFormats = new wxDataFormat[nFormatCount]; + GetAllFormats( pFormats, vDir ); - size_t n; - - for (n = 0; n < nFormatCount; n++) + for (size_t n = 0; n < nFormatCount; n++) { if (pFormats[n] == rFormat) + { + found = true; break; + } } delete [] pFormats; - - // found? - return n < nFormatCount; } + + return found; +} + +// ---------------------------------------------------------------------------- +// wxTextDataObject +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE +void wxTextDataObject::GetAllFormats( wxDataFormat *formats, wxDataObjectBase::Direction dir ) const +{ + *formats++ = wxDataFormat( wxDF_TEXT ); + *formats = wxDataFormat( wxDF_UNICODETEXT ); } +#endif // ---------------------------------------------------------------------------- // wxFileDataObject // ---------------------------------------------------------------------------- -bool wxFileDataObject::GetDataHere( - void* pBuf -) const +void wxFileDataObject::GetFileNames( wxCharBuffer &buf ) const { - wxString sFilenames; + wxString filenames; for (size_t i = 0; i < m_filenames.GetCount(); i++) { - sFilenames += m_filenames[i]; - sFilenames += (wxChar)0; + filenames += m_filenames[i]; + filenames += wxT('\n'); } - memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1); - return TRUE; + buf = filenames.fn_str(); +} + +bool wxFileDataObject::GetDataHere( void *pBuf ) const +{ + if (pBuf == NULL) + return false; + + wxCharBuffer buf; + size_t buffLength; + + GetFileNames( buf ); + buffLength = strlen( buf ); + memcpy( pBuf, (const char*)buf, buffLength + 1 ); + + return true; } size_t wxFileDataObject::GetDataSize() const { - size_t nRes = 0; + wxCharBuffer buf; + size_t buffLength; - for (size_t i = 0; i < m_filenames.GetCount(); i++) - { - nRes += m_filenames[i].Len(); - nRes += 1; - } + GetFileNames( buf ); + buffLength = strlen( buf ); - return nRes + 1; + return buffLength + 1; } -bool wxFileDataObject::SetData( - size_t WXUNUSED(nSize) -, const void* pBuf -) +bool wxFileDataObject::SetData( size_t nSize, const void *pBuf ) { - m_filenames.Empty(); + wxString filenames; - AddFile(wxString::FromAscii((char*)pBuf)); +#if wxUSE_UNICODE + filenames = wxString( (const char*)pBuf, *wxConvFileName ); +#else + filenames = wxString( wxConvFileName->cMB2WX( (const char*)pBuf ), wxConvLocal ); +#endif - return TRUE; + m_filenames = wxStringTokenize( filenames, wxT("\n"), wxTOKEN_STRTOK ); + + return true; } -void wxFileDataObject::AddFile( - const wxString& rFilename -) +void wxFileDataObject::AddFile( const wxString& rFilename ) { - m_filenames.Add(rFilename); + m_filenames.Add( rFilename ); } // ---------------------------------------------------------------------------- @@ -231,15 +273,15 @@ wxBitmapDataObject::wxBitmapDataObject() Init(); } -wxBitmapDataObject::wxBitmapDataObject( - const wxBitmap& rBitmap -) -: wxBitmapDataObjectBase(rBitmap) +wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& rBitmap ) +: wxBitmapDataObjectBase( rBitmap ) { Init(); - if ( m_bitmap.Ok() ) + + if (m_bitmap.Ok()) { - m_pictHandle = m_bitmap.GetPict( &m_pictCreated ) ; + m_pictHandle = m_bitmap.GetBitmapData()->GetPictHandle(); + m_pictCreated = false; } } @@ -248,65 +290,84 @@ wxBitmapDataObject::~wxBitmapDataObject() Clear(); } -void wxBitmapDataObject::SetBitmap( - const wxBitmap& rBitmap -) +void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap ) { Clear(); - wxBitmapDataObjectBase::SetBitmap(rBitmap); - if ( m_bitmap.Ok() ) + wxBitmapDataObjectBase::SetBitmap( rBitmap ); + if (m_bitmap.Ok()) { - m_pictHandle = m_bitmap.GetPict( &m_pictCreated ) ; + m_pictHandle = m_bitmap.GetBitmapData()->GetPictHandle(); + m_pictCreated = false; } } -void wxBitmapDataObject::Init() -{ - m_pictHandle = NULL ; - m_pictCreated = false ; -} +void wxBitmapDataObject::Init() +{ + m_pictHandle = NULL; + m_pictCreated = false; +} -void wxBitmapDataObject::Clear() +void wxBitmapDataObject::Clear() { - if ( m_pictCreated && m_pictHandle ) + if (m_pictHandle != NULL) { - KillPicture( (PicHandle) m_pictHandle ) ; + if (m_pictCreated) + KillPicture( (PicHandle)m_pictHandle ); + m_pictHandle = NULL; } - m_pictHandle = NULL ; + + m_pictCreated = false; } -bool wxBitmapDataObject::GetDataHere( - void* pBuf -) const +bool wxBitmapDataObject::GetDataHere( void *pBuf ) const { - if (!m_pictHandle) + if (m_pictHandle == NULL) { - wxFAIL_MSG(wxT("attempt to copy empty bitmap failed")); - return FALSE; + wxFAIL_MSG( wxT("attempt to copy empty bitmap failed") ); + return false; } - memcpy(pBuf, *(Handle)m_pictHandle, GetHandleSize((Handle)m_pictHandle)); - return TRUE; + + if (pBuf == NULL) + return false; + + memcpy( pBuf, *(Handle)m_pictHandle, GetHandleSize( (Handle)m_pictHandle ) ); + + return true; } size_t wxBitmapDataObject::GetDataSize() const { - return GetHandleSize((Handle)m_pictHandle) ; + if (m_pictHandle != NULL) + return GetHandleSize( (Handle)m_pictHandle ); + else + return 0; } -bool wxBitmapDataObject::SetData( - size_t nSize -, const void* pBuf -) +bool wxBitmapDataObject::SetData( size_t nSize, const void *pBuf ) { Clear(); - PicHandle picHandle = (PicHandle) NewHandle( nSize ) ; - memcpy( *picHandle , pBuf , nSize ) ; - m_pictHandle = picHandle ; - m_pictCreated = false ; - Rect frame = (**picHandle).picFrame ; - - m_bitmap.SetPict( picHandle ) ; - m_bitmap.SetWidth( frame.right - frame.left ) ; - m_bitmap.SetHeight( frame.bottom - frame.top ) ; + + if ((pBuf == NULL) || (nSize == 0)) + return false; + + PicHandle picHandle = (PicHandle)NewHandle( nSize ); + memcpy( *picHandle, pBuf, nSize ); + m_pictHandle = picHandle; + + // ownership is transferred to the bitmap + m_pictCreated = false; + Rect frame; + wxMacGetPictureBounds( picHandle, &frame ); + + wxMetafile mf; + mf.SetHMETAFILE( (WXHMETAFILE)m_pictHandle ); + wxMemoryDC mdc; + m_bitmap.Create( frame.right - frame.left, frame.bottom - frame.top ); + mdc.SelectObject( m_bitmap ); + mf.Play( &mdc ); + mdc.SelectObject( wxNullBitmap ); + return m_bitmap.Ok(); } + +#endif