X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da804130ba446bd9dcc81a843b8bb1dd1c662e52..6444e22daa9f3ff357ea57d3f18fb92fec24d003:/src/mac/dnd.cpp

diff --git a/src/mac/dnd.cpp b/src/mac/dnd.cpp
index 2ea8ae7c90..8372417d08 100644
--- a/src/mac/dnd.cpp
+++ b/src/mac/dnd.cpp
@@ -205,12 +205,9 @@ bool wxDropTarget::GetData()
                         GetFlavorData((DragReference)m_currentDrag, theItem, theType, (void*) theData, &dataSize, 0L); 
                         if( theType == 'TEXT' )
                         {
-                            theData[dataSize]=0 ;       
-                            if ( wxApp::s_macDefaultEncodingIsPC )
-                            {
-                                wxMacConvertToPC((char*)theData,(char*)theData,dataSize) ;
-                            }
-                            m_dataObject->SetData( format, dataSize, theData );
+                            theData[dataSize]=0 ; 
+                            wxString convert = wxMacMakeStringFromCString( theData ) ;    
+                            m_dataObject->SetData( format, convert.Length() * sizeof(wxChar), (const wxChar*) convert );
                         }
                         else if ( theType == kDragFlavorTypeHFS )
                         {
@@ -303,11 +300,10 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
         if ( type == 'TEXT' )
         {
             dataSize-- ;
-            if ( wxApp::s_macDefaultEncodingIsPC )
-            {
-                wxMacConvertFromPC((char*)dataPtr,(char*)dataPtr,dataSize) ;
-            }
-            AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);
+            dataPtr[ dataSize ] = 0 ;
+            wxString st( (wxChar*) dataPtr ) ;
+            wxCharBuffer buf = wxMacStringToCString( st ) ;
+            AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0);
         }
         else if (type == kDragFlavorTypeHFS )
         {
@@ -382,7 +378,11 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
     DisposeDrag(theDrag);
     gTrackingGlobals.m_currentSource = NULL ;
     
-    return wxDragCopy ;
+    KeyMap keymap;
+    GetKeys(keymap);
+    bool optionDown = keymap[1] & 4;
+    wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove;
+    return dndresult;
 }
 
 bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect)
@@ -433,6 +433,12 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
     DragAttributes attributes;
     GetDragAttributes(theDrag, &attributes);
     wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; 
+
+    KeyMap keymap;
+    GetKeys(keymap);
+    bool optionDown = keymap[1] & 4;
+    wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
+
     switch(theMessage) 
     {
         case kDragTrackingEnterHandler:
@@ -450,6 +456,8 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
             GetDragMouse(theDrag, &mouse, 0L);
             localMouse = mouse;
             GlobalToLocal(&localMouse);
+
+
             
 //            if (attributes & kDragHasLeftSenderWindow) 
             {
@@ -482,41 +490,14 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
                         trackingGlobals->m_currentTargetWindow = win ;
                         trackingGlobals->m_currentTarget = win->GetDropTarget() ;
                         {
-                        	wxDragResult result = wxDragNone ;
+
                         	if ( trackingGlobals->m_currentTarget )
                         	{
                             	trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
                             	result = trackingGlobals->m_currentTarget->OnEnter(
-                                	localx , localy , wxDragCopy ) ;
+                                	localx , localy , result ) ;
                             }
                                 
-                            if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE )
-                            {
-                            	if ( trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) == FALSE )
-                            	{
-                            		switch( result )
-                            		{
-                            			case wxDragCopy :
-                            			{
-                            				wxCursor cursor(wxCURSOR_COPY_ARROW) ;
-                            				cursor.MacInstall() ;
-                            			}
-                            			break ;
-                            			case wxDragMove :
-                            			{
-                             				wxCursor cursor(wxCURSOR_ARROW) ;
-                            				cursor.MacInstall() ;
-                           			    }
-                            			break ;
-                            			case wxDragNone :
-                            			{
-                            				wxCursor cursor(wxCURSOR_NO_ENTRY) ;
-                            				cursor.MacInstall() ;
-                            			}
-                            			break ;
-                            		}
-                            	}
-                            }
                            
                             if ( result != wxDragNone )
                             {
@@ -537,9 +518,44 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
                     {
                         trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
                         trackingGlobals->m_currentTarget->OnDragOver(
-                            localx , localy , wxDragCopy ) ;
+                            localx , localy , result ) ;
                     }
                 }
+
+                // set cursor for OnEnter and OnDragOver
+                if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE )
+                {
+                  if ( trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) == FALSE )
+                  {
+                      switch( result )
+                      {
+                          case wxDragCopy :
+                              {
+                                  wxCursor cursor(wxCURSOR_COPY_ARROW) ;
+                                  cursor.MacInstall() ;
+                              }
+                              break ;
+                          case wxDragMove :
+                              {
+                                  wxCursor cursor(wxCURSOR_ARROW) ;
+                                  cursor.MacInstall() ;
+                              }
+                              break ;
+                          case wxDragNone :
+                              {
+                                  wxCursor cursor(wxCURSOR_NO_ENTRY) ;
+                                  cursor.MacInstall() ;
+                              }
+                              break ;
+
+                          case wxDragError:
+                          case wxDragLink:
+                          case wxDragCancel:
+                              // put these here to make gcc happy
+                              ;
+                      }
+                  }
+                }
                 
           }
             // MyTrackItemUnderMouse(localMouse, theWindow);
@@ -579,7 +595,11 @@ pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow,
             trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ;
         if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) )
         {
-            trackingGlobals->m_currentTarget->OnData( localx , localy , wxDragCopy ) ;
+            KeyMap keymap;
+            GetKeys(keymap);
+            bool optionDown = keymap[1] & 4;
+            wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
+            trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ;
         }
     }
     return(noErr);