Author: dquintana
Date: Tue Feb 18 13:55:57 2014
New Revision: 62243

URL: http://svn.reactos.org/svn/reactos?rev=62243&view=rev
Log:
[RSHELL]
* CMenuBand: Improve wrapper logging to get a better picture. Handle more SIDs 
on QueryService. Send selection messages on hot item changed and on execute.
* CMenuDeskBar: Improve wrapper logging to get a better picture. Handle more 
SIDs on QueryService. Begin handling more cases in OnSelect.
CORE-7881

Modified:
    branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
    branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp

Modified: branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/CMenuBand.cpp?rev=62243&r1=62242&r2=62243&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuBand.cpp  [iso-8859-1] 
(original)
+++ branches/shell-experiments/base/shell/rshell/CMenuBand.cpp  [iso-8859-1] 
Tue Feb 18 13:55:57 2014
@@ -23,7 +23,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand);
 
-#define WRAP_LOG 0
+#define WRAP_LOG 1
 
 #define TBSTYLE_EX_VERTICAL 4
 
@@ -50,7 +50,7 @@
     virtual HRESULT FillToolbar() = 0;
     virtual HRESULT PopupItem(UINT uItem) = 0;
     virtual HRESULT HasSubMenu(UINT uItem) = 0;
-    virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT 
*theResult) = 0;
+    virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT 
*theResult);
     virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
 
     HRESULT OnHotItemChange(const NMTBHOTITEM * hot);
@@ -646,8 +646,45 @@
         WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self 
instead of wrapped object.\n");
         HRESULT hr = this->QueryInterface(riid, ppvObject);
         if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
-        WrapLogExit("CMenuBand::QueryService() = %08x\n", hr);
-        return hr;
+        if (SUCCEEDED(hr))
+        {
+            WrapLogExit("CMenuBand::QueryService() = %08x\n", hr);
+            return hr;
+        }
+        else
+        {
+            WrapLogMsg("QueryInterface on wrapper failed. Handing over to 
innter object.\n");
+        }
+    }
+    else if (IsEqualIID(guidService, SID_SMenuBandBottom))
+    {
+        WrapLogMsg("SID is SID_SMenuBandBottom. Using QueryInterface of self 
instead of wrapped object.\n");
+        HRESULT hr = this->QueryInterface(riid, ppvObject);
+        if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
+        if (SUCCEEDED(hr))
+        {
+            WrapLogExit("CMenuBand::QueryService() = %08x\n", hr);
+            return hr;
+        }
+        else
+        {
+            WrapLogMsg("QueryInterface on wrapper failed. Handing over to 
innter object.\n");
+        }
+    }
+    else if (IsEqualIID(guidService, SID_SMenuBandBottomSelected))
+    {
+        WrapLogMsg("SID is SID_SMenuBandBottomSelected. Using QueryInterface 
of self instead of wrapped object.\n");
+        HRESULT hr = this->QueryInterface(riid, ppvObject);
+        if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
+        if (SUCCEEDED(hr))
+        {
+            WrapLogExit("CMenuBand::QueryService() = %08x\n", hr);
+            return hr;
+        }
+        else
+        {
+            WrapLogMsg("QueryInterface on wrapper failed. Handing over to 
innter object.\n");
+        }
     }
     else
     {
@@ -960,6 +997,7 @@
         }
     }
 
+    m_menuBand->OnSelect(MPOS_CHILDTRACKING);
     return S_OK;
 }
 
@@ -1052,6 +1090,12 @@
 
     DestroyMenu(hPopup);
     return hr;
+}
+
+HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT 
*theResult)
+{
+    m_menuBand->OnSelect(MPOS_EXECUTE);
+    return S_OK;
 }
 
 BOOL
@@ -1163,7 +1207,11 @@
 
 HRESULT CMenuStaticToolbar::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT 
*theResult)
 {
-    return m_menuBand->CallCBWithId(wParam, SMC_EXEC, 0, 0);
+    HRESULT hr = m_menuBand->CallCBWithId(wParam, SMC_EXEC, 0, 0);
+    if (FAILED(hr))
+        return hr;
+
+    return CMenuToolbarBase::OnCommand(wParam, lParam, theResult);
 }
 
 HRESULT CMenuStaticToolbar::PopupItem(UINT uItem)
