]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dnd.cpp
patch 1306473
[wxWidgets.git] / src / mac / carbon / dnd.cpp
index 52b0cbbf9043e0df8d651a045a48260e08f66c83..49e61ac1098cf923c48dc6286110201c4ecbebb4 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "dnd.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #if wxUSE_DRAG_AND_DROP
@@ -186,11 +182,25 @@ bool wxDropTarget::GetData()
             UInt16 flavors = 0 ;
             GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);
             CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;
+            bool hasPreferredFormat = false ;
+            wxDataFormat preferredFormat = m_dataObject->GetPreferredFormat( wxDataObject::Set ) ;
+            
+            for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
+            {
+                result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
+                wxDataFormat format(theType) ;
+                if ( preferredFormat == format )
+                {
+                    hasPreferredFormat = true ;
+                    break ;
+                }
+            }
+            
             for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
             {
                 result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
                 wxDataFormat format(theType) ;
-                if ( m_dataObject->IsSupportedFormat( format ) )
+                if ( (hasPreferredFormat && format==preferredFormat) || (!hasPreferredFormat && m_dataObject->IsSupportedFormat( format )))
                 {
                     FlavorFlags theFlags;
                     result = GetFlavorFlags((DragReference)m_currentDrag, theItem, theType, &theFlags);
@@ -287,7 +297,7 @@ wxDropSource::~wxDropSource()
 }
 
 
-wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
+wxDragResult wxDropSource::DoDragDrop(int flags)
 {
     wxASSERT_MSG( m_data, wxT("Drop source: no data") );
     
@@ -402,7 +412,12 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
     gTrackingGlobals.m_currentSource = NULL ;
     
     bool optionDown = GetCurrentKeyModifiers() & optionKey ;
-    wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove;
+    wxDragResult dndresult = wxDragCopy ;
+    if ( flags != wxDrag_CopyOnly ) 
+    {
+        // on mac the option key is always the indication for copy
+        dndresult = optionDown ? wxDragCopy : wxDragMove;
+    }
     return dndresult;
 }
 
@@ -478,20 +493,20 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
 
 
             
-//            if (attributes & kDragHasLeftSenderWindow) 
             {
-//                wxPoint point(localMouse.h , localMouse.v) ;
                 wxWindow *win = NULL ;
                 ControlPartCode controlPart ;
                 ControlRef control = wxMacFindControlUnderMouse( toplevel , localMouse ,
                     theWindow , &controlPart ) ;
                 if ( control )
                     win = wxFindControlFromMacControl( control ) ;
-                // TODO toplevel->MacGetWindowFromPointSub( point , &win ) ;
+                else
+                    win = toplevel ;
+                
                 int localx , localy ;
                 localx = localMouse.h ;
                 localy = localMouse.v ;
-                //TODO : should we use client coordinates
+
                 if ( win )
                     win->MacRootWindowToWindow( &localx , &localy ) ;
                 if ( win != trackingGlobals->m_currentTargetWindow )
@@ -582,8 +597,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
                   }
                 }
                 
-          }
-            // MyTrackItemUnderMouse(localMouse, theWindow);
+            }
             break;
         case kDragTrackingLeaveWindow:
             if (trackingGlobals->m_currentTarget)