+ if (!m_data)
+ return (wxDragResult) wxDragNone;
+
+ if (m_data->GetFormatCount() == 0)
+ return (wxDragResult) wxDragNone;
+
+ OSErr result;
+ DragReference theDrag;
+ RgnHandle dragRegion;
+ if ((result = NewDrag(&theDrag)))
+ {
+ 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' )
+ {
+ dataSize-- ;
+ if ( wxApp::s_macDefaultEncodingIsPC )
+ {
+ wxMacConvertFromPC((char*)dataPtr,(char*)dataPtr,dataSize) ;
+ }
+ AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);
+ }
+ else if (type == kDragFlavorTypeHFS )
+ {
+ HFSFlavor theFlavor ;
+ OSErr err = noErr;
+ CInfoPBRec cat;
+
+ wxMacFilename2FSSpec( dataPtr , &theFlavor.fileSpec ) ;
+
+ 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 ;
+
+ return wxDragCopy ;
+}
+
+bool gTrackingGlobalsInstalled = false ;
+
+// passing the globals via refcon is not needed by the CFM and later architectures anymore
+// but I'll leave it in there, just in case...
+
+pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow,
+ void *handlerRefCon, DragReference theDrag) ;
+pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow, void *handlerRefCon,
+DragReference theDrag) ;
+
+void wxMacEnsureTrackingHandlersInstalled()