@@ -1817,7 +1865,9 @@
 
 HRESULT STDMETHODCALLTYPE CMenuBand::QueryService(REFGUID guidService, REFIID 
riid, void **ppvObject)
 {
-    if (IsEqualIID(guidService, SID_SMenuBandChild))
+    if (IsEqualIID(guidService, SID_SMenuBandChild) ||
+        IsEqualIID(guidService, SID_SMenuBandBottom) || 
+        IsEqualIID(guidService, SID_SMenuBandBottomSelected))
         return this->QueryInterface(riid, ppvObject);
     WARN("Unknown service requested %s\n", wine_dbgstr_guid(&guidService));
     return E_NOINTERFACE;
@@ -1831,7 +1881,11 @@
 
 HRESULT STDMETHODCALLTYPE CMenuBand::OnSelect(DWORD dwSelectType)
 {
-    UNIMPLEMENTED;
+    CComPtr<IMenuPopup> pmp;
+    HRESULT hr = IUnknown_QueryService(m_site, SID_SMenuPopup, 
IID_PPV_ARG(IMenuPopup, &pmp));
+    if (FAILED(hr))
+        return hr;
+    pmp->OnSelect(dwSelectType);
     return S_OK;
 }
 

Modified: branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp?rev=62243&r1=62242&r2=62243&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp       
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp       
[iso-8859-1] Tue Feb 18 13:55:57 2014
@@ -24,7 +24,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(CMenuDeskBar);
 
-#define WRAP_LOG 0
+#define WRAP_LOG 1
 
 typedef CWinTraits<
     WS_POPUP | WS_DLGFRAME | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
@@ -65,19 +65,13 @@
     IInitializeObject * m_IInitializeObject;
 #else
 
-    CComPtr<IUnknown>                       m_Site;
-    CComPtr<IUnknown>                       m_Client;
-    HWND                                    m_ClientWindow;
-    bool                                    m_Vertical;
-    bool                                    m_Visible;
-    int                                     m_NeededSize;        // width or 
height
+    CComPtr<IUnknown>   m_Site;
+    CComPtr<IUnknown>   m_Client;
+    CComPtr<IMenuPopup> m_SubMenuParent;
 
     DWORD m_IconSize;
     HBITMAP m_Banner;
 
-    // used by resize tracking loop
-    bool                                    m_Tracking;
-    POINT                                   m_LastLocation;
 #endif
 
 public:
@@ -132,7 +126,6 @@
     BEGIN_MSG_MAP(CMenuDeskBar)
         MESSAGE_HANDLER(WM_SIZE, OnSize)
         MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
-        MESSAGE_HANDLER(WM_CANCELMODE, OnCancelMode)
         MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
         MESSAGE_HANDLER(WM_PAINT, OnPaint)
     END_MSG_MAP()
@@ -140,7 +133,6 @@
     // message handlers
     LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
     LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
-    LRESULT OnCancelMode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
     LRESULT OnWindowPosChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
     LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
 
@@ -333,19 +325,7 @@
 
 HRESULT STDMETHODCALLTYPE CMenuDeskBar::Exec(const GUID *pguidCmdGroup, DWORD 
nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
 {
-    //bool b;
-
     WrapLogEnter("CMenuDeskBar<%p>::Exec(const GUID *pguidCmdGroup=%p, DWORD 
nCmdID=%d, DWORD nCmdexecopt=%d, VARIANT *pvaIn=%p, VARIANT *pvaOut=%p)\n", 
this, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
-
-    //if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CLSID_MenuBand))
-    //{
-    //    if (nCmdID == 19) // popup
-    //    {
-    //        b = true;
-    //    }
-    //}
-
-
     if (pguidCmdGroup) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup));
     HRESULT hr = m_IOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdexecopt, 
pvaIn, pvaOut);
     WrapLogExit("CMenuDeskBar::Exec() = %08x\n", hr);
@@ -357,17 +337,54 @@
 {
     WrapLogEnter("CMenuDeskBar<%p>::QueryService(REFGUID guidService=%s, 
REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService), Wrap(riid), 
ppvObject);
 
