| /* |
| * IContextMenu |
| * ShellView Background Context Menu (shv_bg_cm) |
| * |
| * Copyright 1999 Juergen Schmied <juergen.schmied@metronet.de> |
| */ |
| #include <string.h> |
| |
| #include "winerror.h" |
| #include "debugtools.h" |
| |
| #include "pidl.h" |
| #include "wine/obj_base.h" |
| #include "wine/obj_contextmenu.h" |
| #include "wine/obj_shellbrowser.h" |
| #include "wine/obj_shellextinit.h" |
| |
| #include "shell32_main.h" |
| |
| DEFAULT_DEBUG_CHANNEL(shell) |
| |
| /************************************************************************** |
| * IContextMenu Implementation |
| */ |
| typedef struct |
| { ICOM_VFIELD(IContextMenu); |
| DWORD ref; |
| } BgCmImpl; |
| |
| |
| static struct ICOM_VTABLE(IContextMenu) cmvt; |
| |
| /************************************************************************** |
| * ISVBgCm_Constructor() |
| */ |
| IContextMenu *ISvBgCm_Constructor(void) |
| { |
| BgCmImpl* cm; |
| |
| cm = (BgCmImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BgCmImpl)); |
| ICOM_VTBL(cm)=&cmvt; |
| cm->ref = 1; |
| |
| TRACE("(%p)->()\n",cm); |
| shell32_ObjCount++; |
| return (IContextMenu*)cm; |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnQueryInterface |
| */ |
| static HRESULT WINAPI ISVBgCm_fnQueryInterface(IContextMenu *iface, REFIID riid, LPVOID *ppvObj) |
| { |
| ICOM_THIS(BgCmImpl, iface); |
| |
| TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); |
| |
| *ppvObj = NULL; |
| |
| if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ |
| { |
| *ppvObj = This; |
| } |
| else if(IsEqualIID(riid, &IID_IContextMenu)) /*IContextMenu*/ |
| { |
| *ppvObj = This; |
| } |
| else if(IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/ |
| { |
| FIXME("-- LPSHELLEXTINIT pointer requested\n"); |
| } |
| |
| if(*ppvObj) |
| { |
| IUnknown_AddRef((IUnknown*)*ppvObj); |
| TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); |
| return S_OK; |
| } |
| TRACE("-- Interface: E_NOINTERFACE\n"); |
| return E_NOINTERFACE; |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnAddRef |
| */ |
| static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu *iface) |
| { |
| ICOM_THIS(BgCmImpl, iface); |
| |
| TRACE("(%p)->(count=%lu)\n",This, This->ref); |
| |
| shell32_ObjCount++; |
| return ++(This->ref); |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnRelease |
| */ |
| static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu *iface) |
| { |
| ICOM_THIS(BgCmImpl, iface); |
| |
| TRACE("(%p)->()\n",This); |
| |
| shell32_ObjCount--; |
| |
| if (!--(This->ref)) |
| { TRACE(" destroying IContextMenu(%p)\n",This); |
| |
| HeapFree(GetProcessHeap(),0,This); |
| return 0; |
| } |
| return This->ref; |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnQueryContextMenu() |
| */ |
| |
| static HRESULT WINAPI ISVBgCm_fnQueryContextMenu( |
| IContextMenu *iface, |
| HMENU hMenu, |
| UINT indexMenu, |
| UINT idCmdFirst, |
| UINT idCmdLast, |
| UINT uFlags) |
| { |
| HMENU hMyMenu; |
| UINT idMax; |
| |
| ICOM_THIS(BgCmImpl, iface); |
| |
| TRACE("(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); |
| |
| hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002"); |
| |
| idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS); |
| |
| DestroyMenu(hMyMenu); |
| |
| return ResultFromShort(idMax - idCmdFirst); |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnInvokeCommand() |
| */ |
| static HRESULT WINAPI ISVBgCm_fnInvokeCommand( |
| IContextMenu *iface, |
| LPCMINVOKECOMMANDINFO lpcmi) |
| { |
| ICOM_THIS(BgCmImpl, iface); |
| |
| LPSHELLBROWSER lpSB; |
| LPSHELLVIEW lpSV; |
| HWND hWndSV; |
| |
| TRACE("(%p)->(invcom=%p verb=%p wnd=%x)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); |
| |
| /* get the active IShellView */ |
| lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0); |
| IShellBrowser_QueryActiveShellView(lpSB, &lpSV); |
| IShellView_GetWindow(lpSV, &hWndSV); |
| |
| if(HIWORD(lpcmi->lpVerb)) |
| { |
| TRACE("%s\n",lpcmi->lpVerb); |
| |
| if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDERA)) |
| { |
| FIXME("%s not implemented\n",lpcmi->lpVerb); |
| } |
| else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLISTA)) |
| { |
| SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 ); |
| } |
| else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILSA)) |
| { |
| SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 ); |
| } |
| else |
| { |
| FIXME("please report: unknown verb %s\n",lpcmi->lpVerb); |
| } |
| } |
| else |
| { |
| /* if it's a id just pass it to the parent shv */ |
| SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 ); |
| } |
| |
| IShellView_Release(lpSV); /* QueryActiveShellView does AddRef*/ |
| return NOERROR; |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnGetCommandString() |
| * |
| */ |
| static HRESULT WINAPI ISVBgCm_fnGetCommandString( |
| IContextMenu *iface, |
| UINT idCommand, |
| UINT uFlags, |
| LPUINT lpReserved, |
| LPSTR lpszName, |
| UINT uMaxNameLen) |
| { |
| ICOM_THIS(BgCmImpl, iface); |
| |
| TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); |
| |
| /* test the existance of the menu items, the file dialog enables |
| the buttons according to this */ |
| if (uFlags == GCS_VALIDATEA) |
| { |
| if(HIWORD(idCommand)) |
| { |
| if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) || |
| !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) || |
| !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA)) |
| { |
| return NOERROR; |
| } |
| } |
| } |
| |
| FIXME("unknown command string\n"); |
| return E_FAIL; |
| } |
| |
| /************************************************************************** |
| * ISVBgCm_fnHandleMenuMsg() |
| */ |
| static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg( |
| IContextMenu *iface, |
| UINT uMsg, |
| WPARAM wParam, |
| LPARAM lParam) |
| { |
| ICOM_THIS(BgCmImpl, iface); |
| |
| FIXME("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam); |
| |
| return E_NOTIMPL; |
| } |
| |
| /************************************************************************** |
| * IContextMenu VTable |
| * |
| */ |
| static struct ICOM_VTABLE(IContextMenu) cmvt = |
| { |
| ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE |
| ISVBgCm_fnQueryInterface, |
| ISVBgCm_fnAddRef, |
| ISVBgCm_fnRelease, |
| ISVBgCm_fnQueryContextMenu, |
| ISVBgCm_fnInvokeCommand, |
| ISVBgCm_fnGetCommandString, |
| ISVBgCm_fnHandleMenuMsg, |
| (void *) 0xdeadbabe /* just paranoia (IContextMenu3) */ |
| }; |
| |