diff --git a/reactos/dll/win32/shell32/CDefView.cpp b/reactos/dll/win32/shell32/CDefView.cpp index 03d83d5562f..2a66ba20d92 100644 --- a/reactos/dll/win32/shell32/CDefView.cpp +++ b/reactos/dll/win32/shell32/CDefView.cpp @@ -1942,12 +1942,9 @@ LRESULT CDefView::OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bH return FALSE; } - CComPtr pCM2; - HRESULT hres = m_pCM.p->QueryInterface(IID_PPV_ARG(IContextMenu2, &pCM2)); - if(FAILED(hres)) - return FALSE; - - if (pCM2.p->HandleMenuMsg(uMsg, (WPARAM)m_hWnd, lParam) == S_OK) + LRESULT result; + HRESULT hres = SHForwardContextMenuMsg(m_pCM, uMsg, wParam, lParam, &result, TRUE); + if (SUCCEEDED(hres)) return TRUE; else return FALSE; diff --git a/reactos/dll/win32/shell32/CDefaultContextMenu.cpp b/reactos/dll/win32/shell32/CDefaultContextMenu.cpp index e870b3ddb35..9782d3d240b 100644 --- a/reactos/dll/win32/shell32/CDefaultContextMenu.cpp +++ b/reactos/dll/win32/shell32/CDefaultContextMenu.cpp @@ -34,7 +34,7 @@ typedef struct _StaticShellEntry_ class CDefaultContextMenu : public CComObjectRootEx, - public IContextMenu2 + public IContextMenu3 { private: CComPtr m_psf; @@ -74,6 +74,7 @@ class CDefaultContextMenu : DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFO lpcmi, PStaticShellEntry pEntry); HRESULT TryToBrowse(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, DWORD wFlags); HRESULT InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry); + PDynamicShellEntry GetDynamicEntry(UINT idCmd); public: CDefaultContextMenu(); @@ -88,9 +89,13 @@ class CDefaultContextMenu : // IContextMenu2 virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); + // IContextMenu3 + virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult); + BEGIN_COM_MAP(CDefaultContextMenu) COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2) + COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3) END_COM_MAP() }; @@ -1347,29 +1352,36 @@ CDefaultContextMenu::DoFormat( return S_OK; } -HRESULT -CDefaultContextMenu::DoDynamicShellExtensions( - LPCMINVOKECOMMANDINFO lpcmi) +PDynamicShellEntry CDefaultContextMenu::GetDynamicEntry(UINT idCmd) { - UINT idCmd = LOWORD(lpcmi->lpVerb); PDynamicShellEntry pEntry = m_pDynamicEntries; - TRACE("verb %p first %x last %x", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast); - while(pEntry && idCmd > pEntry->iIdCmdFirst + pEntry->NumIds) pEntry = pEntry->pNext; + if (!pEntry) + return NULL; + + if (idCmd < pEntry->iIdCmdFirst || idCmd > pEntry->iIdCmdFirst + pEntry->NumIds) + return NULL; + + return pEntry; +} + +HRESULT +CDefaultContextMenu::DoDynamicShellExtensions( + LPCMINVOKECOMMANDINFO lpcmi) +{ + TRACE("verb %p first %x last %x", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast); + + UINT idCmd = LOWORD(lpcmi->lpVerb); + PDynamicShellEntry pEntry = GetDynamicEntry(idCmd); if (!pEntry) return E_FAIL; - if (idCmd >= pEntry->iIdCmdFirst && idCmd <= pEntry->iIdCmdFirst + pEntry->NumIds) - { - /* invoke the dynamic context menu */ - lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst); - return pEntry->pCM->InvokeCommand(lpcmi); - } - - return E_FAIL; + /* invoke the dynamic context menu */ + lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst); + return pEntry->pCM->InvokeCommand(lpcmi); } DWORD @@ -1594,9 +1606,55 @@ CDefaultContextMenu::HandleMenuMsg( WPARAM wParam, LPARAM lParam) { + /* FIXME: Should we implement this as well? */ return S_OK; } +HRESULT +WINAPI +CDefaultContextMenu::HandleMenuMsg2( + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT *plResult) +{ + switch (uMsg) + { + case WM_INITMENUPOPUP: + { + PDynamicShellEntry pEntry = m_pDynamicEntries; + while (pEntry) + { + SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE); + pEntry = pEntry->pNext; + } + break; + } + case WM_DRAWITEM: + { + DRAWITEMSTRUCT* pDrawStruct = reinterpret_cast(lParam); + PDynamicShellEntry pEntry = GetDynamicEntry(pDrawStruct->itemID); + if(pEntry) + SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE); + break; + } + case WM_MEASUREITEM: + { + MEASUREITEMSTRUCT* pMeasureStruct = reinterpret_cast(lParam); + PDynamicShellEntry pEntry = GetDynamicEntry(pMeasureStruct->itemID); + if(pEntry) + SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE); + break; + } + case WM_MENUCHAR : + /* FIXME */ + break; + default: + ERR("Got unknown message:%d\n", uMsg); + } + return S_OK; +} + static HRESULT IDefaultContextMenu_Constructor(