]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dnd.cpp
toolbartool has to send events to parent for tooltips to work
[wxWidgets.git] / src / mac / carbon / dnd.cpp
index a96d6270da8aab4685ede7a91457c28d2cd881c5..6923ddf3e6e7df6e9c0764fd0173343ddbaa4b46 100644 (file)
 #include "wx/gdicmn.h"
 #include "wx/mac/private.h"
 
+#ifndef __DARWIN__
+    #include <Scrap.h>
+#endif
+
 // ----------------------------------------------------------------------------
 // global
 // ----------------------------------------------------------------------------
@@ -195,31 +199,45 @@ bool wxDropTarget::GetData()
                         Size dataSize ;
                         Ptr theData ;
                         GetFlavorDataSize((DragReference)m_currentDrag, theItem, theType, &dataSize);
-                        if ( theType == 'TEXT' )
+                        if ( theType == kScrapFlavorTypeText )
                         {
                             // this increment is only valid for allocating, on the next GetFlavorData
                             // call it is reset again to the original value
                             dataSize++ ;
                         }
+                        else if ( theType == kScrapFlavorTypeUnicode )
+                        {
+                            // this increment is only valid for allocating, on the next GetFlavorData
+                            // call it is reset again to the original value
+                            dataSize++ ;
+                            dataSize++ ;
+                        }
                         theData = new char[dataSize];
                         GetFlavorData((DragReference)m_currentDrag, theItem, theType, (void*) theData, &dataSize, 0L); 
-                        if( theType == 'TEXT' )
+                        if( theType == kScrapFlavorTypeText )
                         {
                             theData[dataSize]=0 ; 
-                            wxString convert = wxMacMakeStringFromCString( theData ) ;    
-                            m_dataObject->SetData( format, convert.Length() * sizeof(wxChar), (const wxChar*) convert );
+                            m_dataObject->SetData( wxDataFormat(wxDF_TEXT), dataSize , theData );
                         }
+ #if wxUSE_UNICODE
+                        else if ( theType == kScrapFlavorTypeUnicode )
+                        {
+                            theData[dataSize]=0 ; 
+                            theData[dataSize+1]=0 ; 
+                            m_dataObject->SetData( wxDataFormat(wxDF_UNICODETEXT), dataSize , theData );
+                        }
+ #endif
                         else if ( theType == kDragFlavorTypeHFS )
                         {
                             HFSFlavor* theFile = (HFSFlavor*) theData ;
                             wxString name = wxMacFSSpec2MacFilename( &theFile->fileSpec ) ;
-                            if (  firstFileAdded )
-                                ((wxFileDataObject*)m_dataObject)->AddFile( name ) ;
-                            else
+                            if ( !firstFileAdded )
                             {
-                                ((wxFileDataObject*)m_dataObject)->SetData( 0 , name.c_str() ) ;
+                                // reset file list
+                                ((wxFileDataObject*)m_dataObject)->SetData( 0 , "" ) ;
                                 firstFileAdded = true ;    
                             }
+                            ((wxFileDataObject*)m_dataObject)->AddFile( name ) ;
                         }
                         else
                         {
@@ -302,7 +320,7 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
             dataSize-- ;
             dataPtr[ dataSize ] = 0 ;
             wxString st( (wxChar*) dataPtr ) ;
-            wxCharBuffer buf = wxMacStringToCString( st ) ;
+            wxCharBuffer buf = st.mb_str( wxConvLocal) ;
             AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0);
         }
         else if (type == kDragFlavorTypeHFS )
@@ -311,7 +329,7 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
             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;
@@ -379,7 +397,7 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
     gTrackingGlobals.m_currentSource = NULL ;
     
     KeyMap keymap;
-    GetKeys((BigEndianLong*)&keymap);
+    GetKeys(keymap);
     bool optionDown = keymap[1] & 4;
     wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove;
     return dndresult;
@@ -435,7 +453,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
     wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; 
 
     KeyMap keymap;
-    GetKeys((BigEndianLong*)&keymap);
+    GetKeys(keymap);
     bool optionDown = keymap[1] & 4;
     wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
 
@@ -463,7 +481,12 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
             {
                 wxPoint point(localMouse.h , localMouse.v) ;
                 wxWindow *win = NULL ;
-                toplevel->MacGetWindowFromPointSub( point , &win ) ;
+                ControlPartCode controlPart ;
+                ControlRef control = wxMacFindControlUnderMouse( localMouse ,
+                    theWindow , &controlPart ) ;
+                if ( control )
+                    win = wxFindControlFromMacControl( control ) ;
+                // TODO toplevel->MacGetWindowFromPointSub( point , &win ) ;
                 int localx , localy ;
                 localx = localMouse.h ;
                 localy = localMouse.v ;
@@ -505,7 +528,8 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
                                 x = y = 0 ;
                                 win->MacWindowToRootWindow( &x , &y ) ;
                                 RgnHandle hiliteRgn = NewRgn() ;
-                                SetRectRgn( hiliteRgn , x , y , x+win->GetSize().x ,y+win->GetSize().y) ;
+                                Rect r = { y , x , y+win->GetSize().y , x+win->GetSize().x } ;
+                                RectRgn( hiliteRgn , &r ) ;
                                 ShowDragHilite(theDrag, hiliteRgn, true);
                                 DisposeRgn( hiliteRgn ) ;
                             }
@@ -527,27 +551,33 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind
                 {
                   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 :
+                      switch( result )
                       {
-                        wxCursor cursor(wxCURSOR_NO_ENTRY) ;
-                        cursor.MacInstall() ;
+                          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
+                              ;
                       }
-                      break ;
-                    }
                   }
                 }
                 
@@ -590,7 +620,7 @@ pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow,
         if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) )
         {
             KeyMap keymap;
-            GetKeys((BigEndianLong*)&keymap);
+            GetKeys(keymap);
             bool optionDown = keymap[1] & 4;
             wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
             trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ;