Generalized the use of the new ICOM_VFIELD and ICOM_VTBL macros.
[wine] / dlls / shell32 / shv_bg_cmenu.c
1 /*
2  *      IContextMenu
3  *      ShellView Background Context Menu (shv_bg_cm)
4  *
5  *      Copyright 1999  Juergen Schmied <juergen.schmied@metronet.de>
6  */
7 #include <string.h>
8
9 #include "winerror.h"
10 #include "debugtools.h"
11
12 #include "pidl.h"
13 #include "wine/obj_base.h"
14 #include "wine/obj_contextmenu.h"
15 #include "wine/obj_shellbrowser.h"
16 #include "wine/obj_shellextinit.h"
17
18 #include "shell32_main.h"
19
20 DEFAULT_DEBUG_CHANNEL(shell)
21
22 /**************************************************************************
23 *  IContextMenu Implementation
24 */
25 typedef struct 
26 {       ICOM_VFIELD(IContextMenu);
27         DWORD           ref;
28 } BgCmImpl;
29
30
31 static struct ICOM_VTABLE(IContextMenu) cmvt;
32
33 /**************************************************************************
34 *   ISVBgCm_Constructor()
35 */
36 IContextMenu *ISvBgCm_Constructor(void)
37 {
38         BgCmImpl* cm;
39
40         cm = (BgCmImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BgCmImpl));
41         ICOM_VTBL(cm)=&cmvt;
42         cm->ref = 1;
43
44         TRACE("(%p)->()\n",cm);
45         shell32_ObjCount++;
46         return (IContextMenu*)cm;
47 }
48
49 /**************************************************************************
50 *  ISVBgCm_fnQueryInterface
51 */
52 static HRESULT WINAPI ISVBgCm_fnQueryInterface(IContextMenu *iface, REFIID riid, LPVOID *ppvObj)
53 {
54         ICOM_THIS(BgCmImpl, iface);
55
56         char    xriid[50];
57         WINE_StringFromCLSID((LPCLSID)riid,xriid);
58
59         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
60
61         *ppvObj = NULL;
62
63         if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
64         {
65           *ppvObj = This; 
66         }
67         else if(IsEqualIID(riid, &IID_IContextMenu))  /*IContextMenu*/
68         {
69           *ppvObj = This;
70         }   
71         else if(IsEqualIID(riid, &IID_IShellExtInit))  /*IShellExtInit*/
72         {
73           FIXME("-- LPSHELLEXTINIT pointer requested\n");
74         }
75
76         if(*ppvObj)
77         { 
78           IUnknown_AddRef((IUnknown*)*ppvObj);      
79           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
80           return S_OK;
81         }
82         TRACE("-- Interface: E_NOINTERFACE\n");
83         return E_NOINTERFACE;
84 }
85
86 /**************************************************************************
87 *  ISVBgCm_fnAddRef
88 */
89 static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu *iface)
90 {
91         ICOM_THIS(BgCmImpl, iface);
92
93         TRACE("(%p)->(count=%lu)\n",This, This->ref);
94
95         shell32_ObjCount++;
96         return ++(This->ref);
97 }
98
99 /**************************************************************************
100 *  ISVBgCm_fnRelease
101 */
102 static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu *iface)
103 {
104         ICOM_THIS(BgCmImpl, iface);
105
106         TRACE("(%p)->()\n",This);
107
108         shell32_ObjCount--;
109
110         if (!--(This->ref)) 
111         { TRACE(" destroying IContextMenu(%p)\n",This);
112
113           HeapFree(GetProcessHeap(),0,This);
114           return 0;
115         }
116         return This->ref;
117 }
118
119 /**************************************************************************
120 * ISVBgCm_fnQueryContextMenu()
121 */
122
123 static HRESULT WINAPI ISVBgCm_fnQueryContextMenu(
124         IContextMenu *iface,
125         HMENU hMenu,
126         UINT indexMenu,
127         UINT idCmdFirst,
128         UINT idCmdLast,
129         UINT uFlags)
130 {
131         HMENU   hMyMenu;
132         UINT    idMax;
133         
134         ICOM_THIS(BgCmImpl, iface);
135
136         TRACE("(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
137
138         hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002");
139
140         idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
141
142         DestroyMenu(hMyMenu);
143
144         return ResultFromShort(idMax - idCmdFirst);
145 }
146
147 /**************************************************************************
148 * ISVBgCm_fnInvokeCommand()
149 */
150 static HRESULT WINAPI ISVBgCm_fnInvokeCommand(
151         IContextMenu *iface,
152         LPCMINVOKECOMMANDINFO lpcmi)
153 {
154         ICOM_THIS(BgCmImpl, iface);
155
156         LPSHELLBROWSER  lpSB;
157         LPSHELLVIEW     lpSV;
158         HWND    hWndSV;
159
160         TRACE("(%p)->(invcom=%p verb=%p wnd=%x)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);    
161
162         /* get the active IShellView */
163         lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0);
164         IShellBrowser_QueryActiveShellView(lpSB, &lpSV);
165         IShellView_GetWindow(lpSV, &hWndSV);
166
167         if(HIWORD(lpcmi->lpVerb))
168         {
169           TRACE("%s\n",lpcmi->lpVerb);
170
171           if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDERA))
172           {
173             FIXME("%s not implemented\n",lpcmi->lpVerb);
174           }
175           else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLISTA))
176           {
177             SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
178           }
179           else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILSA))
180           {
181             SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
182           } 
183           else
184           {
185             FIXME("please report: unknown verb %s\n",lpcmi->lpVerb);
186           }
187         }
188         else
189         {
190           /* if it's a id just pass it to the parent shv */
191           SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 );
192         }
193         
194         IShellView_Release(lpSV);       /* QueryActiveShellView does AddRef*/
195         return NOERROR;
196 }
197
198 /**************************************************************************
199  *  ISVBgCm_fnGetCommandString()
200  *
201  */
202 static HRESULT WINAPI ISVBgCm_fnGetCommandString(
203         IContextMenu *iface,
204         UINT idCommand,
205         UINT uFlags,
206         LPUINT lpReserved,
207         LPSTR lpszName,
208         UINT uMaxNameLen)
209 {       
210         ICOM_THIS(BgCmImpl, iface);
211
212         TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
213
214         /* test the existance of the menu items, the file dialog enables 
215            the buttons according to this */
216         if (uFlags == GCS_VALIDATEA)
217         {
218           if(HIWORD(idCommand))
219           {
220             if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) ||
221                 !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) ||
222                 !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA))
223             {   
224               return NOERROR;
225             }
226           }
227         }
228
229         FIXME("unknown command string\n");
230         return E_FAIL;
231 }
232
233 /**************************************************************************
234 * ISVBgCm_fnHandleMenuMsg()
235 */
236 static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg(
237         IContextMenu *iface,
238         UINT uMsg,
239         WPARAM wParam,
240         LPARAM lParam)
241 {
242         ICOM_THIS(BgCmImpl, iface);
243
244         FIXME("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam);
245
246         return E_NOTIMPL;
247 }
248
249 /**************************************************************************
250 * IContextMenu VTable
251
252 */
253 static struct ICOM_VTABLE(IContextMenu) cmvt = 
254 {       
255         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
256         ISVBgCm_fnQueryInterface,
257         ISVBgCm_fnAddRef,
258         ISVBgCm_fnRelease,
259         ISVBgCm_fnQueryContextMenu,
260         ISVBgCm_fnInvokeCommand,
261         ISVBgCm_fnGetCommandString,
262         ISVBgCm_fnHandleMenuMsg,
263         (void *) 0xdeadbabe     /* just paranoia (IContextMenu3) */
264 };
265