/* * IContextMenu * ShellView Background Context Menu (shv_bg_cm) * * Copyright 1999 Juergen Schmied */ #include #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) */ };