gdi32: SetWinMetaFileBits: Use the whole device surface if the METAFILEPICT parameter...
[wine] / dlls / mshtml / olecmd.c
1 /*
2  * Copyright 2005-2006 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30 #include "shlguid.h"
31 #include "mshtmdid.h"
32 #include "idispids.h"
33
34 #include "wine/debug.h"
35
36 #include "mshtml_private.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
39
40 /**********************************************************
41  * IOleCommandTarget implementation
42  */
43
44 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
45
46 static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
47 {
48     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
49     return E_NOTIMPL;
50 }
51
52 static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
53 {
54     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
55     return E_NOTIMPL;
56 }
57
58 static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
59 {
60     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
61     return E_NOTIMPL;
62 }
63
64 static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
65 {
66     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
67     return E_NOTIMPL;
68 }
69
70 static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
71 {
72     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
73     return E_NOTIMPL;
74 }
75
76 static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
77 {
78     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
79     return E_NOTIMPL;
80 }
81
82 static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
83 {
84     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
85     return E_NOTIMPL;
86 }
87
88 static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
89 {
90     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
91     return E_NOTIMPL;
92 }
93
94 static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
95 {
96     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
97     return E_NOTIMPL;
98 }
99
100 static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
101 {
102     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
103     return E_NOTIMPL;
104 }
105
106 static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
107 {
108     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
109     return E_NOTIMPL;
110 }
111
112 static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
113 {
114     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
115     return E_NOTIMPL;
116 }
117
118 static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
119 {
120     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
121     return E_NOTIMPL;
122 }
123
124 static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
125 {
126     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
131 {
132     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
133     return E_NOTIMPL;
134 }
135
136 static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
137 {
138     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
139     return E_NOTIMPL;
140 }
141
142 static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
143 {
144     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
145     return E_NOTIMPL;
146 }
147
148 static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
149 {
150     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
151     return E_NOTIMPL;
152 }
153
154 static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
155 {
156     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
157     return E_NOTIMPL;
158 }
159
160 static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
161 {
162     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
163     return E_NOTIMPL;
164 }
165
166 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
167 {
168     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
169     return E_NOTIMPL;
170 }
171
172 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
173 {
174     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
175     return E_NOTIMPL;
176 }
177
178 static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
179 {
180     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
181     return E_NOTIMPL;
182 }
183
184 static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
185 {
186     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
191 {
192     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
193     return E_NOTIMPL;
194 }
195
196 static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
197 {
198     TRACE("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
199
200     /* Tests show that we have nothing more to do here */
201
202     if(pvaOut) {
203         V_VT(pvaOut) = VT_BOOL;
204         V_BOOL(pvaOut) = VARIANT_TRUE;
205     }
206
207     return S_OK;
208 }
209
210 static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
211 {
212     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
213     return E_NOTIMPL;
214 }
215
216 static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
217 {
218     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
219     return E_NOTIMPL;
220 }
221
222 static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
223 {
224     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
225     return E_NOTIMPL;
226 }
227
228 static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
229 {
230     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
231     return E_NOTIMPL;
232 }
233
234 static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
235 {
236     FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
237     return E_NOTIMPL;
238 }
239
240 static const struct {
241     OLECMDF cmdf;
242     HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
243 } exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
244     {0},
245     { OLECMDF_SUPPORTED,                  exec_open                 }, /* OLECMDID_OPEN */
246     { OLECMDF_SUPPORTED,                  exec_new                  }, /* OLECMDID_NEW */
247     { OLECMDF_SUPPORTED,                  exec_save                 }, /* OLECMDID_SAVE */
248     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_save_as              }, /* OLECMDID_SAVEAS */
249     { OLECMDF_SUPPORTED,                  exec_save_copy_as         }, /* OLECMDID_SAVECOPYAS */
250     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_print                }, /* OLECMDID_PRINT */
251     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_print_preview        }, /* OLECMDID_PRINTPREVIEW */
252     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_page_setup           }, /* OLECMDID_PAGESETUP */
253     { OLECMDF_SUPPORTED,                  exec_spell                }, /* OLECMDID_SPELL */
254     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_properties           }, /* OLECMDID_PROPERTIES */
255     { OLECMDF_SUPPORTED,                  exec_cut                  }, /* OLECMDID_CUT */
256     { OLECMDF_SUPPORTED,                  exec_copy                 }, /* OLECMDID_COPY */
257     { OLECMDF_SUPPORTED,                  exec_paste                }, /* OLECMDID_PASTE */
258     { OLECMDF_SUPPORTED,                  exec_paste_special        }, /* OLECMDID_PASTESPECIAL */
259     { OLECMDF_SUPPORTED,                  exec_undo                 }, /* OLECMDID_UNDO */
260     { OLECMDF_SUPPORTED,                  exec_rendo                }, /* OLECMDID_REDO */
261     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_select_all           }, /* OLECMDID_SELECTALL */
262     { OLECMDF_SUPPORTED,                  exec_clear_selection      }, /* OLECMDID_CLEARSELECTION */
263     { OLECMDF_SUPPORTED,                  exec_zoom                 }, /* OLECMDID_ZOOM */
264     { OLECMDF_SUPPORTED,                  exec_get_zoom_range       }, /* OLECMDID_GETZOOMRANGE */
265     {0},
266     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_refresh              }, /* OLECMDID_REFRESH */
267     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_stop                 }, /* OLECMDID_STOP */
268     {0},{0},{0},{0},{0},{0},
269     { OLECMDF_SUPPORTED,                  exec_stop_download        }, /* OLECMDID_STOPDOWNLOAD */
270     {0},{0},
271     { OLECMDF_SUPPORTED,                  exec_delete               }, /* OLECMDID_DELETE */
272     {0},{0},
273     { OLECMDF_SUPPORTED,                  exec_enable_interaction   }, /* OLECMDID_ENABLE_INTERACTION */
274     { OLECMDF_SUPPORTED,                  exec_on_unload            }, /* OLECMDID_ONUNLOAD */
275     {0},{0},{0},{0},{0},
276     { OLECMDF_SUPPORTED,                  exec_show_page_setup      }, /* OLECMDID_SHOWPAGESETUP */
277     { OLECMDF_SUPPORTED,                  exec_show_print           }, /* OLECMDID_SHOWPRINT */
278     {0},{0},
279     { OLECMDF_SUPPORTED,                  exec_close                }, /* OLECMDID_CLOSE */
280     {0},{0},{0},
281     { OLECMDF_SUPPORTED,                  exec_set_print_template   }, /* OLECMDID_SETPRINTTEMPLATE */
282     { OLECMDF_SUPPORTED,                  exec_get_print_template   }  /* OLECMDID_GETPRINTTEMPLATE */
283 };
284
285 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
286 {
287     HTMLDocument *This = CMDTARGET_THIS(iface);
288     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
289 }
290
291 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
292 {
293     HTMLDocument *This = CMDTARGET_THIS(iface);
294     return IHTMLDocument2_AddRef(HTMLDOC(This));
295 }
296
297 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
298 {
299     HTMLDocument *This = CMDTARGET_THIS(iface);
300     return IHTMLDocument_Release(HTMLDOC(This));
301 }
302
303 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
304         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
305 {
306     HTMLDocument *This = CMDTARGET_THIS(iface);
307     HRESULT hres = S_OK, hr;
308
309     TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
310
311     if(!pguidCmdGroup) {
312         ULONG i;
313
314         for(i=0; i<cCmds; i++) {
315             if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
316                 WARN("Unsupported cmdID = %ld\n", prgCmds[i].cmdID);
317                 prgCmds[i].cmdf = 0;
318                 hres = OLECMDERR_E_NOTSUPPORTED;
319             }else {
320                 if(prgCmds[i].cmdID == OLECMDID_OPEN || prgCmds[i].cmdID == OLECMDID_NEW) {
321                     IOleCommandTarget *cmdtrg = NULL;
322                     OLECMD olecmd;
323
324                     prgCmds[i].cmdf = OLECMDF_SUPPORTED;
325                     if(This->client) {
326                         hr = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
327                                 (void**)&cmdtrg);
328                         if(SUCCEEDED(hr)) {
329                             olecmd.cmdID = prgCmds[i].cmdID;
330                             olecmd.cmdf = 0;
331
332                             hr = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &olecmd, NULL);
333                             if(SUCCEEDED(hr) && olecmd.cmdf)
334                                 prgCmds[i].cmdf = olecmd.cmdf;
335                         }
336                     }else {
337                         ERR("This->client == NULL, native would crash\n");
338                     }
339                 }else {
340                     prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
341                     TRACE("cmdID = %ld  returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdf);
342                 }
343                 hres = S_OK;
344             }
345         }
346
347         if(pCmdText)
348             FIXME("Set pCmdText\n");
349     }else {
350         FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
351         hres = OLECMDERR_E_UNKNOWNGROUP;
352     }
353
354     return hres;
355 }
356
357 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
358         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
359 {
360     HTMLDocument *This = CMDTARGET_THIS(iface);
361
362     if(!pguidCmdGroup) {
363         if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
364             WARN("Unsupported cmdID = %ld\n", nCmdID);
365             return OLECMDERR_E_NOTSUPPORTED;
366         }
367
368         return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
369     }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
370         FIXME("unsupported nCmdID %ld of CGID_Explorer group\n", nCmdID);
371         TRACE("%p %p\n", pvaIn, pvaOut);
372         return OLECMDERR_E_NOTSUPPORTED;
373     }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
374         FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID);
375         return OLECMDERR_E_NOTSUPPORTED;
376     }
377
378     FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
379     return OLECMDERR_E_UNKNOWNGROUP;
380 }
381
382 #undef CMDTARGET_THIS
383
384 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
385     OleCommandTarget_QueryInterface,
386     OleCommandTarget_AddRef,
387     OleCommandTarget_Release,
388     OleCommandTarget_QueryStatus,
389     OleCommandTarget_Exec
390 };
391
392 void HTMLDocument_OleCmd_Init(HTMLDocument *This)
393 {
394     This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
395 }