267 lines
7.2 KiB
C++
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);
|
|
}
|