]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dnd.cpp
Font (possible) fix
[wxWidgets.git] / src / mac / carbon / dnd.cpp
index 0b3c2dcc979365f86fc6889df678098219cc84c0..49e61ac1098cf923c48dc6286110201c4ecbebb4 100644 (file)
@@ -6,14 +6,10 @@
 // Created:     1998-01-01
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Stefan Csomor
 // Created:     1998-01-01
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Stefan Csomor
-// Licence:     wxWidgets licence
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "dnd.h"
-#endif
-
-#include "wx/defs.h"
+#include "wx/wxprec.h"
 
 #if wxUSE_DRAG_AND_DROP
 
 
 #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 ) ;
             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) ;
             for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
             {
                 result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
                 wxDataFormat format(theType) ;
-                if ( m_dataObject->IsSupportedFormat( format ) )
+                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 ( (hasPreferredFormat && format==preferredFormat) || (!hasPreferredFormat && m_dataObject->IsSupportedFormat( format )))
                 {
                     FlavorFlags theFlags;
                     result = GetFlavorFlags((DragReference)m_currentDrag, theItem, theType, &theFlags);
                 {
                     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") );
     
 {
     wxASSERT_MSG( m_data, wxT("Drop source: no data") );
     
@@ -315,13 +325,18 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
         Ptr dataPtr = new char[dataSize] ;
         m_data->GetDataHere( formats[i] , dataPtr ) ;
         OSType type = formats[i].GetFormatId() ;
         Ptr dataPtr = new char[dataSize] ;
         m_data->GetDataHere( formats[i] , dataPtr ) ;
         OSType type = formats[i].GetFormatId() ;
-        if ( type == 'TEXT' )
+        if ( type == 'TEXT' || type == 'utxt' )
         {
         {
-            dataSize-- ;
+            if ( dataSize > 0 )
+                dataSize-- ;
             dataPtr[ dataSize ] = 0 ;
             dataPtr[ dataSize ] = 0 ;
-            wxString st( (wxChar*) dataPtr ) ;
-            wxCharBuffer buf = st.mb_str( wxConvLocal) ;
-            AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0);
+            if ( type == 'utxt' )
+            {
+                if ( dataSize > 0 )
+                    dataSize-- ;
+                dataPtr[ dataSize ] = 0 ;
+            }
+            AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);      
         }
         else if (type == kDragFlavorTypeHFS )
         {
         }
         else if (type == kDragFlavorTypeHFS )
         {
@@ -329,7 +344,7 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
             OSErr err = noErr;
             CInfoPBRec cat;
             
             OSErr err = noErr;
             CInfoPBRec cat;
             
-            wxMacFilename2FSSpec( dataPtr , &theFlavor.fileSpec ) ;
+            wxMacFilename2FSSpec( wxString( dataPtr , *wxConvCurrent ) , &theFlavor.fileSpec ) ;
             
             cat.hFileInfo.ioNamePtr = theFlavor.fileSpec.name;
             cat.hFileInfo.ioVRefNum = theFlavor.fileSpec.vRefNum;
             
             cat.hFileInfo.ioNamePtr = theFlavor.fileSpec.name;
             cat.hFileInfo.ioVRefNum = theFlavor.fileSpec.vRefNum;
@@ -396,10 +411,13 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
     DisposeDrag(theDrag);
     gTrackingGlobals.m_currentSource = NULL ;
     
     DisposeDrag(theDrag);
     gTrackingGlobals.m_currentSource = NULL ;
     
-    KeyMap keymap;
-    GetKeys(keymap);
-    bool optionDown = keymap[1] & 4;
-    wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove;
+    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;
 }
 
     return dndresult;
 }
 
@@ -452,9 +470,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
     GetDragAttributes(theDrag, &attributes);
     wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; 
 
     GetDragAttributes(theDrag, &attributes);
     wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; 
 
-    KeyMap keymap;
-    GetKeys(keymap);
-    bool optionDown = keymap[1] & 4;
+    bool optionDown = GetCurrentKeyModifiers() & optionKey ;
     wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
 
     switch(theMessage) 
     wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
 
     switch(theMessage) 
@@ -477,20 +493,20 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
 
 
             
 
 
             
-//            if (attributes & kDragHasLeftSenderWindow) 
             {
             {
-                wxPoint point(localMouse.h , localMouse.v) ;
                 wxWindow *win = NULL ;
                 ControlPartCode controlPart ;
                 wxWindow *win = NULL ;
                 ControlPartCode controlPart ;
-                ControlRef control = wxMacFindControlUnderMouse( localMouse ,
+                ControlRef control = wxMacFindControlUnderMouse( toplevel , localMouse ,
                     theWindow , &controlPart ) ;
                 if ( control )
                     win = wxFindControlFromMacControl( control ) ;
                     theWindow , &controlPart ) ;
                 if ( control )
                     win = wxFindControlFromMacControl( control ) ;
-                // TODO toplevel->MacGetWindowFromPointSub( point , &win ) ;
+                else
+                    win = toplevel ;
+                
                 int localx , localy ;
                 localx = localMouse.h ;
                 localy = localMouse.v ;
                 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 )
                 if ( win )
                     win->MacRootWindowToWindow( &localx , &localy ) ;
                 if ( win != trackingGlobals->m_currentTargetWindow )
@@ -581,8 +597,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
                   }
                 }
                 
                   }
                 }
                 
-          }
-            // MyTrackItemUnderMouse(localMouse, theWindow);
+            }
             break;
         case kDragTrackingLeaveWindow:
             if (trackingGlobals->m_currentTarget) 
             break;
         case kDragTrackingLeaveWindow:
             if (trackingGlobals->m_currentTarget) 
@@ -619,9 +634,7 @@ pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow,
             trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ;
         if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) )
         {
             trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ;
         if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) )
         {
-            KeyMap keymap;
-            GetKeys(keymap);
-            bool optionDown = keymap[1] & 4;
+            bool optionDown = GetCurrentKeyModifiers() & optionKey ;
             wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
             trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ;
         }
             wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
             trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ;
         }