X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..8471ea90331c42693823ede04ded5fd4d5bf008b:/src/mac/dnd.cpp diff --git a/src/mac/dnd.cpp b/src/mac/dnd.cpp index b9df2ac004..22ced39ede 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( theData , wxConvLocal ) ; + m_dataObject->SetData( format, convert.Length() * sizeof(wxChar), (const wxChar*) convert ); } else if ( theType == kDragFlavorTypeHFS ) { @@ -246,9 +243,10 @@ bool wxDropTarget::GetData() // drag request wxDropSource::wxDropSource(wxWindow *win, - const wxIcon &iconCopy, - const wxIcon &iconMove, - const wxIcon &iconNone) + const wxCursor &cursorCopy, + const wxCursor &cursorMove, + const wxCursor &cursorStop) + : wxDropSourceBase(cursorCopy, cursorMove, cursorStop) { wxMacEnsureTrackingHandlersInstalled() ; m_window = win; @@ -256,9 +254,10 @@ wxDropSource::wxDropSource(wxWindow *win, wxDropSource::wxDropSource(wxDataObject& data, wxWindow *win, - const wxIcon &iconCopy, - const wxIcon &iconMove, - const wxIcon &iconNone) + const wxCursor &cursorCopy, + const wxCursor &cursorMove, + const wxCursor &cursorStop) + : wxDropSourceBase(cursorCopy, cursorMove, cursorStop) { wxMacEnsureTrackingHandlersInstalled() ; SetData( data ); @@ -301,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 = st.mb_str( wxConvLocal) ; + AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0); } else if (type == kDragFlavorTypeHFS ) { @@ -380,7 +378,26 @@ 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) +{ + const wxCursor& cursor = GetCursor(effect); + if ( cursor.Ok() ) + { + cursor.MacInstall() ; + + return TRUE; + } + else + { + return FALSE; + } } bool gTrackingGlobalsInstalled = false ; @@ -416,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: @@ -433,6 +456,8 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind GetDragMouse(theDrag, &mouse, 0L); localMouse = mouse; GlobalToLocal(&localMouse); + + // if (attributes & kDragHasLeftSenderWindow) { @@ -464,19 +489,25 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind // this window is entered trackingGlobals->m_currentTargetWindow = win ; trackingGlobals->m_currentTarget = win->GetDropTarget() ; - if ( trackingGlobals->m_currentTarget ) { - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; - if ( trackingGlobals->m_currentTarget->OnEnter( - localx , localy , wxDragCopy ) != wxDragNone ) + + if ( trackingGlobals->m_currentTarget ) + { + trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; + result = trackingGlobals->m_currentTarget->OnEnter( + localx , localy , result ) ; + } + + + if ( result != wxDragNone ) { - int x , y ; - x = y = 0 ; - win->MacWindowToRootWindow( &x , &y ) ; - RgnHandle hiliteRgn = NewRgn() ; - SetRectRgn( hiliteRgn , x , y , x+win->GetSize().x ,y+win->GetSize().y) ; - ShowDragHilite(theDrag, hiliteRgn, true); - DisposeRgn( hiliteRgn ) ; + int x , y ; + x = y = 0 ; + win->MacWindowToRootWindow( &x , &y ) ; + RgnHandle hiliteRgn = NewRgn() ; + SetRectRgn( hiliteRgn , x , y , x+win->GetSize().x ,y+win->GetSize().y) ; + ShowDragHilite(theDrag, hiliteRgn, true); + DisposeRgn( hiliteRgn ) ; } } } @@ -487,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); @@ -529,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);