コード例 #1
0
ファイル: Droptarget.cpp プロジェクト: Jmos/bbclean-xzero450
STDMETHODIMP CDropTarget::DragLeave()
{
	HRESULT hr = S_OK;
	if(m_pDropTarget)
	{
		// next call should release the shell item's grip on the transferred data object
		hr = m_pDropTarget->DragLeave();
		// and we are done with the drop target interface, too
		m_pDropTarget->Release();
		m_pDropTarget = NULL;
	}
	Release();
	return hr;
}
コード例 #2
0
ファイル: Droptarget.cpp プロジェクト: Jmos/bbclean-xzero450
//-----------------------------------------------------------------------------
// 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;
}
コード例 #3
0
HRESULT WinCE_RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget) {
    pDropTarget->AddRef();
    if (!dragMap)
        dragMap = new DragWindowMap();
    dragMap->insert ( std::pair<HWND, IDropTarget*>(hwnd, pDropTarget) );
    return S_OK;
}
コード例 #4
0
ファイル: Droptarget.cpp プロジェクト: Jmos/bbclean-xzero450
// first called when the mouse enters our target window space
STDMETHODIMP CDropTarget::DragEnter(LPDATAOBJECT pDataObject, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect)
{
	// don't set "*pdwEffect = DROPEFFECT_NONE"; that would adversely affect the drop target
	BOOL ok = FALSE;
	AddRef();
	if (m_pidl)
	{
		LPSHELLFOLDER psfFolder;
		LPITEMIDLIST pidlItem;
		LPITEMIDLIST pidlFull;
		if (sh_get_uiobject(m_pidl, &pidlFull, &pidlItem, &psfFolder, IID_IDropTarget, (void**)&m_pDropTarget))
		{
			HRESULT hr = m_pDropTarget->DragEnter(pDataObject, grfKeyState, pt, pdwEffect);
			if(SUCCEEDED(hr)) ok = TRUE;
		}
		if (psfFolder)      psfFolder   ->Release();
		if (pidlItem)       m_free(pidlItem);
		if (pidlFull)       m_free(pidlFull);
	}
	if(FALSE == ok) *pdwEffect = DROPEFFECT_NONE; // we can't understand this thing
	m_pDataObject = pDataObject;
	return S_OK;
}
コード例 #5
0
ファイル: Droptarget.cpp プロジェクト: Jmos/bbclean-xzero450
STDMETHODIMP CDropTarget::DragOver(DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect)
{
#if 0
	LPITEMIDLIST pidl = (LPITEMIDLIST)SendMessage(m_hwnd, BB_DRAGOVER, grfKeyState, (LPARAM)&pt);
	// -----------------------------------------------------------
	// if this is enabled, things are dropped to menu items
	// rather than to the menu's folder itself
	int s1 = pidl ? GetIDListSize(pidl) : 0;
	int s2 = m_pidl ? GetIDListSize(m_pidl) : 0;
	if (s1 != s2 || (s1 && memcmp(pidl, m_pidl, s1)))
	{
		AddRef();
		DragLeave();
		if (m_pidl) m_free(m_pidl);
		m_pidl = duplicateIDlist(pidl);
		DWORD dwEffect = *pdwEffect;
		DragEnter(m_pDataObject, grfKeyState, pt, &dwEffect);
		Release();
	}
	// -----------------------------------------------------------
#else
	SendMessage(m_hwnd, BB_DRAGOVER, grfKeyState, (LPARAM)&pt);
#endif

	// if we have a valid target object, relay the call
	if(m_pDropTarget)
	{
		// mouse pointer information is not really relevant to the shell item...
		return m_pDropTarget->DragOver(grfKeyState, pt, pdwEffect);
	}
	else
	{
		*pdwEffect = DROPEFFECT_NONE; // can't accept now
		return S_OK;
	}
}
コード例 #6
0
ファイル: bookmark_toolbar.cpp プロジェクト: fxfile/fxfile
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);
}
コード例 #7
0
ファイル: bookmark_toolbar.cpp プロジェクト: fxfile/fxfile
DROPEFFECT BookmarkToolBar::OnDragOver(COleDataObject* aOleDataObject, DWORD aKeyState, CPoint aPoint)
{
    DROPEFFECT sDropEffect = DROPEFFECT_LINK;

    DragImage &sDragImage = DragImage::instance();

    if (sDragImage.isMyDragging() == XPR_TRUE)
    {
        CImageList *sMyDragImage = sDragImage.getMyDragImage();
        if (XPR_IS_NOT_NULL(sMyDragImage))
        {
            CPoint sDragPoint(aPoint);
            ClientToScreen(&sDragPoint);
            sMyDragImage->DragMove(sDragPoint);
        }
    }
    else
    {
        if (mDropTarget.isUseDropHelper() == XPR_TRUE)
        {
            CPoint sDragPoint(aPoint);
            mDropTarget.getDropHelper()->DragOver(&sDragPoint, sDropEffect);
        }
    }

    CToolBarCtrl &sToolBarCtrl = GetToolBarCtrl();

    TBBUTTON sTbButton = {0};
    TBINSERTMARK sTbInsertMark = {0};
    xpr_sint_t sHitTest = GetToolBarCtrl().HitTest(&aPoint);
    xpr_sint_t sInsertHitTest = -1;
    if (sToolBarCtrl.InsertMarkHitTest(&aPoint, &sTbInsertMark) && sTbInsertMark.iButton >= 0)
        sInsertHitTest = sTbInsertMark.iButton;

    xpr_sint_t sBookmark, sInsert;
    if (XPR_TEST_BITS(aKeyState, MK_SHIFT) && XPR_TEST_BITS(aKeyState, MK_CONTROL))
    {
        sInsert = -1;
        sBookmark = -1;
    }
    else
    {
        if (sHitTest < 0 || sInsertHitTest >= 0)
        {
            if (sTbInsertMark.dwFlags == TBIMHT_AFTER)
            {
                sTbInsertMark.dwFlags = 0;
                sInsertHitTest++;
            }

            if (sHitTest == -1)
                sInsertHitTest = -1;

            sInsert = sInsertHitTest;
            sBookmark = -1;
        }
        else
        {
            sInsert = -1;
            sBookmark = sHitTest;
        }
    }

    BookmarkMgr &sBookmarkMgr = BookmarkMgr::instance();

    if (sBookmark >= sBookmarkMgr.getCount())
        sBookmark = -1;

    if (sBookmark != -1)
    {
        sDropEffect = DROPEFFECT_LINK;

        BookmarkItem *sBookmarkItem = sBookmarkMgr.getBookmark(sBookmark);
        if (sBookmarkItem != XPR_NULL)
        {
            xpr_bool_t sGetPidl = XPR_TRUE;
            LPITEMIDLIST sFullPidl = XPR_NULL;

            if (IsNetItem(sBookmarkItem->mPath.c_str()))
                sGetPidl = WnetMgr::instance().isConnectedServer(sBookmarkItem->mPath);

            if (sGetPidl == XPR_TRUE)
                sFullPidl = Path2Pidl(sBookmarkItem->mPath);

            if (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl))
            {
                sDropEffect = DROPEFFECT_MOVE;

                if (aKeyState & MK_ALT)          sDropEffect = DROPEFFECT_LINK;
                else if (aKeyState & MK_CONTROL) sDropEffect = DROPEFFECT_COPY;
                else if (aKeyState & MK_SHIFT)   sDropEffect = DROPEFFECT_MOVE;
                else
                {
                    switch (gOpt->mConfig.mDragDefaultFileOp)
                    {
                    case DRAG_FILE_OP_DEFAULT:  sDropEffect = DROPEFFECT_MOVE; break;
                    case DRAG_FILE_OP_COPY:     sDropEffect = DROPEFFECT_COPY; break;
                    case DRAG_FILE_OP_LINK:     sDropEffect = DROPEFFECT_LINK; break;
                    default:                    sDropEffect = DROPEFFECT_MOVE; break;
                    }
                }
            }
            else
            {
                HRESULT       sHResult;
                LPSHELLFOLDER sShellFolder = XPR_NULL;
                LPCITEMIDLIST sPidl        = XPR_NULL;

                fxfile::base::Pidl::getSimplePidl(sFullPidl, sShellFolder, sPidl);

                sHResult = E_FAIL;
                LPDROPTARGET sDropTarget = XPR_NULL;

                if (sShellFolder != XPR_NULL && sPidl != XPR_NULL)
                {
                    sHResult = sShellFolder->GetUIObjectOf(GetSafeHwnd(),
                        1,
                        (LPCITEMIDLIST *)&sPidl,
                        IID_IDropTarget,
                        XPR_NULL,
                        (LPVOID *)&sDropTarget);
                }

                xpr_bool_t sSucceeded = XPR_FALSE;

                if (SUCCEEDED(sHResult) && sDropTarget != XPR_NULL)
                {
                    POINTL sPointL = {0};
                    ClientToScreen(&aPoint);
                    sPointL.x = aPoint.x;
                    sPointL.y = aPoint.y;

                    DWORD sTempDropEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;

                    sHResult = sDropTarget->DragEnter(aOleDataObject->m_lpDataObject, aKeyState, sPointL, &sTempDropEffect);
                    if (SUCCEEDED(sHResult))
                    {
                        sHResult = sDropTarget->DragOver(aKeyState, sPointL, &sTempDropEffect);
                        sSucceeded = SUCCEEDED(sHResult) && sTempDropEffect != 0;
                    }
                }

                COM_RELEASE(sDropTarget);
                COM_RELEASE(sShellFolder);

                if (sSucceeded == XPR_TRUE)
                    sDropEffect = DROPEFFECT_MOVE;
                else
                {
                    sBookmark = -1;
                    sDropEffect = DROPEFFECT_NONE;
                }
            }

            COM_FREE(sFullPidl);
        }
        else
        {
            sBookmark = -1;
            sDropEffect = DROPEFFECT_NONE;
        }
    }

    if (sBookmark == -1)
    {
        // Insert Bookmark
        if (mOldBookmark >= 0)
        {
            sToolBarCtrl.GetButton(mOldBookmark, &sTbButton);
            sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED);
        }

        if (mOldInsert != sInsert)
        {
            sTbInsertMark.iButton = sInsert;
            sToolBarCtrl.SetInsertMark(&sTbInsertMark);
        }

        sDropEffect = DROPEFFECT_LINK;
    }
    else
    {
        // Run Program or File Operation
        if (mOldInsert >= 0)
        {
            sTbInsertMark.iButton = -1;
            sToolBarCtrl.SetInsertMark(&sTbInsertMark);
        }

        if (mOldBookmark != sBookmark)
        {
            sToolBarCtrl.GetButton(mOldBookmark, &sTbButton);
            sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED);

            sToolBarCtrl.GetButton(sBookmark, &sTbButton);
            sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_MARKED | TBSTATE_PRESSED | TBSTATE_ENABLED);
        }
    }

    mOldInsert = sInsert;
    mOldBookmark = sBookmark;

    if (XPR_IS_NOT_NULL(mObserver))
    {
        mObserver->onBookmarkToolBarStatus(*this, mOldBookmark, mOldInsert, sDropEffect);
    }

    return sDropEffect;
}