[RSHELL]
[reactos.git] / base / shell / rshell / CMenuBand.cpp
index 344fdad..a9979b9 100644 (file)
@@ -72,6 +72,9 @@ CMenuBand::~CMenuBand()
 
     if (m_SFToolbar)
         delete m_SFToolbar;
+
+    if (m_hmenu)
+        DestroyMenu(m_hmenu);
 }
 
 HRESULT STDMETHODCALLTYPE  CMenuBand::Initialize(
@@ -129,6 +132,12 @@ HRESULT STDMETHODCALLTYPE  CMenuBand::SetMenu(
 
     BOOL created = FALSE;
 
+    if (m_hmenu)
+    {
+        DestroyMenu(m_hmenu);
+        m_hmenu = NULL;
+    }
+
     if (m_staticToolbar == NULL)
     {
         m_staticToolbar = new CMenuStaticToolbar(this);
@@ -619,21 +628,22 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetClient(IUnknown *punkClient)
         return S_OK;
     }
 
-    HRESULT hr = punkClient->QueryInterface(IID_PPV_ARG(IMenuPopup, &m_subMenuChild));
-
-    return hr;
+    return punkClient->QueryInterface(IID_PPV_ARG(IMenuPopup, &m_subMenuChild));
 }
 
 HRESULT STDMETHODCALLTYPE CMenuBand::GetClient(IUnknown **ppunkClient)
 {
     // HACK, so I can test for a submenu in the DeskBar
-    if (ppunkClient)
+    if (!ppunkClient)
+        return E_POINTER;
+    *ppunkClient = NULL;
+
+    if (m_subMenuChild)
     {
-        if (m_subMenuChild)
-            *ppunkClient = m_subMenuChild;
-        else
-            *ppunkClient = NULL;
+        m_subMenuChild->AddRef();
+        *ppunkClient = m_subMenuChild;
     }
+
     return S_OK;
 }
 
@@ -900,6 +910,7 @@ HRESULT  CMenuBand::_KeyboardItemChange(DWORD change)
 
 HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType)
 {
+    CComPtr<CMenuBand> safeThis = this;
     HRESULT hr;
 
     if (m_dwFlags & SMINIT_VERTICAL)
@@ -938,13 +949,18 @@ HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType)
     switch (changeType)
     {
     case MPOS_EXECUTE:
+    {
+        CMenuToolbarBase * tb = m_hotBar;
+        int item = m_hotItem;
+        tb->PrepareExecuteItem(item);
         if (m_subMenuParent)
         {
             m_subMenuParent->OnSelect(changeType);
         }
-        m_hotBar->ExecuteItem(m_hotItem);
+        TRACE("Menu closed, executing item...\n");
+        tb->ExecuteItem();
         break;
-
+    }
     case MPOS_SELECTLEFT:
         if (m_parentBand && m_parentBand->_IsPopup()==S_FALSE)
             return m_parentBand->_MenuItemHotTrack(VK_LEFT);