[RSHELL]
[reactos.git] / base / shell / rshell / CMenuBand.cpp
index 9487bf8..30703b5 100644 (file)
@@ -348,22 +348,6 @@ HRESULT STDMETHODCALLTYPE  CMenuBand::ShowDW(BOOL fShow)
             return hr;
     }
 
-    CComPtr<IServiceProvider> sp;
-    CComPtr<IUnknown> unk0;
-    CComPtr<IDeskBar> db0, db, db1;
-    if (SUCCEEDED(IUnknown_GetSite(m_subMenuParent, IID_PPV_ARG(IServiceProvider, &sp))) && 
-        SUCCEEDED(sp->QueryInterface(IID_PPV_ARG(IDeskBar, &db0))) &&
-        SUCCEEDED(db0->GetClient(&unk0)) &&
-        SUCCEEDED(IUnknown_QueryService(unk0, SID_SMenuBandChild, IID_PPV_ARG(IDeskBar, &db))) &&
-        SUCCEEDED(IUnknown_QueryService(m_site, SID_SMenuBandParent, IID_PPV_ARG(IDeskBar, &db1))))
-    {
-        if (fShow)
-            db->SetClient(db1);
-        else
-            db->SetClient(NULL);
-    }
-
-    if (m_dwFlags & SMINIT_VERTICAL)
     {
         if (fShow)
             hr = m_focusManager->PushMenu(this);
@@ -513,14 +497,13 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetClient(IUnknown *punkClient)
     if (m_subMenuChild)
         m_subMenuChild = NULL;
     if (!punkClient)
-        return S_OK;
-    HRESULT hr =  punkClient->QueryInterface(IID_PPV_ARG(IMenuPopup, &m_subMenuChild));
-    m_trackingPopup = m_subMenuChild != NULL;
-    if (!m_trackingPopup)
     {
         if (m_staticToolbar) m_staticToolbar->OnPopupItemChanged(NULL, -1);
         if (m_SFToolbar) m_SFToolbar->OnPopupItemChanged(NULL, -1);
+        return S_OK;
     }
+    HRESULT hr =  punkClient->QueryInterface(IID_PPV_ARG(IMenuPopup, &m_subMenuChild));
+    m_trackingPopup = m_subMenuChild != NULL;
     return hr;
 }
 
@@ -680,6 +663,7 @@ HRESULT CMenuBand::_TrackSubMenuUsingTrackPopupMenu(HMENU popup, INT x, INT y, R
     UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN;
 
     m_trackingPopup = TRUE;
+    m_focusManager->PushTrackedPopup(this, popup);
     if (m_menuOwner)
     {
         ::TrackPopupMenuEx(popup, flags, x, y, m_menuOwner, &params);
@@ -689,6 +673,7 @@ HRESULT CMenuBand::_TrackSubMenuUsingTrackPopupMenu(HMENU popup, INT x, INT y, R
         ::TrackPopupMenuEx(popup, flags, x, y, m_topLevelWindow, &params);
     }
     m_trackingPopup = FALSE;
+    m_focusManager->PopTrackedPopup(this, popup);
 
     return S_OK;
 }
@@ -716,7 +701,52 @@ HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType)
 {
     HRESULT hr;
 
-    if (changeType == VK_DOWN)
+    if (!(m_dwFlags & SMINIT_VERTICAL))
+    {
+        if (changeType == MPOS_SELECTRIGHT)
+        {
+            SendMessageW(m_menuOwner, WM_CANCELMODE, 0, 0);
+            if (m_SFToolbar && (m_hotBar == m_SFToolbar || m_hotBar == NULL))
+            {
+                DbgPrint("SF Toolbars in Horizontal menus is not implemented.\n");
+                return S_FALSE;
+            }
+            else if (m_staticToolbar && m_hotBar == m_staticToolbar)
+            {
+                hr = m_staticToolbar->ChangeHotItem(VK_DOWN);
+                if (hr == S_FALSE)
+                {
+                    if (m_SFToolbar)
+                        return m_SFToolbar->ChangeHotItem(VK_HOME);
+                    else
+                        return m_staticToolbar->ChangeHotItem(VK_HOME);
+                }
+                return hr;
+            }
+        }
+        else if (changeType == MPOS_SELECTLEFT)
+        {
+            SendMessageW(m_menuOwner, WM_CANCELMODE, 0, 0);
+            if (m_staticToolbar && (m_hotBar == m_staticToolbar || m_hotBar == NULL))
+            {
+                hr = m_staticToolbar->ChangeHotItem(VK_UP);
+                if (hr == S_FALSE)
+                {
+                    if (m_SFToolbar)
+                        return m_SFToolbar->ChangeHotItem(VK_END);
+                    else
+                        return m_staticToolbar->ChangeHotItem(VK_END);
+                }
+                return hr;
+            }
+            else if (m_SFToolbar && m_hotBar == m_SFToolbar)
+            {
+                DbgPrint("SF Toolbars in Horizontal menus is not implemented.\n");
+                return S_FALSE;
+            }
+        }
+    }
+    else if (changeType == VK_DOWN)
     {
         if (m_SFToolbar && (m_hotBar == m_SFToolbar || m_hotBar == NULL))
         {