X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f0c8f31f407ecfce909060464c0ea655221cdab..32e806fe7f0ca4ccee9924f4ded0a8be05de2b89:/src/osx/carbon/dnd.cpp diff --git a/src/osx/carbon/dnd.cpp b/src/osx/carbon/dnd.cpp index b5d299b476..5ece3e0d09 100644 --- a/src/osx/carbon/dnd.cpp +++ b/src/osx/carbon/dnd.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/dnd.cpp +// Name: src/osx/carbon/dnd.cpp // Purpose: wxDropTarget, wxDropSource implementations // Author: Stefan Csomor // Modified by: @@ -57,6 +57,12 @@ wxDragResult wxDropTarget::OnDragOver( return CurrentDragHasSupportedFormat() ? def : wxDragNone; } +wxDataFormat wxDropTarget::GetMatchingPair() +{ + wxFAIL_MSG("wxDropTarget::GetMatchingPair() not implemented in src/osx/carbon/dnd.cpp"); + return wxDF_INVALID; +} + bool wxDropTarget::OnDrop( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y) ) { if (m_dataObject == NULL) @@ -109,12 +115,7 @@ bool wxDropTarget::CurrentDragHasSupportedFormat() if ( !supported ) { - PasteboardRef pasteboard; - - if ( GetDragPasteboard( (DragReference)m_currentDrag, &pasteboard ) == noErr ) - { - supported = m_dataObject->HasDataInPasteboard( pasteboard ); - } + supported = m_dataObject->HasDataInPasteboard( m_currentDragPasteboard ); } return supported; @@ -166,12 +167,7 @@ bool wxDropTarget::GetData() if ( !transferred ) { - PasteboardRef pasteboard; - - if ( GetDragPasteboard( (DragReference)m_currentDrag, &pasteboard ) == noErr ) - { - transferred = m_dataObject->GetFromPasteboard( pasteboard ); - } + transferred = m_dataObject->GetFromPasteboard( m_currentDragPasteboard ); } return transferred; @@ -231,6 +227,7 @@ wxDragResult wxDropSource::DoDragDrop(int flags) if ((m_data == NULL) || (m_data->GetFormatCount() == 0)) return (wxDragResult)wxDragNone; +#if wxOSX_USE_CARBON DragReference theDrag; RgnHandle dragRegion; OSStatus err = noErr; @@ -305,6 +302,9 @@ wxDragResult wxDropSource::DoDragDrop(int flags) DisposeDrag( theDrag ); CFRelease( pasteboard ); gTrackingGlobals.m_currentSource = NULL; +#else + wxUnusedVar(flags); +#endif return gTrackingGlobals.m_result; } @@ -325,15 +325,18 @@ bool gTrackingGlobalsInstalled = false; // passing the globals via refcon is not needed by the CFM and later architectures anymore // but I'll leave it in there, just in case... +#if wxOSX_USE_CARBON pascal OSErr wxMacWindowDragTrackingHandler( DragTrackingMessage theMessage, WindowPtr theWindow, void *handlerRefCon, DragReference theDrag ); pascal OSErr wxMacWindowDragReceiveHandler( WindowPtr theWindow, void *handlerRefCon, DragReference theDrag ); +#endif void wxMacEnsureTrackingHandlersInstalled() { +#if wxOSX_USE_CARBON if ( !gTrackingGlobalsInstalled ) { OSStatus err; @@ -346,8 +349,10 @@ void wxMacEnsureTrackingHandlersInstalled() gTrackingGlobalsInstalled = true; } +#endif } +#if wxOSX_USE_CARBON pascal OSErr wxMacWindowDragTrackingHandler( DragTrackingMessage theMessage, WindowPtr theWindow, void *handlerRefCon, DragReference theDrag ) @@ -358,8 +363,9 @@ pascal OSErr wxMacWindowDragTrackingHandler( DragAttributes attributes; GetDragAttributes( theDrag, &attributes ); - - wxNonOwnedWindow* toplevel = wxFindWinFromMacWindow( theWindow ); + PasteboardRef pasteboard = 0; + GetDragPasteboard( theDrag, &pasteboard ); + wxNonOwnedWindow* toplevel = wxNonOwnedWindow::GetFromWXWindow( (WXWindow) theWindow ); bool optionDown = GetCurrentKeyModifiers() & optionKey; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; @@ -385,114 +391,119 @@ pascal OSErr wxMacWindowDragTrackingHandler( break; GetDragMouse( theDrag, &mouse, 0L ); - localMouse = mouse; - wxMacGlobalToLocal( theWindow, &localMouse ); - { - wxWindow *win = NULL; - ControlPartCode controlPart; - ControlRef control = FindControlUnderMouse( localMouse, theWindow, &controlPart ); - if ( control ) - win = wxFindControlFromMacControl( control ); - else - win = toplevel; - - int localx, localy; - localx = localMouse.h; - localy = localMouse.v; - - if ( win ) - win->MacRootWindowToWindow( &localx, &localy ); - if ( win != trackingGlobals->m_currentTargetWindow ) + int x = mouse.h ; + int y = mouse.v ; + toplevel->GetNonOwnedPeer()->ScreenToWindow( &x, &y ); + localMouse.h = x; + localMouse.v = y; + { - if ( trackingGlobals->m_currentTargetWindow ) - { - // this window is left - if ( trackingGlobals->m_currentTarget ) - { -#ifndef __LP64__ - HideDragHilite( theDrag ); -#endif - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ); - trackingGlobals->m_currentTarget->OnLeave(); - trackingGlobals->m_currentTarget = NULL; - trackingGlobals->m_currentTargetWindow = NULL; - } - } + wxWindow *win = NULL; + ControlPartCode controlPart; + ControlRef control = FindControlUnderMouse( localMouse, theWindow, &controlPart ); + if ( control ) + win = wxFindWindowFromWXWidget( (WXWidget) control ); + else + win = toplevel; + + int localx, localy; + localx = localMouse.h; + localy = localMouse.v; if ( win ) + win->MacRootWindowToWindow( &localx, &localy ); + if ( win != trackingGlobals->m_currentTargetWindow ) { - // this window is entered - trackingGlobals->m_currentTargetWindow = win; - trackingGlobals->m_currentTarget = win->GetDropTarget(); + if ( trackingGlobals->m_currentTargetWindow ) { + // this window is left if ( trackingGlobals->m_currentTarget ) { - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ); - result = trackingGlobals->m_currentTarget->OnEnter( localx, localy, result ); +#ifndef __LP64__ + HideDragHilite( theDrag ); +#endif + trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); + trackingGlobals->m_currentTarget->OnLeave(); + trackingGlobals->m_currentTarget = NULL; + trackingGlobals->m_currentTargetWindow = NULL; } + } - if ( result != wxDragNone ) + if ( win ) + { + // this window is entered + trackingGlobals->m_currentTargetWindow = win; + trackingGlobals->m_currentTarget = win->GetDropTarget(); { - int x, y; - - x = y = 0; - win->MacWindowToRootWindow( &x, &y ); - RgnHandle hiliteRgn = NewRgn(); - Rect r = { y, x, y + win->GetSize().y, x + win->GetSize().x }; - RectRgn( hiliteRgn, &r ); + if ( trackingGlobals->m_currentTarget ) + { + trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); + result = trackingGlobals->m_currentTarget->OnEnter( localx, localy, result ); + } + + if ( result != wxDragNone ) + { + int x, y; + + x = y = 0; + win->MacWindowToRootWindow( &x, &y ); + RgnHandle hiliteRgn = NewRgn(); + Rect r = { y, x, y + win->GetSize().y, x + win->GetSize().x }; + RectRgn( hiliteRgn, &r ); #ifndef __LP64__ - ShowDragHilite( theDrag, hiliteRgn, true ); + ShowDragHilite( theDrag, hiliteRgn, true ); #endif - DisposeRgn( hiliteRgn ); + DisposeRgn( hiliteRgn ); + } } } } - } - else - { - if ( trackingGlobals->m_currentTarget ) + else { - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ); - result = trackingGlobals->m_currentTarget->OnDragOver( localx, localy, result ); + if ( trackingGlobals->m_currentTarget ) + { + trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); + result = trackingGlobals->m_currentTarget->OnDragOver( localx, localy, result ); + } } - } - // set cursor for OnEnter and OnDragOver - if ( trackingGlobals->m_currentSource && !trackingGlobals->m_currentSource->GiveFeedback( result ) ) - { - if ( !trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) ) - { - int cursorID = wxCURSOR_NONE; - - switch (result) - { - case wxDragCopy: - cursorID = wxCURSOR_COPY_ARROW; - break; - - case wxDragMove: - cursorID = wxCURSOR_ARROW; - break; - - case wxDragNone: - cursorID = wxCURSOR_NO_ENTRY; - break; - - case wxDragError: - case wxDragLink: - case wxDragCancel: - default: - // put these here to make gcc happy - ; - } - - if (cursorID != wxCURSOR_NONE) - { - wxCursor cursor( cursorID ); - cursor.MacInstall(); - } - } + // set cursor for OnEnter and OnDragOver + if ( trackingGlobals->m_currentSource && !trackingGlobals->m_currentSource->GiveFeedback( result ) ) + { + if ( !trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) ) + { + wxStockCursor cursorID = wxCURSOR_NONE; + + switch (result) + { + case wxDragCopy: + cursorID = wxCURSOR_COPY_ARROW; + break; + + case wxDragMove: + cursorID = wxCURSOR_ARROW; + break; + + case wxDragNone: + cursorID = wxCURSOR_NO_ENTRY; + break; + + case wxDragError: + case wxDragLink: + case wxDragCancel: + default: + // put these here to make gcc happy + ; + } + + if (cursorID != wxCURSOR_NONE) + { + wxCursor cursor( cursorID ); + cursor.MacInstall(); + } + } + } } } break; @@ -503,7 +514,7 @@ pascal OSErr wxMacWindowDragTrackingHandler( if (trackingGlobals->m_currentTarget) { - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ); + trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); trackingGlobals->m_currentTarget->OnLeave(); #ifndef __LP64__ HideDragHilite( theDrag ); @@ -531,12 +542,16 @@ pascal OSErr wxMacWindowDragReceiveHandler( Point mouse, localMouse; int localx, localy; - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ); + PasteboardRef pasteboard = 0; + GetDragPasteboard( theDrag, &pasteboard ); + trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); GetDragMouse( theDrag, &mouse, 0L ); localMouse = mouse; - wxMacGlobalToLocal( theWindow, &localMouse ); localx = localMouse.h; localy = localMouse.v; + wxNonOwnedWindow* tlw = wxNonOwnedWindow::GetFromWXWindow((WXWindow) theWindow); + if ( tlw ) + tlw->GetNonOwnedPeer()->ScreenToWindow( &localx, &localy ); // TODO : should we use client coordinates? if ( trackingGlobals->m_currentTargetWindow ) @@ -557,6 +572,7 @@ pascal OSErr wxMacWindowDragReceiveHandler( return noErr; } +#endif #endif // wxUSE_DRAG_AND_DROP