47
47
wxDataFormat::wxDataFormat( wxDataFormatId vType )
50
m_type = wxDF_INVALID;
52
54
wxDataFormat::wxDataFormat( const wxChar *zId )
57
m_type = wxDF_INVALID;
57
61
wxDataFormat::wxDataFormat( const wxString& rId )
64
m_type = wxDF_INVALID;
68
wxDataFormat::wxDataFormat(const wxDataFormat& rFormat)
70
if ( rFormat.m_format )
71
m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)rFormat.m_format);
74
m_type = rFormat.m_type;
62
78
wxDataFormat::wxDataFormat( NativeFormat vFormat )
81
m_type = wxDF_INVALID;
85
wxDataFormat::~wxDataFormat()
89
CFRelease( (CFStringRef) m_format );
94
// in order to be correct for 10.3 we restrict to the available types there
95
// http://developer.apple.com/qa/qa2005/qa1406.html
96
// TODO : Use UTCoreTypes.h constants once we support 10.4+ only
98
wxDataFormat& wxDataFormat::operator=(const wxDataFormat& rFormat)
102
CFRelease( (CFStringRef) m_format );
105
if ( rFormat.m_format )
106
m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)rFormat.m_format);
107
m_type = rFormat.m_type;
67
112
void wxDataFormat::SetType( wxDataFormatId dataType )
69
114
m_type = dataType;
117
CFRelease( (CFStringRef) m_format );
74
m_format = kScrapFlavorTypeText;
124
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.plain-text") );
77
127
case wxDF_UNICODETEXT:
78
m_format = kScrapFlavorTypeUnicode;
128
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.utf16-plain-text") );
132
#if wxMAC_USE_CORE_GRAPHICS
133
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.tiff") );
135
m_format = (long) CFStringCreateCopy( NULL, CFSTR("com.apple.pict") );
82
138
case wxDF_METAFILE:
83
m_format = kScrapFlavorTypePicture;
139
#if wxMAC_USE_CORE_GRAPHICS
140
m_format = (long) CFStringCreateCopy( NULL, CFSTR("com.adobe.pdf") );
142
m_format = (long) CFStringCreateCopy( NULL, CFSTR("com.apple.pict") );
86
146
case wxDF_FILENAME:
87
m_format = kDragFlavorTypeHFS;
147
m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.file-url") );
91
151
wxFAIL_MSG( wxT("invalid data format") );
93
// NB: this translates to '????' ASCII but it can't be used in the code
94
// because '??' will get parsed as a trigraph!
95
m_format = 0x3f3f3f3f;
264
void wxDataObject::AddToPasteboard( void * pb, int itemID )
266
PasteboardRef pasteboard = (PasteboardRef) pb;
267
// get formats from wxDataObjects
268
wxDataFormat *array = new wxDataFormat[ GetFormatCount() ];
269
GetAllFormats( array );
271
for (size_t i = 0; i < GetFormatCount(); i++)
273
wxDataFormat thisFormat = array[ i ];
275
// add four bytes at the end for data objs like text that
276
// have a datasize = strlen but still need a buffer for the
277
// string including trailing zero
279
size_t datasize = GetDataSize( thisFormat );
280
size_t sz = datasize + 4;
281
void* buf = malloc( sz );
284
// empty the buffer because in some case GetDataHere does not fill buf
285
memset( buf, 0, sz );
286
if ( GetDataHere( array[ i ], buf ) )
289
if ( thisFormat.GetType() == wxDF_FILENAME )
291
// the data is D-normalized UTF8 strings of filenames delimited with \n
292
char *fname = strtok((char*) buf,"\n");
293
while (fname != NULL)
295
// translate the filepath into a fileurl and put that into the pasteobard
296
CFStringRef path = CFStringCreateWithBytes(NULL,(UInt8*)fname,strlen(fname),kCFStringEncodingUTF8,false);
297
CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path , kCFURLPOSIXPathStyle, false);
299
CFDataRef data = CFURLCreateData(NULL,url,kCFStringEncodingUTF8,true);
301
PasteboardPutItemFlavor( pasteboard, (PasteboardItemID) counter,
302
(CFStringRef) thisFormat.GetFormatId() , data, kPasteboardFlavorNoFlags);
305
fname = strtok (NULL,"\n");
311
CFDataRef data = CFDataCreate( kCFAllocatorDefault, (UInt8*)buf, datasize );
312
if ( thisFormat.GetType() == wxDF_TEXT )
313
PasteboardPutItemFlavor( pasteboard, (PasteboardItemID) itemID,
314
CFSTR("com.apple.traditional-mac-plain-text") , data, kPasteboardFlavorNoFlags);
316
PasteboardPutItemFlavor( pasteboard, (PasteboardItemID) itemID,
317
(CFStringRef) thisFormat.GetFormatId() , data, kPasteboardFlavorNoFlags);
328
bool wxDataObject::IsFormatInPasteboard( void * pb, const wxDataFormat &dataFormat )
330
PasteboardRef pasteboard = (PasteboardRef) pb;
331
bool hasData = false;
332
OSStatus err = noErr;
335
// we synchronize here once again, so we don't mind which flags get returned
336
PasteboardSynchronize( pasteboard );
338
err = PasteboardGetItemCount( pasteboard, &itemCount );
341
for( UInt32 itemIndex = 1; itemIndex <= itemCount && hasData == false ; itemIndex++ )
343
PasteboardItemID itemID;
344
CFArrayRef flavorTypeArray;
347
err = PasteboardGetItemIdentifier( pasteboard, itemIndex, &itemID );
351
err = PasteboardCopyItemFlavors( pasteboard, itemID, &flavorTypeArray );
355
flavorCount = CFArrayGetCount( flavorTypeArray );
357
for( CFIndex flavorIndex = 0; flavorIndex < flavorCount && hasData == false ; flavorIndex++ )
359
CFStringRef flavorType;
361
flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray,
364
wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType );
365
if ( dataFormat == flavorFormat )
367
else if ( dataFormat.GetType() == wxDF_UNICODETEXT && flavorFormat.GetType() == wxDF_TEXT )
370
CFRelease (flavorTypeArray);
377
bool wxDataObject::GetFromPasteboard( void * pb )
379
PasteboardRef pasteboard = (PasteboardRef) pb;
380
size_t formatcount = GetFormatCount() + 1;
381
wxDataFormat *array = new wxDataFormat[ formatcount ];
382
array[0] = GetPreferredFormat();
383
GetAllFormats( &array[1] );
384
ItemCount itemCount = 0;
385
wxString filenamesPassed;
386
bool transferred = false;
388
// we synchronize here once again, so we don't mind which flags get returned
389
PasteboardSynchronize( pasteboard );
391
OSStatus err = PasteboardGetItemCount( pasteboard, &itemCount );
394
for (size_t i = 0; !transferred && i < formatcount; i++)
396
// go through the data in our order of preference
397
wxDataFormat dataFormat = array[ i ];
399
for( UInt32 itemIndex = 1; itemIndex <= itemCount && transferred == false ; itemIndex++ )
401
PasteboardItemID itemID = 0;
402
CFArrayRef flavorTypeArray = NULL;
403
CFIndex flavorCount = 0;
405
err = PasteboardGetItemIdentifier( pasteboard, itemIndex, &itemID );
409
err = PasteboardCopyItemFlavors( pasteboard, itemID, &flavorTypeArray );
413
flavorCount = CFArrayGetCount( flavorTypeArray );
415
for( CFIndex flavorIndex = 0; !transferred && flavorIndex < flavorCount ; flavorIndex++ )
417
CFStringRef flavorType;
418
CFDataRef flavorData;
419
CFIndex flavorDataSize;
421
flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray,
424
wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType );
426
if ( dataFormat == flavorFormat )
428
err = PasteboardCopyItemFlavorData( pasteboard, itemID, flavorType , &flavorData );
431
flavorDataSize = CFDataGetLength( flavorData );
432
if (dataFormat.GetType() == wxDF_FILENAME )
434
// revert the translation and decomposition to arrive at a proper utf8 string again
435
CFURLRef url = CFURLCreateWithBytes( kCFAllocatorDefault, CFDataGetBytePtr( flavorData ), flavorDataSize, kCFStringEncodingUTF8, NULL );
436
CFStringRef cfString = CFURLCopyFileSystemPath( url, kCFURLPOSIXPathStyle );
438
CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, cfString);
439
CFRelease( cfString );
440
CFStringNormalize(cfMutableString,kCFStringNormalizationFormC);
441
wxString path = wxMacCFStringHolder(cfMutableString).AsString();
443
filenamesPassed += path + wxT("\n");
447
// because some data implementation expect trailing a trailing NUL, we add some headroom
448
void *buf = malloc( flavorDataSize + 4 );
451
memset( buf, 0, flavorDataSize + 4 );
452
memcpy( buf, CFDataGetBytePtr( flavorData ), flavorDataSize );
454
if (dataFormat.GetType() == wxDF_TEXT)
455
wxMacConvertNewlines10To13( (char*) buf );
456
SetData( flavorFormat, flavorDataSize, buf );
461
CFRelease (flavorData);
464
else if ( dataFormat.GetType() == wxDF_UNICODETEXT && flavorFormat.GetType() == wxDF_TEXT )
466
err = PasteboardCopyItemFlavorData( pasteboard, itemID, flavorType, &flavorData );
469
flavorDataSize = CFDataGetLength( flavorData );
470
void *asciibuf = malloc( flavorDataSize + 1 );
473
memset( asciibuf, 0, flavorDataSize + 1 );
474
memcpy( asciibuf, CFDataGetBytePtr( flavorData ), flavorDataSize );
475
CFRelease (flavorData);
477
SetData( wxDF_TEXT, flavorDataSize, asciibuf );
482
CFRelease (flavorData);
486
CFRelease( flavorTypeArray );
488
if (filenamesPassed.length() > 0)
490
wxCharBuffer buf = filenamesPassed.fn_str();
491
SetData( wxDF_FILENAME, strlen( buf ), (const char*)buf );
499
bool wxDataObject::HasDataInPasteboard( void * pb )
501
PasteboardRef pasteboard = (PasteboardRef) pb;
502
size_t formatcount = GetFormatCount() + 1;
503
wxDataFormat *array = new wxDataFormat[ formatcount ];
504
array[0] = GetPreferredFormat();
505
GetAllFormats( &array[1] );
506
ItemCount itemCount = 0;
507
bool hasData = false;
509
// we synchronize here once again, so we don't mind which flags get returned
510
PasteboardSynchronize( pasteboard );
512
OSStatus err = PasteboardGetItemCount( pasteboard, &itemCount );
515
for (size_t i = 0; !hasData && i < formatcount; i++)
517
// go through the data in our order of preference
518
wxDataFormat dataFormat = array[ i ];
520
for( UInt32 itemIndex = 1; itemIndex <= itemCount && hasData == false ; itemIndex++ )
522
PasteboardItemID itemID = 0;
523
CFArrayRef flavorTypeArray = NULL;
524
CFIndex flavorCount = 0;
526
err = PasteboardGetItemIdentifier( pasteboard, itemIndex, &itemID );
530
err = PasteboardCopyItemFlavors( pasteboard, itemID, &flavorTypeArray );
534
flavorCount = CFArrayGetCount( flavorTypeArray );
536
for( CFIndex flavorIndex = 0; !hasData && flavorIndex < flavorCount ; flavorIndex++ )
538
CFStringRef flavorType;
540
flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray,
543
wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType );
545
if ( dataFormat == flavorFormat ||
546
dataFormat.GetType() == wxDF_UNICODETEXT && flavorFormat.GetType() == wxDF_TEXT )
551
CFRelease( flavorTypeArray );
192
558
// ----------------------------------------------------------------------------
193
559
// wxTextDataObject
194
560
// ----------------------------------------------------------------------------
352
777
if ((pBuf == NULL) || (nSize == 0))
780
#if wxMAC_USE_CORE_GRAPHICS
781
Handle picHandle = NewHandle( nSize );
782
memcpy( *picHandle, pBuf, nSize );
783
m_pictHandle = picHandle;
784
CGImageRef cgImageRef = 0;
785
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
786
if ( UMAGetSystemVersion() >= 0x1040 )
788
CFDataRef data = CFDataCreateWithBytesNoCopy( kCFAllocatorDefault, (const UInt8*) pBuf, nSize, kCFAllocatorNull);
789
CGImageSourceRef source = CGImageSourceCreateWithData( data, NULL );
792
cgImageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
802
GraphicsImportComponent importer = 0;
803
OSStatus err = OpenADefaultComponent(GraphicsImporterComponentType, kQTFileTypeTIFF, &importer);
808
ComponentResult result = GraphicsImportSetDataHandle(importer, picHandle);
809
if ( result == noErr )
812
GraphicsImportGetNaturalBounds( importer, &frame );
813
GraphicsImportCreateCGImage( importer, &cgImageRef, kGraphicsImportCreateCGImageUsingCurrentSettings );
816
CloseComponent( importer );
822
m_bitmap.Create( CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
823
CGRect r = CGRectMake( 0 , 0 , CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
824
// since our context is upside down we dont use CGContextDrawImage
825
HIViewDrawCGImage( (CGContextRef) m_bitmap.GetHBITMAP() , &r, cgImageRef ) ;
826
CGImageRelease(cgImageRef);
355
830
PicHandle picHandle = (PicHandle)NewHandle( nSize );
356
831
memcpy( *picHandle, pBuf, nSize );
357
832
m_pictHandle = picHandle;
359
833
// ownership is transferred to the bitmap
360
834
m_pictCreated = false;