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:
@@ -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 )
|
||||
{
|
||||
|
Reference in New Issue
Block a user