mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 09:50:07 +00:00
[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:
parent
9fecc42e25
commit
405cd4a9c0
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in a new issue