[SHELL32]

- CDefView: Use SHForwardContextMenuMsg to forward menu messages to the context menu class
- CDefaultContextMenu: Implement IContextMenu3 and use SHForwardContextMenuMsg to forward menu messages to shell extensions.
CORE-9446 (part 2/2)

svn path=/trunk/; revision=66979
This commit is contained in:
Giannis Adamopoulos 2015-03-30 12:21:39 +00:00
parent 9fecc42e25
commit 405cd4a9c0
2 changed files with 76 additions and 21 deletions

View file

@ -1942,12 +1942,9 @@ LRESULT CDefView::OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bH
return FALSE;
}
CComPtr<IContextMenu2> 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;

View file

@ -34,7 +34,7 @@ typedef struct _StaticShellEntry_
class CDefaultContextMenu :
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IContextMenu2
public IContextMenu3
{
private:
CComPtr<IShellFolder> 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<DRAWITEMSTRUCT*>(lParam);
PDynamicShellEntry pEntry = GetDynamicEntry(pDrawStruct->itemID);
if(pEntry)
SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
break;
}
case WM_MEASUREITEM:
{
MEASUREITEMSTRUCT* pMeasureStruct = reinterpret_cast<MEASUREITEMSTRUCT*>(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(