]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/dataobj.cpp
Make wxTaskBarIcon's ctor have the same API on all platforms even though setting...
[wxWidgets.git] / src / osx / carbon / dataobj.cpp
index 3b9de3922355a0f3c56d5a21dfb79787cd2e33ae..a4cfb843afe5a50ba1f34c523eaab2186b249567 100644 (file)
@@ -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 <QuickTime/QuickTime.h>
 #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