// Name : wxIDropTarget::Drop // Purpose : Instructs the drop target to paste data that was just now // dropped on it. // Returns : S_OK // Params : [in] IDataObject *pIDataSource the data to paste // [in] DWORD grfKeyState kbd & mouse state // [in] POINTL pt where the drop occurred? // [in/out]DWORD *pdwEffect operation effect // Notes : STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) { wxLogTrace(wxTRACE_OleCalls, wxT("IDropTarget::Drop")); // TODO I don't know why there is this parameter, but so far I assume // that it's the same we've already got in DragEnter wxASSERT( m_pIDataObject == pIDataSource ); // we need client coordinates to pass to wxWin functions if ( !ScreenToClient(m_hwnd, (POINT *)&pt) ) { wxLogLastError(wxT("ScreenToClient")); } // first ask the drop target if it wants data if ( m_pTarget->OnDrop(pt.x, pt.y) ) { // it does, so give it the data source m_pTarget->MSWSetDataSource(pIDataSource); // and now it has the data wxDragResult rc = ConvertDragEffectToResult( 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 = DROPEFFECT_NONE; } } else { // OnDrop() returned false, no need to copy data *pdwEffect = DROPEFFECT_NONE; } // release the held object RELEASE_AND_NULL(m_pIDataObject); return S_OK; }
// #pragma page "CIDropTarget::Drop" ///////////////////////////////////////////////////////////////////////////// // // CIDropTarget::Drop // // Instructs the drop target to paste data that was just now dropped on it. // // PARAMETERS // pIDataSource -- the data to paste // dwKeyState -- kbd & mouse state // pt -- mouse coordinates // pdwEffect -- effect flag // // RETURN VALUE // STDMETHODIMP S_OK // ///////////////////////////////////////////////////////////////////////////// MRESULT CIDropTarget::Drop () { char zBuffer[128]; ULONG ulBytes; USHORT uOp = 0; USHORT uIndicator; ULONG ulItems; ULONG i; ::DrgAccessDraginfo(m_pDragInfo); switch(m_pDragInfo->usOperation) { case DO_UNKNOWN: Free(); return (MRFROM2SHORT(DOR_NODROPOP, 0)); case DO_DEFAULT: m_pDragItem = ::DrgQueryDragitemPtr(m_pDragInfo, 0); ulBytes = ::DrgQueryStrName( m_pDragItem->hstrContainerName ,128 ,zBuffer ); if (!ulBytes) return (MRFROM2SHORT(DOR_NODROPOP, 0)); else uOp = DO_MOVE; break; case DO_COPY: case DO_MOVE: uOp = m_pDragInfo->usOperation; break; } uIndicator = DOR_DROP; ulItems = (ULONG)::DrgQueryDragitemCount(m_pDragInfo); for (i = 0; i < ulItems; i++) { m_pDragItem = ::DrgQueryDragitemPtr(m_pDragInfo, i); if (((m_pDragItem->fsSupportedOps & DO_COPYABLE) && (uOp == (USHORT)DO_COPY)) || ((m_pDragItem->fsSupportedOps & DO_MOVEABLE) && (uOp == (USHORT)DO_COPY))) { if (::DrgVerifyRMF(m_pDragItem, "DRM_OS2FILE", "DRF_UNKNOWN")) uIndicator = (USHORT)DOR_DROP; else uIndicator = (USHORT)DOR_NEVERDROP; } } // // First ask the drop target if it wants data // if (m_pTarget->OnDrop( m_pDragInfo->xDrop ,m_pDragInfo->yDrop )) { wxDragResult eRc = wxDragNone; // // And now it has the data // eRc = m_pTarget->OnData( m_pDragInfo->xDrop ,m_pDragInfo->yDrop ,eRc ); } //else: OnDrop() returned false, no need to copy data // // Release the held object // Free(); return (MRFROM2SHORT(uIndicator, uOp)); } // end of CIDropTarget::Drop