Exemplo n.º 1
0
//-----------------------------------------------------------------------------
// exit point when something is actually dropped
STDMETHODIMP CDropTarget::Drop(LPDATAOBJECT pDataObject, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect)
{
	HRESULT hr = S_OK;
	if(m_pDropTarget)
	{
		// this call will actually perform the file operation in pdwEffect
		hr = m_pDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
		// all is said & done
		// perform cleanup similar to DragLeave() above
		m_pDropTarget->Release();
		m_pDropTarget = NULL;
	}
	Release();
	return hr;
}
Exemplo n.º 2
0
void BookmarkToolBar::OnDropTarget(COleDataObject *aOleDataObject, DROPEFFECT aDropEffect, CPoint aPoint, xpr_sint_t aBookmark)
{
    if (aOleDataObject == XPR_NULL)
        return;

    BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark);
    if (sBookmarkItem == XPR_NULL)
        return;

    LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath);
    if (sFullPidl != XPR_NULL)
    {
        xpr_bool_t    sResult;
        LPSHELLFOLDER sShellFolder = XPR_NULL;
        LPCITEMIDLIST sPidl = XPR_NULL;

        sResult = fxfile::base::Pidl::getSimplePidl(sFullPidl, sShellFolder, sPidl);
        if (XPR_IS_TRUE(sResult))
        {
            POINTL sPointL = {0};
            ClientToScreen(&aPoint);
            sPointL.x = aPoint.x;
            sPointL.y = aPoint.y;

            DWORD sKeyState = mDropTarget.isRightDrag() ? MK_RBUTTON : MK_LBUTTON;
            DWORD sTempEffect = DROPEFFECT_MOVE;

            switch (aDropEffect)
            {
            case DROPEFFECT_MOVE: sKeyState |= MK_SHIFT;              break;
            case DROPEFFECT_COPY: sKeyState |= MK_CONTROL;            break;
            case DROPEFFECT_LINK: sKeyState |= MK_SHIFT | MK_CONTROL; break;
            }

            LPDROPTARGET sDropTarget = XPR_NULL;
            HRESULT sHResult = sShellFolder->GetUIObjectOf(
                GetSafeHwnd(),
                1,
                (LPCITEMIDLIST*)&sPidl,
                IID_IDropTarget,
                XPR_NULL,
                (LPVOID*)&sDropTarget);

            if (SUCCEEDED(sHResult) && sDropTarget != XPR_NULL)
            {
                LPDATAOBJECT sDataObject = aOleDataObject->Detach();
                if (sDataObject != XPR_NULL)
                {
                    sDropTarget->DragEnter(sDataObject, sKeyState, sPointL, &sTempEffect);
                    sDropTarget->DragOver(sKeyState, sPointL, &sTempEffect);

                    if (mDropTarget.isRightDrag() == XPR_TRUE)
                        aDropEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;

                    sDropTarget->Drop(sDataObject, sKeyState, sPointL, &aDropEffect);
                }
            }

            COM_RELEASE(sDropTarget);
        }

        COM_RELEASE(sShellFolder);
    }

    COM_FREE(sFullPidl);
}