X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/02becaf4b2665bd428f13404e1cbe2b919be598c..2ddb4d13585d5235556119fb1937273da9e433a3:/src/mac/carbon/dnd.cpp diff --git a/src/mac/carbon/dnd.cpp b/src/mac/carbon/dnd.cpp index d2b1702e91..49e61ac109 100644 --- a/src/mac/carbon/dnd.cpp +++ b/src/mac/carbon/dnd.cpp @@ -9,10 +9,6 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "dnd.h" -#endif - #include "wx/wxprec.h" #if wxUSE_DRAG_AND_DROP @@ -186,11 +182,25 @@ bool wxDropTarget::GetData() UInt16 flavors = 0 ; GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem); CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ; + bool hasPreferredFormat = false ; + wxDataFormat preferredFormat = m_dataObject->GetPreferredFormat( wxDataObject::Set ) ; + for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor ) { result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType); wxDataFormat format(theType) ; - if ( m_dataObject->IsSupportedFormat( format ) ) + if ( preferredFormat == format ) + { + hasPreferredFormat = true ; + break ; + } + } + + for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor ) + { + result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType); + wxDataFormat format(theType) ; + if ( (hasPreferredFormat && format==preferredFormat) || (!hasPreferredFormat && m_dataObject->IsSupportedFormat( format ))) { FlavorFlags theFlags; result = GetFlavorFlags((DragReference)m_currentDrag, theItem, theType, &theFlags); @@ -287,7 +297,7 @@ wxDropSource::~wxDropSource() } -wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) +wxDragResult wxDropSource::DoDragDrop(int flags) { wxASSERT_MSG( m_data, wxT("Drop source: no data") ); @@ -315,13 +325,18 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) Ptr dataPtr = new char[dataSize] ; m_data->GetDataHere( formats[i] , dataPtr ) ; OSType type = formats[i].GetFormatId() ; - if ( type == 'TEXT' ) + if ( type == 'TEXT' || type == 'utxt' ) { - dataSize-- ; + if ( dataSize > 0 ) + dataSize-- ; dataPtr[ dataSize ] = 0 ; - wxString st( (wxChar*) dataPtr ) ; - wxCharBuffer buf = st.mb_str( wxConvLocal) ; - AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0); + if ( type == 'utxt' ) + { + if ( dataSize > 0 ) + dataSize-- ; + dataPtr[ dataSize ] = 0 ; + } + AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0); } else if (type == kDragFlavorTypeHFS ) { @@ -397,7 +412,12 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) gTrackingGlobals.m_currentSource = NULL ; bool optionDown = GetCurrentKeyModifiers() & optionKey ; - wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove; + wxDragResult dndresult = wxDragCopy ; + if ( flags != wxDrag_CopyOnly ) + { + // on mac the option key is always the indication for copy + dndresult = optionDown ? wxDragCopy : wxDragMove; + } return dndresult; } @@ -473,20 +493,20 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind -// if (attributes & kDragHasLeftSenderWindow) { -// wxPoint point(localMouse.h , localMouse.v) ; wxWindow *win = NULL ; ControlPartCode controlPart ; ControlRef control = wxMacFindControlUnderMouse( toplevel , localMouse , theWindow , &controlPart ) ; if ( control ) win = wxFindControlFromMacControl( control ) ; - // TODO toplevel->MacGetWindowFromPointSub( point , &win ) ; + else + win = toplevel ; + int localx , localy ; localx = localMouse.h ; localy = localMouse.v ; - //TODO : should we use client coordinates + if ( win ) win->MacRootWindowToWindow( &localx , &localy ) ; if ( win != trackingGlobals->m_currentTargetWindow ) @@ -577,8 +597,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind } } - } - // MyTrackItemUnderMouse(localMouse, theWindow); + } break; case kDragTrackingLeaveWindow: if (trackingGlobals->m_currentTarget)