]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dnd.cpp
Fix client data handling: delete client data for all items when a
[wxWidgets.git] / src / mac / carbon / dnd.cpp
index a2059478e08f06f57bc1af75e5715b340e9c46f7..09a2f1d373bf30020cfff089809972dccbfac453 100644 (file)
 #pragma implementation "dnd.h"
 #endif
 
+#include "wx/defs.h"
+
+#if wxUSE_DRAG_AND_DROP
+
 #include "wx/dnd.h"
 #include "wx/window.h"
+#include "wx/toplevel.h"
 #include "wx/app.h"
 #include "wx/gdicmn.h"
-
-#if wxUSE_DRAG_AND_DROP
+#include "wx/mac/private.h"
 
 // ----------------------------------------------------------------------------
 // global
@@ -82,7 +86,7 @@ bool wxDropTarget::CurrentDragHasSupportedFormat()
       
       if ( data )
       {
-        int formatcount = data->GetFormatCount() ;
+        size_t formatcount = data->GetFormatCount() ;
         wxDataFormat *array = new wxDataFormat[ formatcount  ];
         data->GetAllFormats( array );
         for (size_t i = 0; !supported && i < formatcount ; i++)
@@ -101,17 +105,17 @@ bool wxDropTarget::CurrentDragHasSupportedFormat()
     {
       UInt16 items ;
       OSErr result;
-      CountDragItems(m_currentDrag, &items);
+      CountDragItems((DragReference)m_currentDrag, &items);
       for (UInt16 index = 1; index <= items && supported == false ; ++index) 
       {
           ItemReference theItem;
           FlavorType theType ;
           UInt16 flavors = 0 ;
-          GetDragItemReferenceNumber(m_currentDrag, index, &theItem);
-          CountDragItemFlavors( m_currentDrag, theItem , &flavors ) ;
+          GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);
+          CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;
           for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
           {
-            result = GetFlavorType(m_currentDrag, theItem, flavor , &theType);
+            result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
             if ( m_dataObject->IsSupportedFormat( wxDataFormat( theType ) ) )
             {
               supported = true ;
@@ -138,7 +142,7 @@ bool wxDropTarget::GetData()
       
       if ( data )
       {
-        int formatcount = data->GetFormatCount() ;
+        size_t formatcount = data->GetFormatCount() ;
         wxDataFormat *array = new wxDataFormat[ formatcount  ];
         data->GetAllFormats( array );
         for (size_t i = 0; !transferred && i < formatcount ; i++)
@@ -169,37 +173,41 @@ bool wxDropTarget::GetData()
     {
       UInt16 items ;
       OSErr result;
-      CountDragItems(m_currentDrag, &items);
+      CountDragItems((DragReference)m_currentDrag, &items);
       for (UInt16 index = 1; index <= items; ++index) 
       {
           ItemReference theItem;
           FlavorType theType ;
           UInt16 flavors = 0 ;
-          GetDragItemReferenceNumber(m_currentDrag, index, &theItem);
-          CountDragItemFlavors( m_currentDrag, theItem , &flavors ) ;
+          GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);
+          CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;
           for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
           {
-            result = GetFlavorType(m_currentDrag, theItem, flavor , &theType);
+            result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
             wxDataFormat format(theType) ;
             if ( m_dataObject->IsSupportedFormat( format ) )
             {
               FlavorFlags theFlags;
-              result = GetFlavorFlags(m_currentDrag, theItem, theType, &theFlags);
+              result = GetFlavorFlags((DragReference)m_currentDrag, theItem, theType, &theFlags);
               if (result == noErr) 
               {
                   Size dataSize ;
                   Ptr theData ;
-                  GetFlavorDataSize(m_currentDrag, theItem, theType, &dataSize);
-                                 if ( theType == 'TEXT' )
-                                   dataSize++ ;
+                  GetFlavorDataSize((DragReference)m_currentDrag, theItem, theType, &dataSize);
+                         if ( theType == 'TEXT' )
+                         {
+                               // this increment is only valid for allocating, on the next GetFlavorData
+                               // call it is reset again to the original value
+                           dataSize++ ;
+                         }
                   theData = new char[dataSize];
-                  GetFlavorData(m_currentDrag, theItem, theType, (void*) theData, &dataSize, 0L); 
+                  GetFlavorData((DragReference)m_currentDrag, theItem, theType, (void*) theData, &dataSize, 0L); 
                   if( theType == 'TEXT' )
                   {
                     theData[dataSize]=0 ;       
                     if ( wxApp::s_macDefaultEncodingIsPC )
                     {
-                      wxMacConvertToPC((char*)theData) ;
+                      wxMacConvertToPC((char*)theData,(char*)theData,dataSize) ;
                     }
                     m_dataObject->SetData( format, dataSize, theData );
                   }
@@ -207,7 +215,7 @@ bool wxDropTarget::GetData()
                   {
                     HFSFlavor* theFile = (HFSFlavor*) theData ;
                     wxString name = wxMacFSSpec2MacFilename( &theFile->fileSpec ) ;
-                    m_dataObject->SetData( format , name.Length() + 1, name ) ;
+                    ((wxFileDataObject*)m_dataObject)->AddFile( name ) ;
                   }
                   else
                   {
@@ -255,7 +263,7 @@ wxDropSource::~wxDropSource()
 }
 
 
-wxDragResult wxDropSource::DoDragDrop( bool allowMove )
+wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
 {
     wxASSERT_MSG( m_data, wxT("Drop source: no data") );
 
@@ -268,7 +276,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove )
     OSErr result;
     DragReference theDrag;
     RgnHandle dragRegion;
-    if (result = NewDrag(&theDrag)) 
+    if ((result = NewDrag(&theDrag)))
     {
         return wxDragNone ;
     }
@@ -277,7 +285,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove )
     wxDataFormat *formats = new wxDataFormat[formatCount] ;
     m_data->GetAllFormats( formats ) ;
     ItemReference theItem = 1 ;
-    for ( int i = 0 ; i < formatCount ; ++i )
+    for ( size_t i = 0 ; i < formatCount ; ++i )
     {
         size_t dataSize = m_data->GetDataSize( formats[i] ) ;
         Ptr dataPtr = new char[dataSize] ;
@@ -288,7 +296,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove )
           dataSize-- ;
           if ( wxApp::s_macDefaultEncodingIsPC )
           {
-            wxMacConvertFromPC((char*)dataPtr) ;
+            wxMacConvertFromPC((char*)dataPtr,(char*)dataPtr,dataSize) ;
           }
           AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);
         }
@@ -332,7 +340,14 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove )
     dragRegion = NewRgn();
     RgnHandle tempRgn = NewRgn() ;
     
-    EventRecord* ev = wxTheApp->MacGetCurrentEvent() ;
+    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 ;
     
@@ -392,7 +407,6 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
     MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon;
     Point mouse, localMouse;
     DragAttributes attributes;
-    RgnHandle hiliteRgn;
     GetDragAttributes(theDrag, &attributes);
     wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; 
     switch(theMessage) 
@@ -487,8 +501,9 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
     return(noErr);
 }
 
-pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow, void *handlerRefCon,
-DragReference theDrag)
+pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow,
+                                           void *handlerRefCon,
+                                           DragReference theDrag)
 { 
     MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon;
     if ( trackingGlobals->m_currentTarget )