public:
CControlPanelEnum();
~CControlPanelEnum();
- HRESULT WINAPI Initialize(DWORD dwFlags);
+ HRESULT WINAPI Initialize(DWORD dwFlags, IEnumIDList* pRegEnumerator);
BOOL RegisterCPanelApp(LPCWSTR path);
int RegisterRegistryCPanelApps(HKEY hkey_root, LPCWSTR szRepPath);
- int RegisterCPanelFolders(HKEY hkey_root, LPCWSTR szRepPath);
BOOL CreateCPanelEnumList(DWORD dwFlags);
BEGIN_COM_MAP(CControlPanelEnum)
*/
static const shvheader ControlPanelSFHeader[] = {
- {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20},/*FIXME*/
- {IDS_SHV_COLUMN9, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 80},/*FIXME*/
+ {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20},/*FIXME*/
+ {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 80},/*FIXME*/
};
#define CONROLPANELSHELLVIEWCOLUMNS 2
{
}
-HRESULT WINAPI CControlPanelEnum::Initialize(DWORD dwFlags)
+HRESULT WINAPI CControlPanelEnum::Initialize(DWORD dwFlags, IEnumIDList* pRegEnumerator)
{
if (CreateCPanelEnumList(dwFlags) == FALSE)
return E_FAIL;
+ AppendItemsFromEnumerator(pRegEnumerator);
return S_OK;
}
{
PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl);
if (!pData)
- {
- return CGuidItemExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
- }
+ return E_FAIL;
CComPtr<IDefaultExtractIconInit> initIcon;
HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon));
- if (FAILED(hr))
- return NULL;
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
initIcon->SetNormalIcon(pData->szName, (int)pData->iconIdx != -1 ? pData->iconIdx : 0);
return cnt;
}
-int CControlPanelEnum::RegisterCPanelFolders(HKEY hkey_root, LPCWSTR szRepPath)
-{
- WCHAR name[MAX_PATH];
- HKEY hkey;
-
- int cnt = 0;
-
- if (RegOpenKeyW(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS)
- {
- for (int idx = 0; ; idx++)
- {
- if (RegEnumKeyW(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS)
- break;
-
- if (*name == '{')
- {
- LPITEMIDLIST pidl = _ILCreateGuidFromStrW(name);
-
- if (pidl && AddToEnumList(pidl))
- ++cnt;
- }
- }
-
- RegCloseKey(hkey);
- }
-
- return cnt;
-}
-
/**************************************************************************
* CControlPanelEnum::CreateCPanelEnumList()
*/
TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags);
- /* enumerate control panel folders */
- if (dwFlags & SHCONTF_FOLDERS)
- RegisterCPanelFolders(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace");
-
/* enumerate the control panel applets */
if (dwFlags & SHCONTF_NONFOLDERS)
{
SHFree(pidlRoot);
}
-HRESULT WINAPI CControlPanelFolder::FinalConstruct()
-{
- pidlRoot = _ILCreateControlPanel(); /* my qualified pidl */
- if (pidlRoot == NULL)
- return E_OUTOFMEMORY;
- return S_OK;
-}
-
/**************************************************************************
* CControlPanelFolder::ParseDisplayName
*/
DWORD *pdwAttributes)
{
/* We only support parsing guid names */
- return SH_ParseGuidDisplayName(this, hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes);
+ return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes);
}
/**************************************************************************
*/
HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{
- return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, IID_IEnumIDList, ppEnumIDList);
+ CComPtr<IEnumIDList> pRegEnumerator;
+ m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
+
+ return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
}
/**************************************************************************
REFIID riid,
LPVOID *ppvOut)
{
- return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
+ return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
}
/**************************************************************************
WARN("IContextMenu not implemented\n");
hr = E_NOTIMPL;
} else if (IsEqualIID(riid, IID_IShellView)) {
- hr = CDefView_Constructor(this, riid, ppvOut);
+ SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
+ hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
}
}
TRACE("--(%p)->(interface=%p)\n", this, ppvOut);
if (_ILIsCPanelStruct(*apidl))
*rgfInOut &= SFGAO_CANLINK;
else if (_ILIsSpecialFolder(*apidl))
- SHELL32_GetGuidItemAttributes(this, *apidl, rgfInOut);
+ m_regFolder->GetAttributesOf(1, apidl, rgfInOut);
else
ERR("Got an unkown pidl here!\n");
apidl++;
if (bHasCpl)
hr = ShellObjectCreatorInit<CCPLItemMenu>(cidl, apidl, riid, &pObj);
else
- hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)this, NULL, 0, NULL, (IContextMenu**)&pObj);
+ hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
} else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) {
hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, (IDataObject **)&pObj);
} else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1)) {
- hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+ if (_ILGetCPanelPointer(apidl[0]))
+ hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+ else
+ hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
} else {
hr = E_NOINTERFACE;
}
}
else if (_ILIsSpecialFolder(pidl))
{
- static const WCHAR* pszCPanelPath = L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}";
- return SHELL32_GetDisplayNameOfGUIDItem(this, pszCPanelPath, pidl, dwFlags, strRet);
+ return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
}
- return S_OK;
+ return E_FAIL;
}
/**************************************************************************
}
else if (_ILIsSpecialFolder(pidl))
{
- return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
+ return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
}
else
{
SHFree((LPVOID)pidlRoot);
pidlRoot = ILClone(pidl);
+
+ /* Create the inner reg folder */
+ HRESULT hr;
+ static const WCHAR* pszCPanelPath = L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}";
+ hr = CRegFolder_CreateInstance(&CLSID_ControlPanel,
+ pidlRoot,
+ pszCPanelPath,
+ L"ControlPanel",
+ IID_PPV_ARG(IShellFolder2, &m_regFolder));
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
return S_OK;
}