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)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case wxDF_TEXT:
|
case wxDF_TEXT:
|
||||||
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.plain-text") );
|
m_format = (long) CFStringCreateCopy( NULL, kUTTypePlainText );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case wxDF_UNICODETEXT:
|
case wxDF_UNICODETEXT:
|
||||||
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.utf16-plain-text") );
|
m_format = (long) CFStringCreateCopy( NULL, kUTTypeUTF16PlainText );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case wxDF_HTML:
|
case wxDF_HTML:
|
||||||
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.html") );
|
m_format = (long) CFStringCreateCopy( NULL, kUTTypeHTML );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case wxDF_BITMAP:
|
case wxDF_BITMAP:
|
||||||
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.tiff") );
|
m_format = (long) CFStringCreateCopy( NULL, kUTTypeTIFF );
|
||||||
break;
|
break;
|
||||||
case wxDF_METAFILE:
|
case wxDF_METAFILE:
|
||||||
m_format = (long) CFStringCreateCopy( NULL, CFSTR("com.adobe.pdf") );
|
m_format = (long) CFStringCreateCopy( NULL, kUTTypePDF );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case wxDF_FILENAME:
|
case wxDF_FILENAME:
|
||||||
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.file-url") );
|
m_format = (long) CFStringCreateCopy( NULL, kUTTypeFileURL );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -162,31 +162,35 @@ void wxDataFormat::SetId( NativeFormat format )
|
|||||||
m_format = 0;
|
m_format = 0;
|
||||||
}
|
}
|
||||||
m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)format);
|
m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)format);
|
||||||
if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.html") ) )
|
if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeHTML ) )
|
||||||
{
|
{
|
||||||
m_type = wxDF_HTML;
|
m_type = wxDF_HTML;
|
||||||
}
|
}
|
||||||
if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-plain-text") ) )
|
if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeUTF16PlainText ) )
|
||||||
{
|
{
|
||||||
m_type = wxDF_UNICODETEXT;
|
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;
|
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;
|
m_type = wxDF_TEXT;
|
||||||
}
|
}
|
||||||
else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.tiff") ) )
|
else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeImage ) )
|
||||||
{
|
{
|
||||||
m_type = wxDF_BITMAP;
|
m_type = wxDF_BITMAP;
|
||||||
}
|
}
|
||||||
else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("com.adobe.pdf") ) )
|
else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypePDF ) )
|
||||||
{
|
{
|
||||||
m_type = wxDF_METAFILE;
|
m_type = wxDF_METAFILE;
|
||||||
}
|
}
|
||||||
else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.file-url") ) ||
|
else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeFileURL ) ||
|
||||||
UTTypeConformsTo( (CFStringRef)format, kPasteboardTypeFileURLPromise))
|
UTTypeConformsTo( (CFStringRef)format, kPasteboardTypeFileURLPromise))
|
||||||
{
|
{
|
||||||
m_type = wxDF_FILENAME;
|
m_type = wxDF_FILENAME;
|
||||||
@@ -272,13 +276,31 @@ void wxDataObject::AddToPasteboard( void * pb, int itemID )
|
|||||||
// string including trailing zero
|
// string including trailing zero
|
||||||
|
|
||||||
size_t datasize = GetDataSize( thisFormat );
|
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;
|
size_t sz = datasize + 4;
|
||||||
void* buf = malloc( sz );
|
void* buf = malloc( sz );
|
||||||
if ( buf != NULL )
|
if ( buf != NULL )
|
||||||
{
|
{
|
||||||
// empty the buffer because in some case GetDataHere does not fill buf
|
// empty the buffer because in some case GetDataHere does not fill buf
|
||||||
memset( buf, 0, sz );
|
memset( buf, 0, sz );
|
||||||
if ( GetDataHere( array[ i ], buf ) )
|
if ( GetDataHere( thisFormat, buf ) )
|
||||||
{
|
{
|
||||||
int counter = 1 ;
|
int counter = 1 ;
|
||||||
if ( thisFormat.GetType() == wxDF_FILENAME )
|
if ( thisFormat.GetType() == wxDF_FILENAME )
|
||||||
@@ -416,11 +438,6 @@ bool wxDataObject::GetFromPasteboard( void * pb )
|
|||||||
flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray,
|
flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray,
|
||||||
flavorIndex );
|
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 );
|
wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType );
|
||||||
|
|
||||||
if ( dataFormat == flavorFormat )
|
if ( dataFormat == flavorFormat )
|
||||||
@@ -436,6 +453,12 @@ bool wxDataObject::GetFromPasteboard( void * pb )
|
|||||||
wxCFRef<CFURLRef> dest(CFURLCreateFromFileSystemRepresentation(NULL,(const UInt8*)result,strlen(result),true));
|
wxCFRef<CFURLRef> dest(CFURLCreateFromFileSystemRepresentation(NULL,(const UInt8*)result,strlen(result),true));
|
||||||
PasteboardSetPasteLocation(pasteboard, dest);
|
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 );
|
err = PasteboardCopyItemFlavorData( pasteboard, itemID, flavorType , &flavorData );
|
||||||
if ( err == noErr )
|
if ( err == noErr )
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user