void SearchLocEditDlg::OnPathBrowse(void) { xpr_tchar_t sPath[XPR_MAX_PATH + 1] = {0}; GetDlgItemText(IDC_SEARCH_LOC_EDIT_PATH, sPath, XPR_MAX_PATH); if (_tcslen(sPath) == 2) _tcscat(sPath, XPR_STRING_LITERAL("\\")); LPITEMIDLIST sOldFullPidl = fxfile::base::Pidl::create(sPath); BROWSEINFO sBrowseInfo = {0}; sBrowseInfo.hwndOwner = GetSafeHwnd(); sBrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS;// | BIF_USENEWUI; sBrowseInfo.lpszTitle = gApp.loadString(XPR_STRING_LITERAL("popup.search_user_location_edit.exclude_path_browse.title")); sBrowseInfo.lpfn = (BFFCALLBACK)BrowseCallbackProc; sBrowseInfo.lParam = (LPARAM)sOldFullPidl; LPITEMIDLIST sFullPidl = ::SHBrowseForFolder(&sBrowseInfo); if (sFullPidl != XPR_NULL) { GetName(sFullPidl, SHGDN_FORPARSING, sPath); SetDlgItemText(IDC_SEARCH_LOC_EDIT_PATH, sPath); } COM_FREE(sFullPidl); COM_FREE(sOldFullPidl); }
void BookmarkToolBar::OnDropShortcut(STGMEDIUM *aStgMedium, xpr_sint_t aBookmark) { if (aStgMedium == XPR_NULL) return; BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark); if (sBookmarkItem == XPR_NULL) return; LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal); if (sIda == XPR_NULL) return; LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath); if (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl) == XPR_TRUE) { xpr_sint_t sCount = sIda->cidl; LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL // get folder PIDL sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]); xpr_sint_t i; xpr_size_t sColon; xpr::string sDir; xpr::string sName; xpr::string sBookmarkPath; const xpr_tchar_t *sLinkSuffix = gApp.loadString(XPR_STRING_LITERAL("common.shortcut.suffix")); GetName(sFullPidl, SHGDN_FORPARSING, sDir); for (i = 0; i < sCount; ++i) { // get item PIDL and get full-qualified PIDL sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]); sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2); GetName(sFullPidl2, SHGDN_INFOLDER, sName); sColon = sName.find(XPR_STRING_LITERAL(':')); if (sColon != xpr::string::npos) sName.erase(sColon, 1); sName += sLinkSuffix; if (SetNewPath(sBookmarkPath, sDir, sName, XPR_STRING_LITERAL(".lnk"))) { CreateShortcut(sBookmarkPath.c_str(), sFullPidl2); } COM_FREE(sFullPidl2); } } COM_FREE(sFullPidl); ::GlobalUnlock(aStgMedium->hGlobal); }
LPITEMIDLIST Pidl::create(const KNOWNFOLDERID &aKnownFolderId) { HRESULT sComResult; LPITEMIDLIST sFullPidl = XPR_NULL; HINSTANCE sDll = ::LoadLibrary(XPR_STRING_LITERAL("shell32.dll")); if (XPR_IS_NOT_NULL(sDll)) { SHGetKnownFolderIDListFunc sSHGetKnownFolderIDListFunc = (SHGetKnownFolderIDListFunc)::GetProcAddress(sDll, (const xpr_char_t *)XPR_MBCS_STRING_LITERAL("SHGetKnownFolderIDList")); if (XPR_IS_NOT_NULL(sSHGetKnownFolderIDListFunc)) { sComResult = sSHGetKnownFolderIDListFunc(aKnownFolderId, 0, XPR_NULL, &sFullPidl); if (FAILED(sComResult) || XPR_IS_NULL(sFullPidl)) { XPR_ASSERT(sFullPidl == XPR_NULL); COM_FREE(sFullPidl); } } ::FreeLibrary(sDll); } return sFullPidl; }
xpr_sint_t Pidl::compare(LPCITEMIDLIST aPidl, xpr_sint_t aSpecialFolder) { if (XPR_IS_NULL(aPidl)) { return -1; } xpr_sint_t sResult = 0; HRESULT sComResult; LPITEMIDLIST sSpecialPidl = XPR_NULL; sComResult = ::SHGetSpecialFolderLocation(XPR_NULL, aSpecialFolder, &sSpecialPidl); if (FAILED(sComResult) || XPR_IS_NULL(sSpecialPidl)) { sResult = -1; } else { if (Pidl::getSize(aPidl) != Pidl::getSize(sSpecialPidl)) { sResult = -1; } else { sResult = memcmp(aPidl, sSpecialPidl, Pidl::getSize(aPidl)); } } COM_FREE(sSpecialPidl); return sResult; }
LPITEMIDLIST Pidl::create(xpr_sint_t aSpecialFolder) { HRESULT sComResult; LPITEMIDLIST sFullPidl = XPR_NULL; sComResult = ::SHGetSpecialFolderLocation(XPR_NULL, aSpecialFolder, &sFullPidl); if (FAILED(sComResult) || XPR_IS_NULL(sFullPidl)) { XPR_ASSERT(sFullPidl == XPR_NULL); COM_FREE(sFullPidl); } return sFullPidl; }
xpr_bool_t Pidl::getInfotip(LPSHELLFOLDER aShellFolder, LPCITEMIDLIST aPidl, xpr::string &aInfotip) { xpr_bool_t sResult = XPR_FALSE; IQueryInfo *sQueryInfo = XPR_NULL; HRESULT sComResult; sComResult = aShellFolder->GetUIObjectOf( XPR_NULL, 1, (LPCITEMIDLIST *)&aPidl, IID_IQueryInfo, 0, (LPVOID *)&sQueryInfo); if (SUCCEEDED(sComResult) && XPR_IS_NOT_NULL(sQueryInfo)) { xpr_wchar_t *sWideInfotip = XPR_NULL; sComResult = sQueryInfo->GetInfoTip(SHGDN_INFOLDER, &sWideInfotip); if (SUCCEEDED(sComResult) && XPR_IS_NOT_NULL(sWideInfotip)) { xpr_size_t sInfotipLen = wcslen(sWideInfotip); if (sInfotipLen != 0) { aInfotip.clear(); aInfotip.reserve(sInfotipLen + 1); xpr_tchar_t *sInfotip = (xpr_tchar_t *)aInfotip.c_str(); xpr_size_t sInputBytes = sInfotipLen * sizeof(xpr_wchar_t); xpr_size_t sOutputBytes = sInfotipLen * sizeof(xpr_tchar_t); XPR_UTF16_TO_TCS(sWideInfotip, &sInputBytes, sInfotip, &sOutputBytes); sInfotip[sOutputBytes / sizeof(xpr_tchar_t)] = 0; aInfotip.update(); sResult = XPR_TRUE; } } COM_FREE(sWideInfotip); } COM_RELEASE(sQueryInfo); return sResult; }
void WnetMgr::getNetFullPath(xpr::string &aFullPath) { aFullPath.clear(); xpr::string sPath(XPR_STRING_LITERAL("\\\\127.0.0.1")); LPITEMIDLIST sFullPidl = fxfile::base::Pidl::create(sPath.c_str()); if (XPR_IS_NOT_NULL(sFullPidl)) return; GetDispFullPath(sFullPidl, aFullPath); xpr_size_t sFind = aFullPath.rfind(XPR_STRING_LITERAL('\\')); if (sFind != xpr::string::npos) aFullPath.erase(sFind); COM_FREE(sFullPidl); }
void BookmarkToolBar::OnDropInsertBookmark(STGMEDIUM *aStgMedium, xpr_sint_t aInsert) { if (aStgMedium == XPR_NULL) return; LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal); if (sIda == XPR_NULL) return; { xpr_sint_t sCount = sIda->cidl; LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL // get folder PIDL sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]); xpr_sint_t i; xpr_sint_t sResult; for (i = 0; i < sCount; ++i) { // get item PIDL and get full-qualified PIDL sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]); sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2); { sResult = gFrame->addBookmark(sFullPidl2, aInsert); if (sResult == -1) break; if (sResult == 1) { updateBookmarkButton(aInsert); gFrame->updateBookmark(); } } COM_FREE(sFullPidl2); } } ::GlobalUnlock(aStgMedium->hGlobal); }
void ShortcutDlg::OnTargetBrowse(void) { BROWSEINFO sBrowseInfo = {0}; sBrowseInfo.hwndOwner = GetSafeHwnd(); sBrowseInfo.lpszTitle = gApp.loadString(XPR_STRING_LITERAL("popup.create_shortcut.folder_browse.title")); sBrowseInfo.ulFlags = BIF_BROWSEINCLUDEFILES | BIF_RETURNONLYFSDIRS;// | BIF_USENEWUI; LPITEMIDLIST sFullPidl = ::SHBrowseForFolder(&sBrowseInfo); if (XPR_IS_NULL(sFullPidl)) return; xpr::string sName, sPath; GetName(sFullPidl, SHGDN_INFOLDER, sName); GetName(sFullPidl, SHGDN_FORPARSING, sPath); RemoveInvalidChar(sName); COM_FREE(mFullPidl); mFullPidl = sFullPidl; SetDlgItemText(IDC_CREATE_SHORTCUT_NAME, sName.c_str()); SetDlgItemText(IDC_CREATE_SHORTCUT_TARGET, sPath.c_str()); }
//////////////////////////////////////////////////////////////////////////////////////////////////// /// IMPLEMENTATION //////////////////////////////////////////////////////////////////////////////////////////////////// VOID Foundation::OnReceive(LPCSTR szwData, DWORD dwLength) { LPWSTR szwArray; DWORD dwBytes = EngineAPI::WideUnicodeFromAscii(szwData, &szwArray, dwLength); { //! //! Allocate the packet //! BSTR sbMessage = COM_ALLOCATE_STRING(szwArray); //! //! Send the packet //! __asm PUSH sbMessage __asm CALL m_RecvDetour.lpTrampoline //! //! Free the packet //! COM_FREE(sbMessage); } FREE(szwArray); }
void BookmarkToolBar::OnDropExecFile(STGMEDIUM *aStgMedium, xpr_sint_t aBookmark) { if (aStgMedium == XPR_NULL) return; BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark); if (sBookmarkItem == XPR_NULL) return; LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal); if (sIda == XPR_NULL) return; LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath); if (sFullPidl != XPR_NULL && IsFileSystem(sFullPidl) == XPR_TRUE && IsFileSystemFolder(sFullPidl) == XPR_FALSE) { xpr_sint_t sCount = sIda->cidl; LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL xpr_tchar_t sPath[XPR_MAX_PATH + 1] = {0}; xpr_tchar_t sStartup[XPR_MAX_PATH + 1] = {0}; xpr_tchar_t *sSplit; DWORD sAttributes; // get folder PIDL sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]); xpr_sint_t i; for (i = 0; i < sCount; ++i) { // get item PIDL and get full-qualified PIDL sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]); sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2); { sPath[0] = '\"'; GetName(sFullPidl2, SHGDN_FORPARSING, sPath+1); _tcscpy(sStartup, sPath+1); _tcscat(sPath, XPR_STRING_LITERAL("\"")); sAttributes = GetFileAttributes(sStartup); if (!XPR_TEST_BITS(sAttributes, FILE_ATTRIBUTE_DIRECTORY)) { sSplit = _tcsrchr(sStartup, '\\'); if (sSplit != XPR_NULL) *sSplit = '\0'; if (_tcslen(sStartup) == 2) // Drive Root _tcscat(sStartup, XPR_STRING_LITERAL("\\")); } ExecFile(sBookmarkItem->mPath.c_str(), sStartup, sPath); } COM_FREE(sFullPidl2); } } COM_FREE(sFullPidl); ::GlobalUnlock(aStgMedium->hGlobal); }
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); }
void BookmarkToolBar::OnDropFileOperation(STGMEDIUM *aStgMedium, DROPEFFECT aDropEffect, xpr_sint_t aBookmark) { if (aStgMedium == XPR_NULL) return; BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark); if (sBookmarkItem == XPR_NULL) return; LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal); if (sIda == XPR_NULL) return; LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath); if (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl) == XPR_TRUE) { xpr_sint_t sCount = sIda->cidl; LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL // get folder PIDL sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]); xpr_sint_t sSourceCount = 0; xpr_tchar_t *sSource = XPR_NULL; xpr_tchar_t *sTarget = XPR_NULL; xpr_tchar_t *sSourceEnum = XPR_NULL; sTarget = new xpr_tchar_t[XPR_MAX_PATH + 1]; GetName(sFullPidl, SHGDN_FORPARSING, sTarget); sTarget[_tcslen(sTarget)+1] = '\0'; sSource = new xpr_tchar_t[(XPR_MAX_PATH + 1) * sCount]; sSourceEnum = sSource; xpr_sint_t i; for (i = 0; i < sCount; ++i) { // get item PIDL and get full-qualified PIDL sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]); sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2); if (IsFileSystem(sFullPidl2) == XPR_TRUE) { GetName(sFullPidl2, SHGDN_FORPARSING, sSourceEnum); sSourceEnum += _tcslen(sSourceEnum) + 1; sSourceCount++; } COM_FREE(sFullPidl2); } if (sSourceCount > 0) { // Last Element - 2 Null *sSourceEnum = '\0'; xpr_uint_t sFunc = 0; WORD sFlags = 0; // Drop Effect // 1-Copy, 2-Move, 3-Bookmark, 5-Copy+Bookmark if (aDropEffect == DROPEFFECT_MOVE) sFunc = FO_MOVE; else { sFunc = FO_COPY; CString sCompare; AfxExtractSubString(sCompare, sSource, 0, '\0'); sCompare = sCompare.Left(sCompare.ReverseFind('\\')); if (_tcscmp(sCompare, sTarget) == 0) sFlags |= FOF_RENAMEONCOLLISION; } // windows vista bug //if (sSourceCount > 1) // sFlags |= FOF_MULTIDESTFILES; SHFILEOPSTRUCT *sShFileOpStruct = new SHFILEOPSTRUCT; memset(sShFileOpStruct, 0, sizeof(SHFILEOPSTRUCT)); sShFileOpStruct->hwnd = AfxGetMainWnd()->GetSafeHwnd(); sShFileOpStruct->wFunc = sFunc; sShFileOpStruct->fFlags = sFlags; sShFileOpStruct->pFrom = sSource; sShFileOpStruct->pTo = sTarget; FileOpThread *sFileOpThread = new FileOpThread; sFileOpThread->start(sShFileOpStruct); } } COM_FREE(sFullPidl); ::GlobalUnlock(aStgMedium->hGlobal); }
void BookmarkToolBar::OnDrop(COleDataObject *aOleDataObject, DROPEFFECT aDropEffect, CPoint aPoint) { CToolBarCtrl &sToolBarCtrl = GetToolBarCtrl(); DragImage &sDragImage = DragImage::instance(); if (sDragImage.isMyDragging() == XPR_TRUE) { CImageList *sMyDragImage = sDragImage.getMyDragImage(); if (XPR_IS_NOT_NULL(sMyDragImage)) { sMyDragImage->EndDrag(); sMyDragImage->DragShowNolock(XPR_FALSE); } } else { if (mDropTarget.isUseDropHelper() == XPR_TRUE) mDropTarget.getDropHelper()->DragLeave(); } if (mOldInsert >= 0) { TBINSERTMARK sTbInsertMark = {0}; sTbInsertMark.iButton = -1; sToolBarCtrl.SetInsertMark(&sTbInsertMark); } if (mOldBookmark >= 0) { TBBUTTON sTbButton = {0}; sToolBarCtrl.GetButton(mOldBookmark, &sTbButton); sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED); } if (XPR_IS_NOT_NULL(mObserver)) { mObserver->onBookmarkToolBarStatus(*this, -1, -1, DROPEFFECT_NONE); } COleDataObject *sOleDataObject = aOleDataObject; if (sOleDataObject->IsDataAvailable(mShellIDListClipFormat) == XPR_FALSE) return; // 3 Operation //-------------------------------------------------- // 1. Insert Bookmark Item // 2. Run Program & Bookmark File // 3. File Operation STGMEDIUM sStgMedium = {0}; FORMATETC sFormatEtc = {(CLIPFORMAT)mShellIDListClipFormat, XPR_NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; if (sOleDataObject->GetData(mShellIDListClipFormat, &sStgMedium, &sFormatEtc) == XPR_FALSE) return; if (mOldBookmark < 0) { OnDropInsertBookmark(&sStgMedium, mOldInsert); } else { xpr_bool_t sFileOperation = XPR_FALSE; BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(mOldBookmark); if (mOldBookmark >= 0 && sBookmarkItem != XPR_NULL) { LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath); sFileOperation = (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl)); COM_FREE(sFullPidl); } if (sFileOperation == XPR_TRUE) { if (aDropEffect == DROPEFFECT_LINK) OnDropShortcut(&sStgMedium, mOldBookmark); else OnDropFileOperation(&sStgMedium, aDropEffect, mOldBookmark); } else { OnDropTarget(sOleDataObject, aDropEffect, aPoint, mOldBookmark); } } if (XPR_IS_NOT_NULL(sStgMedium.pUnkForRelease)) { ::ReleaseStgMedium(&sStgMedium); } }
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; }
// full qualified PIDL -> IShellFolder, PIDL xpr_bool_t Pidl::getSimplePidl(LPCITEMIDLIST aFullPidl, LPSHELLFOLDER &aShellFolder, LPCITEMIDLIST &aSimplePidl) { if (XPR_IS_NULL(aFullPidl)) { return XPR_FALSE; } LPSHELLFOLDER sShellFolder = XPR_NULL; LPITEMIDLIST sSimplePidl = XPR_NULL; HRESULT sComResult = E_FAIL; if (Pidl::isSimplePidl(aFullPidl) == XPR_TRUE) { LPITEMIDLIST sChildPidl; sChildPidl = Pidl::findLastItem(aFullPidl); sComResult = ::SHGetDesktopFolder((LPSHELLFOLDER *)&sShellFolder); if (SUCCEEDED(sComResult)) { sSimplePidl = sChildPidl; } } else { LPSHELLFOLDER sDesktopShellFolder; LPITEMIDLIST sParentPidl; LPITEMIDLIST sChildPidl; sChildPidl = Pidl::findLastItem(aFullPidl); sParentPidl = Pidl::clone(aFullPidl); if (XPR_IS_TRUE(Pidl::removeLastItem(sParentPidl))) { sComResult = ::SHGetDesktopFolder(&sDesktopShellFolder); if (SUCCEEDED(sComResult)) { sComResult = sDesktopShellFolder->BindToObject( sParentPidl, XPR_NULL, IID_IShellFolder, (LPVOID *)&sShellFolder); if (SUCCEEDED(sComResult)) { sSimplePidl = sChildPidl; } COM_RELEASE(sDesktopShellFolder); } } COM_FREE(sParentPidl); } if (XPR_IS_NULL(sSimplePidl)) { COM_RELEASE(sShellFolder); return XPR_FALSE; } if (XPR_IS_NULL(sShellFolder)) { return XPR_FALSE; } aShellFolder = sShellFolder; aSimplePidl = sSimplePidl; return XPR_TRUE; }
void BookmarkEditDlg::OnQuickLaunch(void) { const xpr_tchar_t *sMsg = gApp.loadString(XPR_STRING_LITERAL("popup.bookmark_edit.msg.question_quick_launch")); xpr_sint_t sMsgId = MessageBox(sMsg, XPR_NULL, MB_YESNO | MB_ICONQUESTION); if (sMsgId == IDNO) return; CWaitCursor sWaitCursor; HRESULT sHResult; xpr_tchar_t sQuickLaunch[XPR_MAX_PATH + 1] = {0}; sHResult = ::SHGetSpecialFolderPath(XPR_NULL, sQuickLaunch, CSIDL_APPDATA, XPR_FALSE); if (FAILED(sHResult)) return; _tcscat(sQuickLaunch, XPR_STRING_LITERAL("\\Microsoft\\Internet Explorer\\Quick Launch")); xpr_tchar_t sPath[XPR_MAX_PATH + 1] = {0}; _tcscpy(sPath, sQuickLaunch); xpr_tchar_t *sFileName = sPath + _tcslen(sPath) + 1; _tcscat(sPath, XPR_STRING_LITERAL("\\*.*")); WIN32_FIND_DATA sFindData = {0}; HANDLE sFindHandle = ::FindFirstFile(sPath, &sFindData); if (sFindHandle == INVALID_HANDLE_VALUE) return; xpr_tchar_t *sExt; LPITEMIDLIST sFullPidl = XPR_NULL; LPITEMIDLIST sResolvedFullPidl = XPR_NULL; BookmarkItem *sBookmarkItem; xpr_bool_t sResolved; do { if (_tcscmp(sFindData.cFileName, XPR_STRING_LITERAL(".")) == 0 || _tcscmp(sFindData.cFileName, XPR_STRING_LITERAL("..")) == 0) continue; _tcscpy(sFileName, sFindData.cFileName); sHResult = fxfile::base::Pidl::create(sPath, sFullPidl); if (SUCCEEDED(sHResult) && sFullPidl != XPR_NULL) { sExt = (xpr_tchar_t *)GetFileExt(sFindData.cFileName); if (sExt != XPR_NULL && !_tcsicmp(sExt+1, XPR_STRING_LITERAL("lnk"))) { sResolved = ResolveShortcut(GetSafeHwnd(), sPath, &sResolvedFullPidl); if (sResolved && sResolvedFullPidl) { COM_FREE(sFullPidl); sFullPidl = sResolvedFullPidl; } else { COM_FREE(sResolvedFullPidl); } } sBookmarkItem = new BookmarkItem; Pidl2Path(sFullPidl, sBookmarkItem->mPath); GetName(sFullPidl, SHGDN_INFOLDER, sBookmarkItem->mName); addBookmark(sBookmarkItem, IconReqShellIcon); } COM_FREE(sFullPidl); } while (::FindNextFile(sFindHandle, &sFindData) == XPR_TRUE); ::FindClose(sFindHandle); if (mListCtrl.GetItemCount() > 0) setItemFocus(0); updateStatus(); }
void BookmarkToolBar::OnContextMenu(CWnd* pWnd, CPoint aPoint) { CToolBarCtrl &sToolBarCtrl = GetToolBarCtrl(); CPoint sClientPoint(aPoint); ScreenToClient(&sClientPoint); xpr_bool_t sSucceeded = XPR_FALSE; xpr_sint_t sIndex = sToolBarCtrl.HitTest(&sClientPoint); if (GetKeyState(VK_CONTROL) < 0 && sIndex >= 0) { BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(sIndex); if (sBookmarkItem != XPR_NULL) { LPITEMIDLIST sFullPidl = sBookmarkItem->getPidl(); 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 (SUCCEEDED(sResult) && sShellFolder != XPR_NULL && sPidl != XPR_NULL) { ContextMenu sContextMenu(GetSafeHwnd()); if (sContextMenu.init(sShellFolder, &sPidl, 1)) { TBBUTTON sTbButton = {0}; sToolBarCtrl.GetButton(sIndex, &sTbButton); sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_MARKED | TBSTATE_ENABLED); xpr_uint_t sId = sContextMenu.trackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON, &aPoint, CMF_EXPLORE); if (sId != -1) { sId -= sContextMenu.getFirstId(); xpr_tchar_t sVerb[0xff] = {0}; sContextMenu.getCommandVerb(sId, sVerb, 0xfe); xpr_bool_t sSelfInvoke = XPR_FALSE; if (_tcsicmp(sVerb, CMID_VERB_OPEN) == 0) { gFrame->gotoBookmark(sIndex); sSelfInvoke = XPR_TRUE; } if (sSelfInvoke == XPR_FALSE) sContextMenu.invokeCommand(sId); } sToolBarCtrl.GetButton(sIndex, &sTbButton); sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED); } sContextMenu.destroy(); sSucceeded = XPR_TRUE; } COM_RELEASE(sShellFolder); COM_FREE(sFullPidl); } } } if (sSucceeded == XPR_FALSE) { BCMenu sMenu; if (sMenu.LoadMenu(IDR_COOLBAR_BOOKMARKBAR) == XPR_TRUE) { BCMenu *sPopupMenu = (BCMenu *)sMenu.GetSubMenu(0); if (XPR_IS_NOT_NULL(sPopupMenu)) sPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, aPoint, AfxGetMainWnd()); } } }