-    //if (IsEqualIID(guidService, SID_SMenuBandChild))
-    //{
-    //    WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self 
instead of wrapped object.\n");
-    //    HRESULT hr = this->QueryInterface(riid, ppvObject);
-    //    if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
-    //    WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
-    //    return hr;
-    //}
-    //else
-    {
-        WrapLogMsg("SID not identified.\n");
+    if (IsEqualIID(guidService, SID_SMenuPopup))
+    {
+        WrapLogMsg("SID is SID_SMenuPopup. Using QueryInterface of self 
instead of wrapped object.\n");
+        HRESULT hr = this->QueryInterface(riid, ppvObject);
+        if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
+        if (SUCCEEDED(hr))
+        {
+            WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
+            return hr;
+        }
+        else
+        {
+            WrapLogMsg("QueryInterface on wrapper failed. Handing over to 
innter object.\n");
+        }
+    }
+    else if (IsEqualIID(guidService, SID_SMenuBandParent))
+    {
+        WrapLogMsg("SID is SID_SMenuBandParent. Using QueryInterface of self 
instead of wrapped object.\n");
+        HRESULT hr = this->QueryInterface(riid, ppvObject);
+        if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
+        if (SUCCEEDED(hr))
+        {
+            WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
+            return hr;
+        }
+        else
+        {
+            WrapLogMsg("QueryInterface on wrapper failed. Handing over to 
innter object.\n");
+        }
+    }
+    else if (IsEqualIID(guidService, SID_STopLevelBrowser))
+    {
+        WrapLogMsg("SID is SID_STopLevelBrowser. Using QueryInterface of self 
instead of wrapped object.\n");
+        HRESULT hr = this->QueryInterface(riid, ppvObject);
+        if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
+        if (SUCCEEDED(hr))
+        {
+            WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
+            return hr;
+        }
+        else
+        {
+            WrapLogMsg("QueryInterface on wrapper failed. Handing over to 
innter object.\n");
+        }
+    }
+    else
+    {
+        WrapLogMsg("SID not identified. Calling wrapped object's 
QueryService.\n");
     }
     HRESULT hr = m_IServiceProvider->QueryService(guidService, riid, 
ppvObject);
     if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
@@ -416,6 +433,11 @@
     WrapLogEnter("CMenuDeskBar<%p>::SetClient(IUnknown *punkClient=%p)\n", 
this, punkClient);
     HRESULT hr = m_IDeskBar->SetClient(punkClient);
     WrapLogExit("CMenuDeskBar::SetClient() = %08x\n", hr);
+
+    CComPtr<IDeskBarClient> dbc;
+    punkClient->QueryInterface(IID_PPV_ARG(IDeskBarClient, &dbc));
+    dbc->SetDeskBarSite(static_cast<IDeskBar*>(this));
+
     return hr;
 }
 
@@ -440,11 +462,6 @@
 
 CMenuDeskBar::CMenuDeskBar() :
     m_Client(NULL),
-    m_ClientWindow(NULL),
-    m_Vertical(true),
-    m_Visible(false),
-    m_NeededSize(200),
-    m_Tracking(false),
     m_Banner(NULL)
 {
 }
@@ -510,7 +527,9 @@
     if (m_Site == NULL)
         return E_FAIL;
 
-    if (IsEqualGUID(guidService, SID_SMenuPopup))
+    if (IsEqualGUID(guidService, SID_SMenuPopup) ||
+        IsEqualGUID(guidService, SID_SMenuBandParent) ||
+        IsEqualGUID(guidService, SID_STopLevelBrowser))
     {
         return this->QueryInterface(riid, ppvObject);
     }
@@ -654,12 +673,6 @@
     return result;
 }
 
-LRESULT CMenuDeskBar::OnCancelMode(UINT uMsg, WPARAM wParam, LPARAM lParam, 
BOOL &bHandled)
-{
-    m_Tracking = false;
-    return 0;
-}
-
 LRESULT CMenuDeskBar::OnWindowPosChanged(UINT uMsg, WPARAM wParam, LPARAM 
lParam, BOOL &bHandled)
 {
     return 0;
@@ -824,11 +837,34 @@
 HRESULT STDMETHODCALLTYPE CMenuDeskBar::OnSelect(
     DWORD dwSelectType)
 {
-    if (dwSelectType == MPOS_FULLCANCEL)
-    {
-        CComPtr<IDeskBarClient> dbc;
-
-        HRESULT hr = m_Client->QueryInterface(IID_PPV_ARG(IDeskBarClient, 
&dbc));
+    CComPtr<IDeskBarClient> dbc;
+    HRESULT hr;
+    
+    bool bubbleUp = false;
+    bool cancel = false;
+
+    switch (dwSelectType)
+    {
+    case MPOS_FULLCANCEL:
+    case MPOS_EXECUTE:
+        bubbleUp = true;
+        cancel = true;
+        // fall through
+    case MPOS_CANCELLEVEL:
+        cancel = true;
+        break;
+    case MPOS_SELECTLEFT:
+    case MPOS_SELECTRIGHT:
+        // if unhandled, spread upwards?
+        bubbleUp = true;
+        return S_OK;
+    case MPOS_CHILDTRACKING:
+        return S_OK;
+    }
+
+    if (cancel)
+    {
+        hr = m_Client->QueryInterface(IID_PPV_ARG(IDeskBarClient, &dbc));
         if (FAILED(hr))
             return hr;
 
@@ -841,6 +877,15 @@
         UIActivateIO(FALSE, NULL);
     }
 
+    //if (bubbleUp && m_Site)
+    //{
+    //    CComPtr<IMenuPopup> pmp;
+    //    HRESULT hr = IUnknown_QueryService(m_Site, SID_SMenuPopup, 
IID_PPV_ARG(IMenuPopup, &pmp));
+    //    if (FAILED(hr))
+    //        return hr;
+    //    pmp->OnSelect(dwSelectType);
+    //}
+
     return S_OK;
 }
 
@@ -848,9 +893,24 @@
     IMenuPopup *pmp,
     BOOL fSet)
 {
+    if (fSet)
+    {
+        m_SubMenuParent = pmp;
+    }
+    else
+    {
+        if (m_SubMenuParent)
+        {
+            if (SHIsSameObject(pmp, m_SubMenuParent))
+            {
+                m_SubMenuParent = NULL;
+            }
+        }
+    }
     return S_OK;
 }
 
+
 HRESULT STDMETHODCALLTYPE CMenuDeskBar::Initialize(THIS)
 {
     return S_OK;


Reply via email to