Commit beb89fd1 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

shell32: Store common menu data in a separate structure.

parent b1f04e23
...@@ -430,7 +430,7 @@ static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg( ...@@ -430,7 +430,7 @@ static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg(
* IContextMenu2 VTable * IContextMenu2 VTable
* *
*/ */
static const IContextMenu2Vtbl cmvt = static const IContextMenu2Vtbl BackgroundContextMenuVtbl =
{ {
ISVBgCm_fnQueryInterface, ISVBgCm_fnQueryInterface,
ISVBgCm_fnAddRef, ISVBgCm_fnAddRef,
...@@ -445,11 +445,12 @@ IContextMenu2 *ISvBgCm_Constructor(IShellFolder *pSFParent, BOOL bDesktop) ...@@ -445,11 +445,12 @@ IContextMenu2 *ISvBgCm_Constructor(IShellFolder *pSFParent, BOOL bDesktop)
{ {
BgCmImpl *cm; BgCmImpl *cm;
cm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cm)); cm = HeapAlloc(GetProcessHeap(), 0, sizeof(*cm));
cm->IContextMenu2_iface.lpVtbl = &cmvt; cm->IContextMenu2_iface.lpVtbl = &BackgroundContextMenuVtbl;
cm->ref = 1; cm->ref = 1;
cm->pSFParent = pSFParent; cm->pSFParent = pSFParent;
cm->bDesktop = bDesktop; cm->bDesktop = bDesktop;
cm->verb_offset = 0;
if(pSFParent) IShellFolder_AddRef(pSFParent); if(pSFParent) IShellFolder_AddRef(pSFParent);
TRACE("(%p)->()\n", cm); TRACE("(%p)->()\n", cm);
......
...@@ -42,29 +42,33 @@ ...@@ -42,29 +42,33 @@
WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DEFAULT_DEBUG_CHANNEL(shell);
typedef struct
{
IContextMenu2 IContextMenu2_iface;
LONG ref;
IShellFolder* parent;
UINT verb_offset;
} ContextMenu;
/************************************************************************** /**************************************************************************
* IContextMenu Implementation * IContextMenu Implementation
*/ */
typedef struct typedef struct
{ {
IContextMenu2 IContextMenu2_iface; ContextMenu menu;
LONG ref;
IShellFolder* pSFParent;
LPITEMIDLIST pidl; /* root pidl */ LPITEMIDLIST pidl; /* root pidl */
LPITEMIDLIST *apidl; /* array of child pidls */ LPITEMIDLIST *apidl; /* array of child pidls */
UINT cidl; UINT cidl;
BOOL bAllValues; BOOL bAllValues;
UINT verb_offset;
} ItemCmImpl; } ItemCmImpl;
static inline ItemCmImpl *impl_from_IContextMenu2(IContextMenu2 *iface) 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() * ISvItemCm_CanRenameItems()
*/ */
...@@ -79,42 +83,13 @@ static BOOL ISvItemCm_CanRenameItems(ItemCmImpl *This) ...@@ -79,42 +83,13 @@ static BOOL ISvItemCm_CanRenameItems(ItemCmImpl *This)
for(i = 0; i < This->cidl; i++){} for(i = 0; i < This->cidl; i++){}
if(i > 1) return FALSE; /* can't rename more than one item at a time*/ if(i > 1) return FALSE; /* can't rename more than one item at a time*/
dwAttributes = SFGAO_CANRENAME; 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 dwAttributes & SFGAO_CANRENAME;
} }
return FALSE; 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 * ISvItemCm_fnQueryInterface
*/ */
static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj) static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj)
...@@ -152,7 +127,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID ri ...@@ -152,7 +127,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID ri
static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface) static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface)
{ {
ItemCmImpl *This = impl_from_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); TRACE("(%p)->(count=%u)\n", This, refCount - 1);
...@@ -165,7 +140,7 @@ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface) ...@@ -165,7 +140,7 @@ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface)
static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface) static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface)
{ {
ItemCmImpl *This = impl_from_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); TRACE("(%p)->(count=%i)\n", This, refCount + 1);
...@@ -173,8 +148,8 @@ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface) ...@@ -173,8 +148,8 @@ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface)
{ {
TRACE(" destroying IContextMenu(%p)\n",This); TRACE(" destroying IContextMenu(%p)\n",This);
if(This->pSFParent) if(This->menu.parent)
IShellFolder_Release(This->pSFParent); IShellFolder_Release(This->menu.parent);
SHFree(This->pidl); SHFree(This->pidl);
...@@ -229,7 +204,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu( ...@@ -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); 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) if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0)
{ {
...@@ -339,7 +314,7 @@ static void DoDelete(ItemCmImpl *This) ...@@ -339,7 +314,7 @@ static void DoDelete(ItemCmImpl *This)
{ {
ISFHelper * psfhlp; ISFHelper * psfhlp;
IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlp); IShellFolder_QueryInterface(This->menu.parent, &IID_ISFHelper, (LPVOID*)&psfhlp);
if (psfhlp) if (psfhlp)
{ {
ISFHelper_DeleteItems(psfhlp, This->cidl, (LPCITEMIDLIST *)This->apidl); ISFHelper_DeleteItems(psfhlp, This->cidl, (LPCITEMIDLIST *)This->apidl);
...@@ -516,7 +491,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand( ...@@ -516,7 +491,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
if (HIWORD(lpcmi->lpVerb) == 0) if (HIWORD(lpcmi->lpVerb) == 0)
{ {
switch(LOWORD(lpcmi->lpVerb-This->verb_offset)) switch(LOWORD(lpcmi->lpVerb-This->menu.verb_offset))
{ {
case FCIDM_SHVIEW_EXPLORE: case FCIDM_SHVIEW_EXPLORE:
TRACE("Verb FCIDM_SHVIEW_EXPLORE\n"); TRACE("Verb FCIDM_SHVIEW_EXPLORE\n");
...@@ -547,7 +522,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand( ...@@ -547,7 +522,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
DoOpenProperties(This, lpcmi->hwnd); DoOpenProperties(This, lpcmi->hwnd);
break; break;
default: 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; return E_INVALIDARG;
} }
} }
...@@ -591,7 +566,7 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString( ...@@ -591,7 +566,7 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
break; break;
case GCS_VERBA: case GCS_VERBA:
switch(idCommand-This->verb_offset) switch(idCommand-This->menu.verb_offset)
{ {
case FCIDM_SHVIEW_RENAME: case FCIDM_SHVIEW_RENAME:
strcpy(lpszName, "rename"); strcpy(lpszName, "rename");
...@@ -603,7 +578,7 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString( ...@@ -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 /* 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, you need to do the lstrcpyW to the pointer passed.*/
case GCS_VERBW: case GCS_VERBW:
switch(idCommand-This->verb_offset) switch(idCommand-This->menu.verb_offset)
{ {
case FCIDM_SHVIEW_RENAME: case FCIDM_SHVIEW_RENAME:
MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen ); MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen );
...@@ -640,7 +615,7 @@ static HRESULT WINAPI ISvItemCm_fnHandleMenuMsg( ...@@ -640,7 +615,7 @@ static HRESULT WINAPI ISvItemCm_fnHandleMenuMsg(
return E_NOTIMPL; return E_NOTIMPL;
} }
static const IContextMenu2Vtbl cmvt = static const IContextMenu2Vtbl ItemContextMenuVtbl =
{ {
ISvItemCm_fnQueryInterface, ISvItemCm_fnQueryInterface,
ISvItemCm_fnAddRef, ISvItemCm_fnAddRef,
...@@ -650,3 +625,29 @@ static const IContextMenu2Vtbl cmvt = ...@@ -650,3 +625,29 @@ static const IContextMenu2Vtbl cmvt =
ISvItemCm_fnGetCommandString, ISvItemCm_fnGetCommandString,
ISvItemCm_fnHandleMenuMsg 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment