[explorer_new]
[reactos.git] / base / shell / explorer-new / startmnu.c
index f03a677..ae8ac01 100644 (file)
@@ -18,7 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <precomp.h>
+#include "precomp.h"
 
 /*
  * Start menu button context menu
@@ -59,10 +59,10 @@ CreateContextMenuFromShellFolderPidl(IN HWND hWndOwner,
     hRet = IShellFolder_GetUIObjectOf(psf,
                                       hWndOwner,
                                       1,
-                                      (LPCITEMIDLIST*)&pidl, /* FIXME: shouldn't need a typecast! */
+                                      (LPCITEMIDLIST *)&pidl,
                                       &IID_IContextMenu,
                                       NULL,
-                                      (PVOID*)&pcm);
+                                      (PVOID *)&pcm);
     if (SUCCEEDED(hRet))
     {
         hPopup = CreatePopupMenu();
@@ -82,9 +82,10 @@ CreateContextMenuFromShellFolderPidl(IN HWND hWndOwner,
                 return hPopup;
             }
 
-            IContextMenu_Release(pcm);
             DestroyMenu(hPopup);
         }
+
+        IContextMenu_Release(pcm);
     }
 
     return NULL;
@@ -96,7 +97,7 @@ OnStartContextMenuCommand(IN HWND hWndOwner,
                           IN PVOID pcmContext  OPTIONAL,
                           IN PVOID Context  OPTIONAL)
 {
-    PSTARTMNU_CTMENU_CTX psmcmc = (PSTARTMNU_CTMENU_CTX)pcmContext;
+    PSTARTMNU_CTMENU_CTX psmcmc = pcmContext;
 
     if (uiCmdId != 0)
     {
@@ -231,7 +232,7 @@ CreateStartContextMenu(IN HWND hWndOwner,
                 hRet = IShellFolder_BindToObject(psfDesktop,
                                                  pidlStart,
                                                  NULL,
-                                                 (REFIID)&IID_IShellFolder, /* FIXME: Shouldn't require a typecast */
+                                                 &IID_IShellFolder,
                                                  (PVOID*)&psfStart);
                 if (SUCCEEDED(hRet))
                 {
@@ -255,7 +256,7 @@ CreateStartContextMenu(IN HWND hWndOwner,
                             AddStartContextMenuItems(hWndOwner,
                                                      hPopup);
 
-                            *((PSTARTMNU_CTMENU_CTX*)ppcmContext) = psmcmc;
+                            *ppcmContext = psmcmc;
                             return hPopup;
                         }
                         else
@@ -551,7 +552,15 @@ IStartMenuSiteImpl_AppendMenu(IN OUT ITrayPriv *iface,
                                           TEXT("Advanced"),
                                           TEXT("StartMenuLogoff")));
 
-    /* FIXME: Favorites */
+    /* Favorites */
+    if (!GetExplorerRegValueSet(HKEY_CURRENT_USER,
+                                TEXT("Advanced"),
+                                TEXT("StartMenuFavorites")))
+    {
+        DeleteMenu(hMenu,
+                   IDM_FAVORITES,
+                   MF_BYCOMMAND);
+    }
 
     /* Documents */
     if (SHRestricted(REST_NORECENTDOCSMENU))
@@ -772,14 +781,11 @@ IStartMenuSiteImpl_Construct(IN ITrayWindow *Tray)
     IStartMenuSiteImpl *This;
 
     This = HeapAlloc(hProcessHeap,
-                     0,
+                     HEAP_ZERO_MEMORY,
                      sizeof(*This));
     if (This == NULL)
         return NULL;
 
-    ZeroMemory(This,
-               sizeof(*This));
-
     This->lpVtbl = &IStartMenuSiteImpl_Vtbl;
     This->lpServiceProviderVtbl = &IServiceProviderImpl_Vtbl;
     This->lpStartMenuCallbackVtbl = &ITrayPrivImpl_Vtbl;
@@ -815,138 +821,142 @@ UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
 
     hRet = IMenuPopup_QueryInterface(pMenuPopup,
                                      &IID_IBanneredBar,
-                                     (PVOID)&pbb);
+                                     (PVOID *)&pbb);
     if (SUCCEEDED(hRet))
     {
-       // hRet = IBanneredBar_SetBitmap(pbb,
-       //                               hbmBanner);
-        hRet = pbb->lpVtbl->SetBitmap(pbb,
-                                      hbmBanner);
-
+        hRet = IBanneredBar_SetBitmap(pbb, hbmBanner);
 
         /* Update the icon size */
-        //hRet = IBanneredBar_SetIconSize(pbb,
-        //                                bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
-        hRet = pbb->lpVtbl->SetIconSize(pbb,
+        hRet = IBanneredBar_SetIconSize(pbb,
                                         bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
 
-        //IBanneredBar_Release(pbb);
-        pbb->lpVtbl->Release(pbb);
+        IBanneredBar_Release(pbb);
     }
 
     return hRet;
 }
 
-IMenuPopup*
+IMenuPopup *
 CreateStartMenu(IN ITrayWindow *Tray,
                 OUT IMenuBand **ppMenuBand,
                 IN HBITMAP hbmBanner  OPTIONAL,
                 IN BOOL bSmallIcons)
 {
-    HRESULT hRet;
+    HRESULT hr;
     IObjectWithSite *pOws = NULL;
     IMenuPopup *pMp = NULL;
     IStartMenuSite *pSms = NULL;
     IMenuBand *pMb = NULL;
     IInitializeObject *pIo;
-    IUnknown *pUnk;
-    IBandSite *pBs;
+    IUnknown *pUnk = NULL;
+    IBandSite *pBs = NULL;
     DWORD dwBandId = 0;
 
     pSms = CreateStartMenuSite(Tray);
     if (pSms == NULL)
         return NULL;
 
-    hRet = CoCreateInstance(&CLSID_StartMenu,
-                            NULL,
-                            CLSCTX_INPROC_SERVER,
-                            &IID_IMenuPopup,
-                            (PVOID*)&pMp);
-    if (SUCCEEDED(hRet))
+#if 0
+    hr = CoCreateInstance(&CLSID_StartMenu,
+                          NULL,
+                          CLSCTX_INPROC_SERVER,
+                          &IID_IMenuPopup,
+                          (PVOID *)&pMp);
+#else
+    hr = CStartMenu_Constructor(&IID_IMenuPopup,(PVOID *)&pMp);
+#endif
+    if (FAILED(hr))
     {
-        hRet = IMenuPopup_QueryInterface(pMp,
-                                         &IID_IObjectWithSite,
-                                         (PVOID*)&pOws);
-        if (SUCCEEDED(hRet))
-        {
-            /* Set the menu site so we can handle messages */
-            hRet = IObjectWithSite_SetSite(pOws,
-                                           (IUnknown*)pSms);
-            if (SUCCEEDED(hRet))
-            {
-                /* Initialize the menu object */
-                hRet = IMenuPopup_QueryInterface(pMp,
-                                                 &IID_IInitializeObject,
-                                                 (PVOID*)&pIo);
-                if (SUCCEEDED(hRet))
-                {
-                    //hRet = IInitializeObject_Initialize(pIo);
-                    hRet = pIo->lpVtbl->Initialize(pIo);
-
-                    //IInitializeObject_Release(pIo);
-                    pIo->lpVtbl->Release(pIo);
-                }
-                else
-                    hRet = S_OK;
-
-                /* Everything is initialized now. Let's get the IMenuBand interface. */
-                if (SUCCEEDED(hRet))
-                {
-                    hRet = IMenuPopup_GetClient(pMp,
-                                                &pUnk);
-
-                    if (SUCCEEDED(hRet))
-                    {
-                        hRet = IUnknown_QueryInterface(pUnk,
-                                                       &IID_IBandSite,
-                                                       (PVOID*)&pBs);
+        DbgPrint("CoCreateInstance failed: %x\n", hr);
+        goto cleanup;
+    }
 
-                        if (SUCCEEDED(hRet))
-                        {
-                            /* Finally we have the IBandSite interface, there's only one
-                               band in it that apparently provides the IMenuBand interface */
-                            hRet = IBandSite_EnumBands(pBs,
-                                                       0,
-                                                       &dwBandId);
-                            if (SUCCEEDED(hRet))
-                            {
-                                hRet = IBandSite_GetBandObject(pBs,
-                                                               dwBandId,
-                                                               &IID_IMenuBand,
-                                                               (PVOID*)&pMb);
-                            }
-
-                            IBandSite_Release(pBs);
-                        }
+    hr = IMenuPopup_QueryInterface(pMp,
+                                   &IID_IObjectWithSite,
+                                   (PVOID *)&pOws);
+    if (FAILED(hr))
+    {
+        DbgPrint("IMenuPopup_QueryInterface failed: %x\n", hr);
+        goto cleanup;
+    }
 
-                        IUnknown_Release(pUnk);
-                    }
-                }
-            }
+    /* Set the menu site so we can handle messages */
+    hr = IObjectWithSite_SetSite(pOws, (IUnknown *)pSms);
+    if (FAILED(hr))
+    {
+        DbgPrint("IObjectWithSite_SetSite failed: %x\n", hr);
+        goto cleanup;
+    }
 
-            IObjectWithSite_Release(pOws);
-        }
+    /* Initialize the menu object */
+    hr = IMenuPopup_QueryInterface(pMp, &IID_IInitializeObject, (PVOID*)&pIo);
+    if (SUCCEEDED(hr))
+    {
+        hr = IInitializeObject_Initialize(pIo);
+        IInitializeObject_Release(pIo);
     }
+    else
+        hr = S_OK;
 
-    IStartMenuSite_Release(pSms);
+    /* Everything is initialized now. Let's get the IMenuBand interface. */
+    if (FAILED(hr))
+    {
+        DbgPrint("IMenuPopup_QueryInterface failed: %x\n", hr);
+        goto cleanup;
+    }
 
-    if (!SUCCEEDED(hRet))
+    hr = IMenuPopup_GetClient(pMp, &pUnk);
+    if (FAILED(hr))
     {
-        DbgPrint("Failed to initialize the start menu: 0x%x!\n", hRet);
+        DbgPrint("IMenuPopup_GetClient failed: %x\n", hr);
+        goto cleanup;
+    }
 
-        if (pMp != NULL)
-            IMenuPopup_Release(pMp);
+    hr = IUnknown_QueryInterface(pUnk, &IID_IBandSite, (PVOID *)&pBs);
+    if (FAILED(hr))
+    {
+        DbgPrint("IUnknown_QueryInterface pBs failed: %x\n", hr);
+        goto cleanup;
+    }
 
-        if (pMb != NULL)
-            IMenuBand_Release(pMb);
+    /* Finally we have the IBandSite interface, there's only one
+       band in it that apparently provides the IMenuBand interface */
+    hr = IBandSite_EnumBands(pBs, 0, &dwBandId);
+    if (FAILED(hr))
+    {
+        DbgPrint("IBandSite_EnumBands failed: %x\n", hr);
+        goto cleanup;
+    }
 
-        return NULL;
+    hr = IBandSite_GetBandObject(pBs, dwBandId, &IID_IMenuBand, (PVOID *)&pMb);
+    if (FAILED(hr))
+    {
+        DbgPrint("IBandSite_GetBandObject failed: %x\n", hr);
+        goto cleanup;
     }
 
     UpdateStartMenu(pMp,
                     hbmBanner,
                     bSmallIcons);
 
-    *ppMenuBand = pMb;
+cleanup:
+    if (SUCCEEDED(hr))
+        *ppMenuBand = pMb;
+    else if (pMb != NULL)
+        IMenuBand_Release(pMb);
+
+    if (pBs != NULL)
+        IBandSite_Release(pBs);
+    if (pUnk != NULL)
+        IUnknown_Release(pUnk);
+    if (pOws != NULL)
+        IObjectWithSite_Release(pOws);
+    if (pMp != NULL)
+        IMenuPopup_Release(pMp);
+    if (pSms != NULL)
+        IStartMenuSite_Release(pSms);
+
+    if (FAILED(hr))
+        return NULL;
     return pMp;
 }