[SHELL32]
[reactos.git] / reactos / dll / win32 / shell32 / folders / CControlPanelFolder.cpp
index 6943f28..8dc2fbb 100644 (file)
@@ -33,10 +33,9 @@ class CControlPanelEnum :
     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)
@@ -49,8 +48,8 @@ class 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
@@ -63,10 +62,11 @@ CControlPanelEnum::~CControlPanelEnum()
 {
 }
 
-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;
 }
 
@@ -129,14 +129,12 @@ HRESULT CCPLExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, R
 {
     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);
 
@@ -205,35 +203,6 @@ int CControlPanelEnum::RegisterRegistryCPanelApps(HKEY hkey_root, LPCWSTR szRepP
     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()
  */
@@ -245,10 +214,6 @@ BOOL CControlPanelEnum::CreateCPanelEnumList(DWORD dwFlags)
 
     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)
     {
@@ -293,14 +258,6 @@ CControlPanelFolder::~CControlPanelFolder()
     SHFree(pidlRoot);
 }
 
-HRESULT WINAPI CControlPanelFolder::FinalConstruct()
-{
-    pidlRoot = _ILCreateControlPanel();    /* my qualified pidl */
-    if (pidlRoot == NULL)
-        return E_OUTOFMEMORY;
-    return S_OK;
-}
-
 /**************************************************************************
 *    CControlPanelFolder::ParseDisplayName
 */
@@ -313,7 +270,7 @@ HRESULT WINAPI 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);
 }
 
 /**************************************************************************
@@ -321,7 +278,10 @@ HRESULT WINAPI CControlPanelFolder::ParseDisplayName(
 */
 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));
 }
 
 /**************************************************************************
@@ -333,7 +293,7 @@ HRESULT WINAPI CControlPanelFolder::BindToObject(
     REFIID riid,
     LPVOID *ppvOut)
 {
-    return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
+    return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
 }
 
 /**************************************************************************
@@ -404,7 +364,8 @@ HRESULT WINAPI CControlPanelFolder::CreateViewObject(HWND hwndOwner, REFIID riid
             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);
@@ -443,7 +404,7 @@ HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_A
             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++;
@@ -496,11 +457,14 @@ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner,
             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;
         }
@@ -530,11 +494,10 @@ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD
     }
     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;
 }
 
 /**************************************************************************
@@ -605,7 +568,7 @@ HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iCol
     }
     else if (_ILIsSpecialFolder(pidl))
     {
-        return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
+        return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
     }
     else 
     {
@@ -657,6 +620,18 @@ HRESULT WINAPI CControlPanelFolder::Initialize(LPCITEMIDLIST pidl)
         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;
 }