windows-nt/Source/XPSP1/NT/shell/ext/occache/view.cpp
2020-09-26 16:20:57 +08:00

267 lines
7.2 KiB
C++

#include "folder.h"
#include "item.h"
#include "utils.h"
#include <mluisupp.h>
///////////////////////////////////////////////////////////////////////////////
// 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);
}