]> git.saurik.com Git - wxWidgets.git/commitdiff
using UTType constants wherever possible to avoid typos, checking for failed conversi...
authorStefan Csomor <csomor@advancedconcepts.ch>
Wed, 20 Jun 2012 07:16:03 +0000 (07:16 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Wed, 20 Jun 2012 07:16:03 +0000 (07:16 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/osx/carbon/dataobj.cpp

index e3da7cd7ecee99c38c1c97431e28bffb43ac8817..f270fb06a09ace2af88749d4981f6f61460fd997 100644 (file)
@@ -121,26 +121,26 @@ void wxDataFormat::SetType( wxDataFormatId dataType )
     switch (m_type)
     {
     case wxDF_TEXT:
-        m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.plain-text") );
+        m_format = (long) CFStringCreateCopy( NULL, kUTTypePlainText );
         break;
 
     case wxDF_UNICODETEXT:
-        m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.utf16-plain-text") );
+        m_format = (long) CFStringCreateCopy( NULL, kUTTypeUTF16PlainText );
         break;
 
     case wxDF_HTML:
-        m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.html") );
+        m_format = (long) CFStringCreateCopy( NULL, kUTTypeHTML );
         break;
 
     case wxDF_BITMAP:
-        m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.tiff") );
+        m_format = (long) CFStringCreateCopy( NULL, kUTTypeTIFF );
         break;
     case wxDF_METAFILE:
-        m_format = (long) CFStringCreateCopy( NULL, CFSTR("com.adobe.pdf") );
+        m_format = (long) CFStringCreateCopy( NULL, kUTTypePDF );
         break;
 
     case wxDF_FILENAME:
-        m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.file-url") );
+        m_format = (long) CFStringCreateCopy( NULL, kUTTypeFileURL );
         break;
 
     default:
@@ -162,31 +162,35 @@ void wxDataFormat::SetId( NativeFormat format )
         m_format = 0;
     }
     m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)format);
-    if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.html") ) )
+    if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeHTML ) )
     {
         m_type = wxDF_HTML;
     }
-    if (  UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-plain-text") )  )
+    if (  UTTypeConformsTo( (CFStringRef)format, kUTTypeUTF16PlainText ) )
     {
         m_type = wxDF_UNICODETEXT;
     }
-    else if (  UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-external-plain-text") )  )
+    else if (  UTTypeConformsTo( (CFStringRef)format,kUTTypeUTF16ExternalPlainText ) )
     {
         m_type = wxDF_UNICODETEXT;
     }
-    else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.plain-text") ) )
+    else if (  UTTypeConformsTo( (CFStringRef)format,kUTTypeUTF8PlainText ) )
+    {
+        m_type = wxDF_UNICODETEXT;
+    }
+    else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypePlainText ) )
     {
         m_type = wxDF_TEXT;
     }
-    else if (  UTTypeConformsTo( (CFStringRef)format, CFSTR("public.tiff") )  )
+    else if (  UTTypeConformsTo( (CFStringRef)format, kUTTypeImage ) )
     {
         m_type = wxDF_BITMAP;
     }
-    else if (  UTTypeConformsTo( (CFStringRef)format, CFSTR("com.adobe.pdf") )  )
+    else if (  UTTypeConformsTo( (CFStringRef)format, kUTTypePDF ) )
     {
         m_type = wxDF_METAFILE;
     }
-    else if (  UTTypeConformsTo( (CFStringRef)format, CFSTR("public.file-url") ) ||
+    else if (  UTTypeConformsTo( (CFStringRef)format, kUTTypeFileURL ) ||
              UTTypeConformsTo( (CFStringRef)format, kPasteboardTypeFileURLPromise))
     {
         m_type = wxDF_FILENAME;
@@ -272,13 +276,31 @@ void wxDataObject::AddToPasteboard( void * pb, int itemID )
         // string including trailing zero
 
         size_t datasize = GetDataSize( thisFormat );
+        if ( datasize == wxCONV_FAILED && thisFormat.GetType() == wxDF_TEXT)
+        {
+            // conversion to local text failed, so we must use unicode
+            // if wxDF_UNICODETEXT is already on the 'todo' list, skip this iteration
+            // otherwise force it
+            size_t j = 0;
+            for (j = 0; j < GetFormatCount(); j++)
+            {
+                if ( array[j].GetType() == wxDF_UNICODETEXT )
+                    break;
+            }
+            if ( j < GetFormatCount() )
+                continue;
+            
+            thisFormat.SetType(wxDF_UNICODETEXT);
+            datasize = GetDataSize( thisFormat );
+        }
+            
         size_t sz = datasize + 4;
         void* buf = malloc( sz );
         if ( buf != NULL )
         {
             // empty the buffer because in some case GetDataHere does not fill buf
             memset( buf, 0, sz );
-            if ( GetDataHere( array[ i ], buf ) )
+            if ( GetDataHere( thisFormat, buf ) )
             {
                 int counter = 1 ;
                 if ( thisFormat.GetType() == wxDF_FILENAME )
@@ -416,11 +438,6 @@ bool wxDataObject::GetFromPasteboard( void * pb )
                     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 )
@@ -436,6 +453,12 @@ bool wxDataObject::GetFromPasteboard( void * pb )
                             wxCFRef<CFURLRef> dest(CFURLCreateFromFileSystemRepresentation(NULL,(const UInt8*)result,strlen(result),true));
                             PasteboardSetPasteLocation(pasteboard, dest);
                         }
+                        else if ( flavorFormat.GetType() != wxDF_PRIVATE )
+                        {
+                            // indicate the expected format for the type, benefiting from native conversions eg utf8 -> utf16
+                            flavorType = (CFStringRef) wxDataFormat( flavorFormat.GetType()).GetFormatId();
+                        }
+                        
                         err = PasteboardCopyItemFlavorData( pasteboard, itemID, flavorType , &flavorData );
                         if ( err == noErr )
                         {