X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/917ae499da53826e9b154a786eae1b563317f47f..c3a58b249e576b73b01cd74deb1cf879aa6e1975:/src/msw/ole/droptgt.cpp diff --git a/src/msw/ole/droptgt.cpp b/src/msw/ole/droptgt.cpp index 7072586f09..6be0765f45 100644 --- a/src/msw/ole/droptgt.cpp +++ b/src/msw/ole/droptgt.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: ole/droptgt.cpp +// Name: src/msw/ole/droptgt.cpp // Purpose: wxDropTarget implementation // Author: Vadim Zeitlin // Modified by: @@ -17,23 +17,21 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "droptgt.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #if defined(__BORLANDC__) -#pragma hdrstop + #pragma hdrstop #endif -#include "wx/setup.h" - #if wxUSE_OLE && wxUSE_DRAG_AND_DROP +#ifndef WX_PRECOMP + #include "wx/msw/wrapwin.h" + #include "wx/log.h" +#endif + #include "wx/msw/private.h" -#include "wx/log.h" #ifdef __WXWINCE__ #include @@ -42,9 +40,6 @@ #ifdef __WIN32__ #if !defined(__GNUWIN32__) || wxUSE_NORLANDER_HEADERS - #if wxCHECK_W32API_VERSION( 1, 0 ) - #include "wx/msw/wrapwin.h" - #endif #include // for DROPFILES structure #endif #else @@ -85,7 +80,7 @@ protected: HWND m_hwnd; // window we're associated with // get default drop effect for given keyboard flags - static inline DWORD GetDropEffect(DWORD flags, wxDragResult defaultAction); + static DWORD GetDropEffect(DWORD flags, wxDragResult defaultAction, DWORD pdwEffect); DECLARE_NO_COPY_CLASS(wxIDropTarget) }; @@ -109,11 +104,31 @@ static DWORD ConvertDragResultToEffect(wxDragResult result); // Notes : We do "move" normally and "copy" if is pressed, // which is the standard behaviour (currently there is no // way to redefine it) -DWORD wxIDropTarget::GetDropEffect(DWORD flags, wxDragResult defaultAction) +DWORD wxIDropTarget::GetDropEffect(DWORD flags, + wxDragResult defaultAction, + DWORD pdwEffect) { - if (defaultAction == wxDragCopy) - return flags & MK_SHIFT ? DROPEFFECT_MOVE : DROPEFFECT_COPY; - return flags & MK_CONTROL ? DROPEFFECT_COPY : DROPEFFECT_MOVE; + DWORD effectiveAction; + if ( defaultAction == wxDragCopy ) + effectiveAction = flags & MK_SHIFT ? DROPEFFECT_MOVE : DROPEFFECT_COPY; + else + effectiveAction = flags & MK_CONTROL ? DROPEFFECT_COPY : DROPEFFECT_MOVE; + + if ( !(effectiveAction & pdwEffect) ) + { + // the action is not supported by drag source, fall back to something + // that it does support + if ( pdwEffect & DROPEFFECT_MOVE ) + effectiveAction = DROPEFFECT_MOVE; + else if ( pdwEffect & DROPEFFECT_COPY ) + effectiveAction = DROPEFFECT_COPY; + else if ( pdwEffect & DROPEFFECT_LINK ) + effectiveAction = DROPEFFECT_LINK; + else + effectiveAction = DROPEFFECT_NONE; + } + + return effectiveAction; } wxIDropTarget::wxIDropTarget(wxDropTarget *pTarget) @@ -192,7 +207,7 @@ STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource, // give some visual feedback *pdwEffect = ConvertDragResultToEffect( m_pTarget->OnEnter(pt.x, pt.y, ConvertDragEffectToResult( - GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction())) + GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction(), *pdwEffect)) ) ); @@ -217,7 +232,7 @@ STDMETHODIMP wxIDropTarget::DragOver(DWORD grfKeyState, wxDragResult result; if ( m_pIDataObject ) { result = ConvertDragEffectToResult( - GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction())); + GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction(), *pdwEffect)); } else { // can't accept data anyhow normally @@ -260,7 +275,7 @@ STDMETHODIMP wxIDropTarget::DragLeave() // Returns : S_OK // Params : [in] IDataObject *pIDataSource the data to paste // [in] DWORD grfKeyState kbd & mouse state -// [in] POINTL pt where the drop occured? +// [in] POINTL pt where the drop occurred? // [ouy]DWORD *pdwEffect operation effect // Notes : STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, @@ -274,9 +289,6 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, // that it's the same we've already got in DragEnter wxASSERT( m_pIDataObject == pIDataSource ); - // by default, nothing happens - *pdwEffect = DROPEFFECT_NONE; - // we need client coordinates to pass to wxWin functions if ( !ScreenToClient(m_hwnd, (POINT *)&pt) ) { @@ -290,15 +302,20 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, // and now it has the data wxDragResult rc = ConvertDragEffectToResult( - GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction())); + GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction(), *pdwEffect)); rc = m_pTarget->OnData(pt.x, pt.y, rc); if ( wxIsDragResultOk(rc) ) { // operation succeeded *pdwEffect = ConvertDragResultToEffect(rc); } - //else: *pdwEffect is already DROPEFFECT_NONE + else { + *pdwEffect = DROPEFFECT_NONE; + } + } + else { + // OnDrop() returned false, no need to copy data + *pdwEffect = DROPEFFECT_NONE; } - //else: OnDrop() returned false, no need to copy data // release the held object RELEASE_AND_NULL(m_pIDataObject); @@ -550,5 +567,4 @@ static DWORD ConvertDragResultToEffect(wxDragResult result) } } -#endif - // wxUSE_DRAG_AND_DROP +#endif // wxUSE_OLE && wxUSE_DRAG_AND_DROP