[RSHELL]
[reactos.git] / base / shell / rshell / CStartMenu.cpp
index 5307050..79c7864 100644 (file)
 
 #include "CMergedFolder.h"
 
+// TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
+IID IID_IAugmentedShellFolder = { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
+IID IID_IAugmentedShellFolder2 = { 0x8DB3B3F4, 0x6CFE, 0x11D1, { 0x8A, 0xE9, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0 } };
+CLSID CLSID_MergedFolder = { 0x26FDC864, 0xBE88, 0x46E7, { 0x92, 0x35, 0x03, 0x2D, 0x8E, 0xA5, 0x16, 0x2E } };
+
 //#define TEST_TRACKPOPUPMENU_SUBMENUS
 
 
@@ -146,7 +151,14 @@ private:
         int csidl = 0;
         IShellMenu *pShellMenu;
 
+#if USE_SYSTEM_MENUBAND
+        hr = CoCreateInstance(CLSID_MenuBand,
+            NULL,
+            CLSCTX_INPROC_SERVER,
+            IID_PPV_ARG(IShellMenu, &pShellMenu));
+#else
         hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
+#endif
         if (FAILED_UNEXPECTEDLY(hr))
             return hr;
 
@@ -216,12 +228,21 @@ private:
 
     HRESULT OnExec(LPSMDATA psmd)
     {
+        // H   H   A    CCC  K   K  ! ! !
+        // H   H  A A  C   C K  K   ! ! !
+        // HHHHH AAAAA C     KKK    ! ! !
+        // H   H A   A C   C K  K   ! ! !
+        // H   H A   A  CCC  K   K  . . .
+        //
+        // HACK: Instead of running explorer.exe with the path, we should be using ShellExecute to "open" the path directly!
+        // Remove once ShellExecute can handle CLSID path components.
+
         if (psmd->uId == IDM_CONTROLPANEL)
-            ShellExecuteW(NULL, L"open", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", NULL, NULL, 1);
+            ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", NULL, SW_SHOWNORMAL);
         else if (psmd->uId == IDM_NETWORKCONNECTIONS)
-            ShellExecuteW(NULL, L"open", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", NULL, NULL, 1);
+            ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", NULL, SW_SHOWNORMAL);
         else if (psmd->uId == IDM_PRINTERSANDFAXES)
-            ShellExecuteW(NULL, L"open", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}", NULL, NULL, 1);
+            {}/* FIXME: crashes: ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}", NULL, SW_SHOWNORMAL);*/
         else
             PostMessageW(m_hwndTray, WM_COMMAND, psmd->uId, 0);
 
@@ -241,16 +262,13 @@ public:
         IBandSite* pBandSite,
         IDeskBar* pDeskBar)
     {
-        m_pShellMenu.Attach(pShellMenu);
-        m_pBandSite.Attach(pBandSite);
-        m_pDeskBar.Attach(pDeskBar);
+        m_pShellMenu = pShellMenu;
+        m_pBandSite = pBandSite;
+        m_pDeskBar = pDeskBar;
     }
 
     ~CShellMenuCallback()
     {
-        m_pShellMenu.Release();
-        m_pBandSite.Release();
-        m_pDeskBar.Release();
     }
 
     HRESULT _SetProgramsFolder(IShellFolder * psf, LPITEMIDLIST pidl)
@@ -305,11 +323,14 @@ HRESULT BindToDesktop(LPCITEMIDLIST pidl, IShellFolder ** ppsfResult)
     return hr;
 }
 
-HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
+static HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
 {
     HRESULT hr;
     LPITEMIDLIST pidlUserStartMenu;
     LPITEMIDLIST pidlCommonStartMenu;
+    CComPtr<IShellFolder> psfUserStartMenu;
+    CComPtr<IShellFolder> psfCommonStartMenu;
+    CComPtr<IAugmentedShellFolder> pasf;
 
     *ppsfStartMenu = NULL;
 
@@ -324,27 +345,22 @@ HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
         return hr;
     }
 
-    CComPtr<IShellFolder> psfUserStartMenu;
     hr = BindToDesktop(pidlUserStartMenu, &psfUserStartMenu);
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
-    CComPtr<IShellFolder> psfCommonStartMenu;
     hr = BindToDesktop(pidlCommonStartMenu, &psfCommonStartMenu);
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
-#if CUSTOM_MERGE_FOLDERS
-    IShellFolder * psfMerged;
-    hr = CMergedFolder_Constructor(psfUserStartMenu, psfCommonStartMenu, IID_PPV_ARG(IShellFolder, &psfMerged));
-    if (FAILED_UNEXPECTEDLY(hr))
-        return hr;
+#if 1
+    hr = CMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder, &pasf));
 #else
-    CComPtr<IAugmentedShellFolder> pasf;
     hr = CoCreateInstance(CLSID_MergedFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IAugmentedShellFolder, &pasf));
+#endif
     if (FAILED_UNEXPECTEDLY(hr))
     {
-        hr = BindToDesktop(pidlUserStartMenu, ppsfStartMenu);
+        *ppsfStartMenu = psfUserStartMenu.Detach();
         ILFree(pidlCommonStartMenu);
         ILFree(pidlUserStartMenu);
         return hr;
@@ -360,7 +376,6 @@ HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
 
     hr = pasf->QueryInterface(IID_PPV_ARG(IShellFolder, ppsfStartMenu));
     pasf.Release();
-#endif
 
     ILFree(pidlCommonStartMenu);
     ILFree(pidlUserStartMenu);
@@ -372,25 +387,47 @@ extern "C"
 HRESULT WINAPI
 CStartMenu_Constructor(REFIID riid, void **ppv)
 {
-    IShellMenu* pShellMenu;
-    IBandSite* pBandSite;
-    IDeskBar* pDeskBar;
+    CComPtr<IShellMenu> pShellMenu;
+    CComPtr<IBandSite> pBandSite;
+    CComPtr<IDeskBar> pDeskBar;
 
     HRESULT hr;
     IShellFolder * psf;
 
+    LPITEMIDLIST pidlProgramsAbsolute;
     LPITEMIDLIST pidlPrograms;
     CComPtr<IShellFolder> psfPrograms;
 
+#if USE_SYSTEM_MENUBAND
+    hr = CoCreateInstance(CLSID_MenuBand,
+                          NULL,
+                          CLSCTX_INPROC_SERVER,
+                          IID_PPV_ARG(IShellMenu, &pShellMenu));
+#else
     hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
+#endif
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
+#if USE_SYSTEM_MENUSITE
+    hr = CoCreateInstance(CLSID_MenuBandSite,
+                          NULL,
+                          CLSCTX_INPROC_SERVER,
+                          IID_PPV_ARG(IBandSite, &pBandSite));
+#else
     hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
+#endif
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
+#if USE_SYSTEM_MENUDESKBAR
+    hr = CoCreateInstance(CLSID_MenuDeskBar,
+                          NULL,
+                          CLSCTX_INPROC_SERVER,
+                          IID_PPV_ARG(IDeskBar, &pDeskBar));
+#else
     hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
+#endif
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
@@ -409,10 +446,13 @@ CStartMenu_Constructor(REFIID riid, void **ppv)
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
-    hr = psf->ParseDisplayName(NULL, NULL, L"Programs", NULL, &pidlPrograms, NULL);
+    hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlProgramsAbsolute);
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
+    pidlPrograms = ILClone(ILFindLastID(pidlProgramsAbsolute));
+    ILFree(pidlProgramsAbsolute);
+
     hr = psf->BindToObject(pidlPrograms, NULL, IID_PPV_ARG(IShellFolder, &psfPrograms));
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;