// 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; }
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); }
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; }