X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2877659b059c5d20b07b585e26391dfd9ed780a2..9e03e02d0ca493bc65f083600f1427d2ac8028ff:/src/mac/carbon/dnd.cpp?ds=sidebyside diff --git a/src/mac/carbon/dnd.cpp b/src/mac/carbon/dnd.cpp index 5744c01f3d..a84bce9196 100644 --- a/src/mac/carbon/dnd.cpp +++ b/src/mac/carbon/dnd.cpp @@ -9,11 +9,11 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dnd.h" #endif -#include "wx/defs.h" +#include "wx/wxprec.h" #if wxUSE_DRAG_AND_DROP @@ -24,6 +24,10 @@ #include "wx/gdicmn.h" #include "wx/mac/private.h" +#ifndef __DARWIN__ + #include +#endif + // ---------------------------------------------------------------------------- // global // ---------------------------------------------------------------------------- @@ -182,11 +186,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); @@ -195,31 +213,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 ; + m_dataObject->SetData( wxDataFormat(wxDF_TEXT), dataSize , theData ); + } + #if wxUSE_UNICODE + else if ( theType == kScrapFlavorTypeUnicode ) { theData[dataSize]=0 ; - wxString convert( theData , wxConvLocal ) ; - m_dataObject->SetData( format, convert.Length() * sizeof(wxChar), (const wxChar*) convert ); + 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 { @@ -269,7 +301,7 @@ wxDropSource::~wxDropSource() } -wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) +wxDragResult wxDropSource::DoDragDrop(int flags) { wxASSERT_MSG( m_data, wxT("Drop source: no data") ); @@ -297,13 +329,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 ) { @@ -311,7 +348,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; @@ -378,10 +415,13 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) DisposeDrag(theDrag); gTrackingGlobals.m_currentSource = NULL ; - KeyMap keymap; - GetKeys(keymap); - bool optionDown = keymap[1] & 4; - wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove; + bool optionDown = GetCurrentKeyModifiers() & optionKey ; + wxDragResult dndresult = wxDragCopy ; + if ( flags != wxDrag_CopyOnly ) + { + // on mac the option key is always the indication for copy + dndresult = optionDown ? wxDragCopy : wxDragMove; + } return dndresult; } @@ -434,9 +474,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind GetDragAttributes(theDrag, &attributes); wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; - KeyMap keymap; - GetKeys(keymap); - bool optionDown = keymap[1] & 4; + bool optionDown = GetCurrentKeyModifiers() & optionKey ; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; switch(theMessage) @@ -459,20 +497,20 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind -// if (attributes & kDragHasLeftSenderWindow) { - wxPoint point(localMouse.h , localMouse.v) ; wxWindow *win = NULL ; ControlPartCode controlPart ; - ControlRef control = wxMacFindControlUnderMouse( localMouse , + 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 ) @@ -563,8 +601,7 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind } } - } - // MyTrackItemUnderMouse(localMouse, theWindow); + } break; case kDragTrackingLeaveWindow: if (trackingGlobals->m_currentTarget) @@ -601,9 +638,7 @@ pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow, trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ; if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) ) { - KeyMap keymap; - GetKeys(keymap); - bool optionDown = keymap[1] & 4; + bool optionDown = GetCurrentKeyModifiers() & optionKey ; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ; }