using UTType constants wherever possible to avoid typos, checking for failed conversions, leveraging native conversion of types, fixes #13442

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2012-06-20 07:16:03 +00:00
parent 9ba371fa05
commit 2979ddbe2f

View 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 )
{