+ OSErr result;
+ DragReference theDrag;
+ RgnHandle dragRegion;
+ if ((result = NewDrag(&theDrag)) != noErr)
+ return wxDragNone ;
+
+ // add data to drag
+ size_t formatCount = m_data->GetFormatCount() ;
+ wxDataFormat *formats = new wxDataFormat[formatCount] ;
+ m_data->GetAllFormats( formats ) ;
+ ItemReference theItem = 1 ;
+
+ for ( size_t i = 0 ; i < formatCount ; ++i )
+ {
+ size_t dataSize = m_data->GetDataSize( formats[i] ) ;
+ Ptr dataPtr = new char[dataSize] ;
+ m_data->GetDataHere( formats[i] , dataPtr ) ;
+ OSType type = formats[i].GetFormatId() ;
+ if ( type == 'TEXT' || type == 'utxt' )
+ {
+ if ( dataSize > 0 )
+ dataSize-- ;
+ dataPtr[ dataSize ] = 0 ;
+ if ( type == 'utxt' )
+ {
+ if ( dataSize > 0 )
+ dataSize-- ;
+ dataPtr[ dataSize ] = 0 ;
+ }
+
+ AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);
+ }
+ else if (type == kDragFlavorTypeHFS )
+ {
+ HFSFlavor theFlavor ;
+ OSErr err = noErr;
+ CInfoPBRec cat;
+
+ wxMacFilename2FSSpec( wxString( dataPtr , *wxConvCurrent ) , &theFlavor.fileSpec ) ;
+
+ memset( &cat, 0, sizeof(cat) );
+ cat.hFileInfo.ioNamePtr = theFlavor.fileSpec.name;
+ cat.hFileInfo.ioVRefNum = theFlavor.fileSpec.vRefNum;
+ cat.hFileInfo.ioDirID = theFlavor.fileSpec.parID;
+ cat.hFileInfo.ioFDirIndex = 0;
+ err = PBGetCatInfoSync(&cat);
+ if (err == noErr)
+ {
+ theFlavor.fdFlags = cat.hFileInfo.ioFlFndrInfo.fdFlags;
+ if (theFlavor.fileSpec.parID == fsRtParID)
+ {
+ theFlavor.fileCreator = 'MACS';
+ theFlavor.fileType = 'disk';
+ }
+ else if ((cat.hFileInfo.ioFlAttrib & ioDirMask) != 0)
+ {
+ theFlavor.fileCreator = 'MACS';
+ theFlavor.fileType = 'fold';
+ }
+ else
+ {
+ theFlavor.fileCreator = cat.hFileInfo.ioFlFndrInfo.fdCreator;
+ theFlavor.fileType = cat.hFileInfo.ioFlFndrInfo.fdType;
+ }
+
+ AddDragItemFlavor(theDrag, theItem, type , &theFlavor, sizeof(theFlavor), 0);
+ }
+ }
+ else
+ {
+ AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);
+ }
+
+ delete [] dataPtr ;
+ }
+
+ delete [] formats ;
+
+ dragRegion = NewRgn();
+ RgnHandle tempRgn = NewRgn() ;
+
+ EventRecord* ev = NULL ;
+
+#if !TARGET_CARBON // TODO
+ ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ;
+#else
+ {
+ EventRecord rec ;
+ ev = &rec ;
+ wxMacConvertEventToRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
+ }
+#endif
+
+ const short dragRegionOuterBoundary = 10 ;
+ const short dragRegionInnerBoundary = 9 ;
+
+ SetRectRgn(
+ dragRegion , ev->where.h - dragRegionOuterBoundary ,
+ ev->where.v - dragRegionOuterBoundary ,
+ ev->where.h + dragRegionOuterBoundary ,
+ ev->where.v + dragRegionOuterBoundary ) ;
+
+ SetRectRgn(
+ tempRgn , ev->where.h - dragRegionInnerBoundary ,
+ ev->where.v - dragRegionInnerBoundary ,
+ ev->where.h + dragRegionInnerBoundary ,
+ ev->where.v + dragRegionInnerBoundary ) ;
+
+ DiffRgn( dragRegion , tempRgn , dragRegion ) ;
+ DisposeRgn( tempRgn ) ;
+
+ // TODO:work with promises in order to return data only when drag
+ // was successfully completed
+
+ gTrackingGlobals.m_currentSource = this ;
+ result = TrackDrag(theDrag, ev , dragRegion);
+ DisposeRgn(dragRegion);
+ DisposeDrag(theDrag);
+ gTrackingGlobals.m_currentSource = NULL ;
+
+ bool optionDown = GetCurrentKeyModifiers() & optionKey ;
+ wxDragResult dndresult = wxDragCopy ;
+ if ( flags != wxDrag_CopyOnly )
+ // on mac the option key is always the indication for copy
+ dndresult = optionDown ? wxDragCopy : wxDragMove;
+
+ return dndresult;
+}
+
+bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect)