shell32: Store common menu data in a separate structure.

This commit is contained in:
Nikolay Sivov 2012-01-08 02:49:19 +03:00 committed by Alexandre Julliard
parent b1f04e23bf
commit beb89fd160
2 changed files with 54 additions and 52 deletions

View File

@ -430,7 +430,7 @@ static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg(
* IContextMenu2 VTable
*
*/
static const IContextMenu2Vtbl cmvt =
static const IContextMenu2Vtbl BackgroundContextMenuVtbl =
{
ISVBgCm_fnQueryInterface,
ISVBgCm_fnAddRef,
@ -445,11 +445,12 @@ IContextMenu2 *ISvBgCm_Constructor(IShellFolder *pSFParent, BOOL bDesktop)
{
BgCmImpl *cm;
cm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cm));
cm->IContextMenu2_iface.lpVtbl = &cmvt;
cm = HeapAlloc(GetProcessHeap(), 0, sizeof(*cm));
cm->IContextMenu2_iface.lpVtbl = &BackgroundContextMenuVtbl;
cm->ref = 1;
cm->pSFParent = pSFParent;
cm->bDesktop = bDesktop;
cm->verb_offset = 0;
if(pSFParent) IShellFolder_AddRef(pSFParent);
TRACE("(%p)->()\n", cm);

View File

@ -42,29 +42,33 @@
WINE_DEFAULT_DEBUG_CHANNEL(shell);
typedef struct
{
IContextMenu2 IContextMenu2_iface;
LONG ref;
IShellFolder* parent;
UINT verb_offset;
} ContextMenu;
/**************************************************************************
* IContextMenu Implementation
*/
typedef struct
{
IContextMenu2 IContextMenu2_iface;
LONG ref;
IShellFolder* pSFParent;
ContextMenu menu;
LPITEMIDLIST pidl; /* root pidl */
LPITEMIDLIST *apidl; /* array of child pidls */
UINT cidl;
BOOL bAllValues;
UINT verb_offset;
} ItemCmImpl;
static inline ItemCmImpl *impl_from_IContextMenu2(IContextMenu2 *iface)
{
return CONTAINING_RECORD(iface, ItemCmImpl, IContextMenu2_iface);
return CONTAINING_RECORD(iface, ItemCmImpl, menu.IContextMenu2_iface);
}
static const IContextMenu2Vtbl cmvt;
/**************************************************************************
* ISvItemCm_CanRenameItems()
*/
@ -79,41 +83,12 @@ static BOOL ISvItemCm_CanRenameItems(ItemCmImpl *This)
for(i = 0; i < This->cidl; i++){}
if(i > 1) return FALSE; /* can't rename more than one item at a time*/
dwAttributes = SFGAO_CANRENAME;
IShellFolder_GetAttributesOf(This->pSFParent, 1, (LPCITEMIDLIST*)This->apidl, &dwAttributes);
IShellFolder_GetAttributesOf(This->menu.parent, 1, (LPCITEMIDLIST*)This->apidl, &dwAttributes);
return dwAttributes & SFGAO_CANRENAME;
}
return FALSE;
}
/**************************************************************************
* ISvItemCm_Constructor()
*/
IContextMenu2 *ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, const LPCITEMIDLIST *apidl, UINT cidl)
{ ItemCmImpl* cm;
UINT u;
cm = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ItemCmImpl));
cm->IContextMenu2_iface.lpVtbl = &cmvt;
cm->ref = 1;
cm->pidl = ILClone(pidl);
cm->pSFParent = pSFParent;
if(pSFParent) IShellFolder_AddRef(pSFParent);
cm->apidl = _ILCopyaPidl(apidl, cidl);
cm->cidl = cidl;
cm->bAllValues = 1;
for(u = 0; u < cidl; u++)
{
cm->bAllValues &= (_ILIsValue(apidl[u]) ? 1 : 0);
}
TRACE("(%p)->()\n",cm);
return &cm->IContextMenu2_iface;
}
/**************************************************************************
* ISvItemCm_fnQueryInterface
*/
@ -152,7 +127,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID ri
static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface)
{
ItemCmImpl *This = impl_from_IContextMenu2(iface);
ULONG refCount = InterlockedIncrement(&This->ref);
ULONG refCount = InterlockedIncrement(&This->menu.ref);
TRACE("(%p)->(count=%u)\n", This, refCount - 1);
@ -165,7 +140,7 @@ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface)
static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface)
{
ItemCmImpl *This = impl_from_IContextMenu2(iface);
ULONG refCount = InterlockedDecrement(&This->ref);
ULONG refCount = InterlockedDecrement(&This->menu.ref);
TRACE("(%p)->(count=%i)\n", This, refCount + 1);
@ -173,8 +148,8 @@ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface)
{
TRACE(" destroying IContextMenu(%p)\n",This);
if(This->pSFParent)
IShellFolder_Release(This->pSFParent);
if(This->menu.parent)
IShellFolder_Release(This->menu.parent);
SHFree(This->pidl);
@ -229,7 +204,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
This->verb_offset=idCmdFirst;
This->menu.verb_offset=idCmdFirst;
if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0)
{
@ -339,7 +314,7 @@ static void DoDelete(ItemCmImpl *This)
{
ISFHelper * psfhlp;
IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlp);
IShellFolder_QueryInterface(This->menu.parent, &IID_ISFHelper, (LPVOID*)&psfhlp);
if (psfhlp)
{
ISFHelper_DeleteItems(psfhlp, This->cidl, (LPCITEMIDLIST *)This->apidl);
@ -516,7 +491,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
if (HIWORD(lpcmi->lpVerb) == 0)
{
switch(LOWORD(lpcmi->lpVerb-This->verb_offset))
switch(LOWORD(lpcmi->lpVerb-This->menu.verb_offset))
{
case FCIDM_SHVIEW_EXPLORE:
TRACE("Verb FCIDM_SHVIEW_EXPLORE\n");
@ -547,7 +522,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
DoOpenProperties(This, lpcmi->hwnd);
break;
default:
FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)-This->verb_offset);
FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)-This->menu.verb_offset);
return E_INVALIDARG;
}
}
@ -591,7 +566,7 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
break;
case GCS_VERBA:
switch(idCommand-This->verb_offset)
switch(idCommand-This->menu.verb_offset)
{
case FCIDM_SHVIEW_RENAME:
strcpy(lpszName, "rename");
@ -603,7 +578,7 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
/* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This
case, you need to do the lstrcpyW to the pointer passed.*/
case GCS_VERBW:
switch(idCommand-This->verb_offset)
switch(idCommand-This->menu.verb_offset)
{
case FCIDM_SHVIEW_RENAME:
MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen );
@ -640,7 +615,7 @@ static HRESULT WINAPI ISvItemCm_fnHandleMenuMsg(
return E_NOTIMPL;
}
static const IContextMenu2Vtbl cmvt =
static const IContextMenu2Vtbl ItemContextMenuVtbl =
{
ISvItemCm_fnQueryInterface,
ISvItemCm_fnAddRef,
@ -650,3 +625,29 @@ static const IContextMenu2Vtbl cmvt =
ISvItemCm_fnGetCommandString,
ISvItemCm_fnHandleMenuMsg
};
IContextMenu2 *ISvItemCm_Constructor(IShellFolder *parent, LPCITEMIDLIST pidl, const LPCITEMIDLIST *apidl, UINT cidl)
{ ItemCmImpl* cm;
UINT u;
cm = HeapAlloc(GetProcessHeap(), 0, sizeof(ItemCmImpl));
cm->menu.IContextMenu2_iface.lpVtbl = &ItemContextMenuVtbl;
cm->menu.ref = 1;
cm->menu.verb_offset = 0;
cm->menu.parent = parent;
cm->pidl = ILClone(pidl);
if (parent) IShellFolder_AddRef(parent);
cm->apidl = _ILCopyaPidl(apidl, cidl);
cm->cidl = cidl;
cm->bAllValues = 1;
for(u = 0; u < cidl; u++)
cm->bAllValues &= (_ILIsValue(apidl[u]) ? 1 : 0);
TRACE("(%p)\n",cm);
return &cm->menu.IContextMenu2_iface;
}