X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/489468feaa08b8f504735eecca522fb8d0f825d2..78a17075019ea5bed5085d3afeb822c47d77a82c:/src/osx/carbon/dnd.cpp diff --git a/src/osx/carbon/dnd.cpp b/src/osx/carbon/dnd.cpp index 11709e12ce..29b9965bcc 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: @@ -21,7 +21,7 @@ #include "wx/gdicmn.h" #endif // WX_PRECOMP -#include "wx/mac/private.h" +#include "wx/osx/private.h" // ---------------------------------------------------------------------------- // globals @@ -40,150 +40,29 @@ MacTrackingGlobals gTrackingGlobals; void wxMacEnsureTrackingHandlersInstalled(); -//---------------------------------------------------------------------------- -// wxDropTarget -//---------------------------------------------------------------------------- - -wxDropTarget::wxDropTarget( wxDataObject *data ) - : wxDropTargetBase( data ) -{ - wxMacEnsureTrackingHandlersInstalled(); -} - -wxDragResult wxDropTarget::OnDragOver( - wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), - wxDragResult def ) -{ - return CurrentDragHasSupportedFormat() ? def : wxDragNone; -} - -bool wxDropTarget::OnDrop( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y) ) -{ - if (m_dataObject == NULL) - return false; - - return CurrentDragHasSupportedFormat(); -} - -wxDragResult wxDropTarget::OnData( - wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), - wxDragResult def ) +OSStatus wxMacPromiseKeeper(PasteboardRef WXUNUSED(inPasteboard), + PasteboardItemID WXUNUSED(inItem), + CFStringRef WXUNUSED(inFlavorType), + void * WXUNUSED(inContext)) { - if (m_dataObject == NULL) - return wxDragNone; + OSStatus err = noErr; - if (!CurrentDragHasSupportedFormat()) - return wxDragNone; + // we might add promises here later, inContext is the wxDropSource* - return GetData() ? def : wxDragNone; + return err; } -bool wxDropTarget::CurrentDragHasSupportedFormat() +wxDropTarget::wxDropTarget( wxDataObject *data ) + : wxDropTargetBase( data ) { - bool supported = false; - if (m_dataObject == NULL) - return false; - - if ( gTrackingGlobals.m_currentSource != NULL ) - { - wxDataObject* data = gTrackingGlobals.m_currentSource->GetDataObject(); - - if ( data ) - { - size_t formatcount = data->GetFormatCount(); - wxDataFormat *array = new wxDataFormat[formatcount]; - data->GetAllFormats( array ); - for (size_t i = 0; !supported && i < formatcount; i++) - { - wxDataFormat format = array[i]; - if ( m_dataObject->IsSupported( format ) ) - { - supported = true; - break; - } - } - - delete [] array; - } - } - - if ( !supported ) - { - PasteboardRef pasteboard; - - if ( GetDragPasteboard( (DragReference)m_currentDrag, &pasteboard ) == noErr ) - { - supported = m_dataObject->HasDataInPasteboard( pasteboard ); - } - } - - return supported; + wxMacEnsureTrackingHandlersInstalled(); } -bool wxDropTarget::GetData() -{ - if (m_dataObject == NULL) - return false; - - if ( !CurrentDragHasSupportedFormat() ) - return false; - - bool transferred = false; - if ( gTrackingGlobals.m_currentSource != NULL ) - { - wxDataObject* data = gTrackingGlobals.m_currentSource->GetDataObject(); - - if (data != NULL) - { - size_t formatcount = data->GetFormatCount(); - wxDataFormat *array = new wxDataFormat[formatcount]; - data->GetAllFormats( array ); - for (size_t i = 0; !transferred && i < formatcount; i++) - { - wxDataFormat format = array[i]; - if ( m_dataObject->IsSupported( format ) ) - { - int size = data->GetDataSize( format ); - transferred = true; - - if (size == 0) - { - m_dataObject->SetData( format, 0, 0 ); - } - else - { - char *d = new char[size]; - data->GetDataHere( format, (void*)d ); - m_dataObject->SetData( format, size, d ); - delete [] d; - } - } - } - - delete [] array; - } - } - - if ( !transferred ) - { - PasteboardRef pasteboard; - - if ( GetDragPasteboard( (DragReference)m_currentDrag, &pasteboard ) == noErr ) - { - transferred = m_dataObject->GetFromPasteboard( pasteboard ); - } - } - - return transferred; -} //------------------------------------------------------------------------- // wxDropSource //------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// drag request - wxDropSource::wxDropSource(wxWindow *win, const wxCursor &cursorCopy, const wxCursor &cursorMove, @@ -195,6 +74,11 @@ wxDropSource::wxDropSource(wxWindow *win, m_window = win; } +wxDropSource* wxDropSource::GetCurrentDropSource() +{ + return gTrackingGlobals.m_currentSource; +} + wxDropSource::wxDropSource(wxDataObject& data, wxWindow *win, const wxCursor &cursorCopy, @@ -208,22 +92,6 @@ wxDropSource::wxDropSource(wxDataObject& data, m_window = win; } -wxDropSource::~wxDropSource() -{ -} - -OSStatus wxMacPromiseKeeper(PasteboardRef WXUNUSED(inPasteboard), - PasteboardItemID WXUNUSED(inItem), - CFStringRef WXUNUSED(inFlavorType), - void * WXUNUSED(inContext)) -{ - OSStatus err = noErr; - - // we might add promises here later, inContext is the wxDropSource* - - return err; -} - wxDragResult wxDropSource::DoDragDrop(int flags) { wxASSERT_MSG( m_data, wxT("Drop source: no data") ); @@ -309,17 +177,6 @@ wxDragResult wxDropSource::DoDragDrop(int flags) return gTrackingGlobals.m_result; } -bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect) -{ - const wxCursor& cursor = GetCursor(effect); - bool result = cursor.Ok(); - - if ( result ) - cursor.MacInstall(); - - return result; -} - bool gTrackingGlobalsInstalled = false; // passing the globals via refcon is not needed by the CFM and later architectures anymore @@ -358,8 +215,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 +243,115 @@ 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 ); + HideDragHilite( theDrag ); + 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 ); -#ifndef __LP64__ - ShowDragHilite( theDrag, hiliteRgn, true ); -#endif - DisposeRgn( hiliteRgn ); + 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 ); + ShowDragHilite( theDrag, hiliteRgn, true ); + 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,11 +362,9 @@ 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 ); -#endif trackingGlobals->m_currentTarget = NULL; } trackingGlobals->m_currentTargetWindow = NULL; @@ -531,12 +388,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 )