X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f0c8f31f407ecfce909060464c0ea655221cdab..08670ea85abf4b4946a9ce64971b591d7b1ee30b:/src/osx/carbon/dataobj.cpp?ds=sidebyside diff --git a/src/osx/carbon/dataobj.cpp b/src/osx/carbon/dataobj.cpp index 3b9de39223..a4cfb843af 100644 --- a/src/osx/carbon/dataobj.cpp +++ b/src/osx/carbon/dataobj.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/dataobj.cpp +// Name: src/osx/carbon/dataobj.cpp // Purpose: implementation of wxDataObject class // Author: Stefan Csomor // Modified by: @@ -27,9 +27,9 @@ #include "wx/metafile.h" #include "wx/tokenzr.h" -#include "wx/osx/uma.h" +#include "wx/osx/private.h" -#ifdef __DARWIN__ +#if wxOSX_USE_COCOA_OR_CARBON #include #endif @@ -158,27 +158,31 @@ void wxDataFormat::SetId( NativeFormat format ) m_format = 0; } m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)format); - if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-plain-text") ) ) + if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-plain-text") ) ) { m_type = wxDF_UNICODETEXT; - } + } + else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-external-plain-text") ) ) + { + m_type = wxDF_UNICODETEXT; + } else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.plain-text") ) ) { m_type = wxDF_TEXT; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.tiff") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.tiff") ) ) { m_type = wxDF_BITMAP; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("com.adobe.pdf") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("com.adobe.pdf") ) ) { m_type = wxDF_METAFILE; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.file-url") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.file-url") ) ) { m_type = wxDF_FILENAME; } - else + else { m_type = wxDF_PRIVATE; m_id = wxCFStringRef( (CFStringRef) CFRetain((CFStringRef) format )).AsString(); @@ -253,11 +257,11 @@ void wxDataObject::AddToPasteboard( void * pb, int itemID ) for (size_t i = 0; i < GetFormatCount(); i++) { wxDataFormat thisFormat = array[ i ]; - - // add four bytes at the end for data objs like text that + + // add four bytes at the end for data objs like text that // have a datasize = strlen but still need a buffer for the // string including trailing zero - + size_t datasize = GetDataSize( thisFormat ); size_t sz = datasize + 4; void* buf = malloc( sz ); @@ -286,7 +290,7 @@ void wxDataObject::AddToPasteboard( void * pb, int itemID ) counter++; fname = strtok (NULL,"\n"); } - + } else { @@ -325,24 +329,24 @@ bool wxDataObject::IsFormatInPasteboard( void * pb, const wxDataFormat &dataForm PasteboardItemID itemID; CFArrayRef flavorTypeArray; CFIndex flavorCount; - + err = PasteboardGetItemIdentifier( pasteboard, itemIndex, &itemID ); if ( err != noErr ) continue; - + err = PasteboardCopyItemFlavors( pasteboard, itemID, &flavorTypeArray ); if ( err != noErr ) continue; - + flavorCount = CFArrayGetCount( flavorTypeArray ); - + for( CFIndex flavorIndex = 0; flavorIndex < flavorCount && hasData == false ; flavorIndex++ ) { CFStringRef flavorType; - + flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray, flavorIndex ); - + wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType ); if ( dataFormat == flavorFormat ) hasData = true; @@ -391,7 +395,7 @@ bool wxDataObject::GetFromPasteboard( void * pb ) err = PasteboardCopyItemFlavors( pasteboard, itemID, &flavorTypeArray ); if ( err != noErr ) continue; - + flavorCount = CFArrayGetCount( flavorTypeArray ); for( CFIndex flavorIndex = 0; !transferred && flavorIndex < flavorCount ; flavorIndex++ ) @@ -399,12 +403,17 @@ bool wxDataObject::GetFromPasteboard( void * pb ) CFStringRef flavorType; CFDataRef flavorData; CFIndex flavorDataSize; - + flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray, flavorIndex ); + // avoid utf8 being treated closer to plain-text than unicode by forcing a conversion + if ( UTTypeConformsTo(flavorType, CFSTR("public.utf8-plain-text") ) ) + { + flavorType = CFSTR("public.utf16-plain-text"); + } wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType ); - + if ( dataFormat == flavorFormat ) { err = PasteboardCopyItemFlavorData( pasteboard, itemID, flavorType , &flavorData ); @@ -432,7 +441,7 @@ bool wxDataObject::GetFromPasteboard( void * pb ) { memset( buf, 0, flavorDataSize + 4 ); memcpy( buf, CFDataGetBytePtr( flavorData ), flavorDataSize ); - + if (dataFormat.GetType() == wxDF_TEXT) wxMacConvertNewlines10To13( (char*) buf ); SetData( flavorFormat, flavorDataSize, buf ); @@ -467,7 +476,7 @@ bool wxDataObject::GetFromPasteboard( void * pb ) } CFRelease( flavorTypeArray ); } - if (filenamesPassed.length() > 0) + if ( !filenamesPassed.empty() ) { wxCharBuffer buf = filenamesPassed.fn_str(); SetData( wxDF_FILENAME, strlen( buf ), (const char*)buf ); @@ -512,20 +521,20 @@ bool wxDataObject::HasDataInPasteboard( void * pb ) err = PasteboardCopyItemFlavors( pasteboard, itemID, &flavorTypeArray ); if ( err != noErr ) continue; - + flavorCount = CFArrayGetCount( flavorTypeArray ); for( CFIndex flavorIndex = 0; !hasData && flavorIndex < flavorCount ; flavorIndex++ ) { CFStringRef flavorType; - + flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray, flavorIndex ); wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType ); - - if ( dataFormat == flavorFormat || - dataFormat.GetType() == wxDF_UNICODETEXT && flavorFormat.GetType() == wxDF_TEXT ) + + if ( dataFormat == flavorFormat || + (dataFormat.GetType() == wxDF_UNICODETEXT && flavorFormat.GetType() == wxDF_TEXT) ) { hasData = true; } @@ -627,9 +636,9 @@ wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& rBitmap ) { Init(); - if (m_bitmap.Ok()) + if (m_bitmap.IsOk()) { - SetBitmap( rBitmap ); + SetBitmap( rBitmap ); } } @@ -642,7 +651,7 @@ void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap ) { Clear(); wxBitmapDataObjectBase::SetBitmap( rBitmap ); - if (m_bitmap.Ok()) + if (m_bitmap.IsOk()) { CGImageRef cgImageRef = (CGImageRef) m_bitmap.CreateCGImage(); @@ -733,8 +742,8 @@ bool wxBitmapDataObject::SetData( size_t nSize, const void *pBuf ) if ( source ) { cgImageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL); + CFRelease( source ); } - CFRelease( source ); CFRelease( data ); if ( cgImageRef ) @@ -747,7 +756,7 @@ bool wxBitmapDataObject::SetData( size_t nSize, const void *pBuf ) cgImageRef = NULL; } - return m_bitmap.Ok(); + return m_bitmap.IsOk(); } #endif