mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 11:53:16 +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
2 changed files with 76 additions and 21 deletions
|
@ -1942,12 +1942,9 @@ LRESULT CDefView::OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bH
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CComPtr<IContextMenu2> pCM2;
|
LRESULT result;
|
||||||
HRESULT hres = m_pCM.p->QueryInterface(IID_PPV_ARG(IContextMenu2, &pCM2));
|
HRESULT hres = SHForwardContextMenuMsg(m_pCM, uMsg, wParam, lParam, &result, TRUE);
|
||||||
if(FAILED(hres))
|
if (SUCCEEDED(hres))
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (pCM2.p->HandleMenuMsg(uMsg, (WPARAM)m_hWnd, lParam) == S_OK)
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -34,7 +34,7 @@ typedef struct _StaticShellEntry_
|
||||||
|
|
||||||
class CDefaultContextMenu :
|
class CDefaultContextMenu :
|
||||||
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
||||||
public IContextMenu2
|
public IContextMenu3
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
CComPtr<IShellFolder> m_psf;
|
CComPtr<IShellFolder> m_psf;
|
||||||
|
@ -74,6 +74,7 @@ class CDefaultContextMenu :
|
||||||
DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFO lpcmi, PStaticShellEntry pEntry);
|
DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFO lpcmi, PStaticShellEntry pEntry);
|
||||||
HRESULT TryToBrowse(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, DWORD wFlags);
|
HRESULT TryToBrowse(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, DWORD wFlags);
|
||||||
HRESULT InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry);
|
HRESULT InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry);
|
||||||
|
PDynamicShellEntry GetDynamicEntry(UINT idCmd);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CDefaultContextMenu();
|
CDefaultContextMenu();
|
||||||
|
@ -88,9 +89,13 @@ class CDefaultContextMenu :
|
||||||
// IContextMenu2
|
// IContextMenu2
|
||||||
virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
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)
|
BEGIN_COM_MAP(CDefaultContextMenu)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
|
||||||
END_COM_MAP()
|
END_COM_MAP()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1347,29 +1352,36 @@ CDefaultContextMenu::DoFormat(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
PDynamicShellEntry CDefaultContextMenu::GetDynamicEntry(UINT idCmd)
|
||||||
CDefaultContextMenu::DoDynamicShellExtensions(
|
|
||||||
LPCMINVOKECOMMANDINFO lpcmi)
|
|
||||||
{
|
{
|
||||||
UINT idCmd = LOWORD(lpcmi->lpVerb);
|
|
||||||
PDynamicShellEntry pEntry = m_pDynamicEntries;
|
PDynamicShellEntry pEntry = m_pDynamicEntries;
|
||||||
|
|
||||||
TRACE("verb %p first %x last %x", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
|
|
||||||
|
|
||||||
while(pEntry && idCmd > pEntry->iIdCmdFirst + pEntry->NumIds)
|
while(pEntry && idCmd > pEntry->iIdCmdFirst + pEntry->NumIds)
|
||||||
pEntry = pEntry->pNext;
|
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)
|
if (!pEntry)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
if (idCmd >= pEntry->iIdCmdFirst && idCmd <= pEntry->iIdCmdFirst + pEntry->NumIds)
|
|
||||||
{
|
|
||||||
/* invoke the dynamic context menu */
|
/* invoke the dynamic context menu */
|
||||||
lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
|
lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
|
||||||
return pEntry->pCM->InvokeCommand(lpcmi);
|
return pEntry->pCM->InvokeCommand(lpcmi);
|
||||||
}
|
|
||||||
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
|
@ -1594,6 +1606,52 @@ CDefaultContextMenu::HandleMenuMsg(
|
||||||
WPARAM wParam,
|
WPARAM wParam,
|
||||||
LPARAM lParam)
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue