#include "folder.h" #include "item.h" #include "utils.h" #include /////////////////////////////////////////////////////////////////////////////// // View functions const struct { short int iCol; short int ids; short int cchCol; short int iFmt; } s_ControlFolder_cols[] = { {SI_CONTROL, IDS_COL_CONTROL, 20, LVCFMT_LEFT}, {SI_STATUS, IDS_COL_STATUS, 20, LVCFMT_LEFT}, {SI_TOTALSIZE, IDS_COL_TOTALSIZE, 18, LVCFMT_LEFT}, {SI_CREATION, IDS_COL_CREATION, 18, LVCFMT_LEFT}, {SI_LASTACCESS, IDS_COL_LASTACCESS, 18, LVCFMT_LEFT}, {SI_VERSION, IDS_COL_VERSION, 18, LVCFMT_LEFT} }; HRESULT ControlFolderView_Command(HWND hwnd, UINT uID) { switch (uID) { case IDM_SORTBYNAME: case IDM_SORTBYSTATUS: case IDM_SORTBYTOTALSIZE: case IDM_SORTBYCREATION: case IDM_SORTBYLASTACCESS: case IDM_SORTBYVERSION: ShellFolderView_ReArrange(hwnd, uID - IDM_SORTBYNAME); break; default: return E_FAIL; } return NOERROR; } HMENU GetMenuFromID(HMENU hmenu, UINT idm) { MENUITEMINFO mii = {sizeof(mii), MIIM_SUBMENU, 0, 0, 0, NULL, NULL, NULL, 0, NULL, 0}; GetMenuItemInfo(hmenu, idm, FALSE, &mii); return mii.hSubMenu; } UINT MergeMenuHierarchy( HMENU hmenuDst, HMENU hmenuSrc, UINT idcMin, UINT idcMax) { UINT idcMaxUsed = idcMin; int imi = GetMenuItemCount(hmenuSrc); while (--imi >= 0) { MENUITEMINFO mii = {sizeof(mii), MIIM_ID | MIIM_SUBMENU, 0, 0, 0, NULL, NULL, NULL, 0, NULL, 0}; if (GetMenuItemInfo(hmenuSrc, imi, TRUE, &mii)) { UINT idcT = Shell_MergeMenus( GetMenuFromID(hmenuDst, mii.wID), mii.hSubMenu, 0, idcMin, idcMax, MM_ADDSEPARATOR|MM_SUBMENUSHAVEIDS); idcMaxUsed = max(idcMaxUsed, idcT); } } return idcMaxUsed; } HRESULT ControlFolderView_MergeMenu(LPQCMINFO pqcm) { HMENU hmenu = LoadMenu(MLGetHinst(), MAKEINTRESOURCE(IDR_CONTROLFOLDER)); Assert(hmenu != NULL); if (hmenu) { MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID; mii.wID = SFVIDM_MENU_ARRANGE; SetMenuItemInfo(hmenu, 0, TRUE, &mii); MergeMenuHierarchy(pqcm->hmenu, hmenu, pqcm->idCmdFirst, pqcm->idCmdLast); DestroyMenu(hmenu); } return NOERROR; } HRESULT ControlFolderView_InitMenuPopup( HWND hwnd, UINT idCmdFirst, int nIndex, HMENU hmenu) { return NOERROR; } HRESULT ControlFolderView_OnGetDetailsOf( HWND hwnd, UINT iColumn, PDETAILSINFO pdi) { BOOL bResult = TRUE; LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)pdi->pidl; if (iColumn >= NUM_COLUMNS) return E_NOTIMPL; pdi->str.uType = STRRET_CSTR; pdi->str.cStr[0] = '\0'; // if NULL, asking for column info if (pcpidl == NULL) { MLLoadString( s_ControlFolder_cols[iColumn].ids, pdi->str.cStr, ARRAYSIZE(pdi->str.cStr)); pdi->fmt = s_ControlFolder_cols[iColumn].iFmt; pdi->cxChar = s_ControlFolder_cols[iColumn].cchCol; return NOERROR; } switch (iColumn) { case SI_CONTROL: lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_CONTROL)); break; case SI_VERSION: lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_VERSION)); break; case SI_CREATION: lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_CREATION)); break; case SI_LASTACCESS: lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_LASTACCESS)); break; case SI_TOTALSIZE: GetSizeSaved(pcpidl, pdi->str.cStr); break; case SI_STATUS: GetStatus(pcpidl, pdi->str.cStr, sizeof(pdi->str.cStr)); break; default: bResult = FALSE; } return (bResult ? NOERROR : E_FAIL); } HRESULT ControlFolderView_OnColumnClick(HWND hwnd, UINT iColumn) { ShellFolderView_ReArrange(hwnd, iColumn); return NOERROR; } HRESULT ControlFolderView_DidDragDrop(HWND hwnd, IDataObject *pdo, DWORD dwEffect) { HRESULT hr = E_FAIL; if (dwEffect & DROPEFFECT_MOVE) { CControlItem *pCItem; if (SUCCEEDED(pdo->QueryInterface(CLSID_ControlFolder, (void **)&pCItem))) { hr = pCItem->Remove(hwnd); pCItem->Release(); } } return hr; } HRESULT CALLBACK ControlFolderView_ViewCallback( IShellView *psvOuter, IShellFolder *psf, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hres = NOERROR; switch (uMsg) { case DVM_GETHELPTEXT: { UINT id = LOWORD(wParam); UINT cchBuf = HIWORD(wParam); LPTSTR pszBuf = (LPTSTR)lParam; MLLoadString(id + IDS_HELP_SORTBYNAME ,pszBuf, cchBuf); } break; case DVM_DIDDRAGDROP: hres = ControlFolderView_DidDragDrop( hwnd, (IDataObject*)lParam, (DWORD)wParam); break; case DVM_INITMENUPOPUP: hres = ControlFolderView_InitMenuPopup( hwnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); break; case DVM_INVOKECOMMAND: ControlFolderView_Command(hwnd, (UINT)wParam); break; case DVM_COLUMNCLICK: hres = ControlFolderView_OnColumnClick(hwnd, (UINT)wParam); break; case DVM_GETDETAILSOF: hres = ControlFolderView_OnGetDetailsOf(hwnd, (UINT)wParam, (PDETAILSINFO)lParam); break; case DVM_MERGEMENU: hres = ControlFolderView_MergeMenu((LPQCMINFO)lParam); break; case DVM_DEFVIEWMODE: *(FOLDERVIEWMODE *)lParam = FVM_DETAILS; break; default: hres = E_FAIL; } return hres; } HRESULT ControlFolderView_CreateInstance( CControlFolder *pCFolder, LPCITEMIDLIST pidl, void **ppvOut) { CSFV csfv; csfv.cbSize = sizeof(csfv); csfv.pshf = (IShellFolder*)pCFolder; csfv.psvOuter = NULL; csfv.pidl = pidl; csfv.lEvents = SHCNE_DELETE | SHCNE_UPDATEITEM; // SHCNE_DISKEVENTS | SHCNE_ASSOCCHANGED | SHCNE_GLOBALEVENTS; csfv.pfnCallback = ControlFolderView_ViewCallback; csfv.fvm = (FOLDERVIEWMODE)0; // Have defview restore the folder view mode return SHCreateShellFolderViewEx(&csfv, (IShellView**)ppvOut); // &this->psv); }