sane.ds: Add Polish translation.
[wine.git] / dlls / mshtml / olecmd.c
blobc517630427c3a7e351dfdfc0a0bf61e4af398912
1 /*
2 * Copyright 2005-2006 Jacek Caban for CodeWeavers
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.
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.
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
19 #include "config.h"
21 #include <stdarg.h>
22 #include <stdio.h>
24 #define COBJMACROS
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "winnls.h"
30 #include "ole2.h"
31 #include "shlguid.h"
32 #include "mshtmdid.h"
33 #include "idispids.h"
34 #include "mshtmcid.h"
36 #include "wine/debug.h"
38 #include "mshtml_private.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
42 /**********************************************************
43 * IOleCommandTarget implementation
46 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
48 static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
50 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
51 return E_NOTIMPL;
54 static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
56 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
57 return E_NOTIMPL;
60 static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
62 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
63 return E_NOTIMPL;
66 static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
68 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
69 return E_NOTIMPL;
72 static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
74 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
75 return E_NOTIMPL;
78 static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
80 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
81 return E_NOTIMPL;
84 static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
86 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
87 return E_NOTIMPL;
90 static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
92 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
93 return E_NOTIMPL;
96 static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
98 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
99 return E_NOTIMPL;
102 static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
104 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
105 return E_NOTIMPL;
108 static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
110 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
111 return E_NOTIMPL;
114 static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
116 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
117 return E_NOTIMPL;
120 static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
122 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
123 return E_NOTIMPL;
126 static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
128 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
129 return E_NOTIMPL;
132 static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
134 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
135 return E_NOTIMPL;
138 static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
140 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
141 return E_NOTIMPL;
144 static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
146 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
147 return E_NOTIMPL;
150 static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
152 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
153 return E_NOTIMPL;
156 static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
158 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
159 return E_NOTIMPL;
162 static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
164 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
165 return E_NOTIMPL;
168 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
170 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
171 return E_NOTIMPL;
174 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
176 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
177 return E_NOTIMPL;
180 static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
182 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
183 return E_NOTIMPL;
186 static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
188 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
189 return E_NOTIMPL;
192 static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
194 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
195 return E_NOTIMPL;
198 static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
200 TRACE("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
202 /* Tests show that we have nothing more to do here */
204 if(pvaOut) {
205 V_VT(pvaOut) = VT_BOOL;
206 V_BOOL(pvaOut) = VARIANT_TRUE;
209 return S_OK;
212 static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
214 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
215 return E_NOTIMPL;
218 static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
220 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
221 return E_NOTIMPL;
224 static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
226 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
227 return E_NOTIMPL;
230 static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
232 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
233 return E_NOTIMPL;
236 static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
238 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
239 return E_NOTIMPL;
242 static void do_ns_command(NSContainer *This, const char *cmd, nsICommandParams *nsparam)
244 nsICommandManager *cmdmgr;
245 nsIInterfaceRequestor *iface_req;
246 nsresult nsres;
248 FIXME("(%p)\n", This);
250 nsres = nsIWebBrowser_QueryInterface(This->webbrowser,
251 &IID_nsIInterfaceRequestor, (void**)&iface_req);
252 if(NS_FAILED(nsres)) {
253 ERR("Could not get nsIInterfaceRequestor: %08lx\n", nsres);
254 return;
257 nsres = nsIInterfaceRequestor_GetInterface(iface_req, &IID_nsICommandManager,
258 (void**)&cmdmgr);
259 nsIInterfaceRequestor_Release(iface_req);
260 if(NS_FAILED(nsres)) {
261 ERR("Could not get nsICommandManager: %08lx\n", nsres);
262 return;
265 nsres = nsICommandManager_DoCommand(cmdmgr, cmd, nsparam, NULL);
266 if(NS_FAILED(nsres))
267 ERR("DoCommand(%s) failed: %08lx\n", debugstr_a(cmd), nsres);
269 nsICommandManager_Release(cmdmgr);
272 static nsresult get_ns_command_state(NSContainer *This, const char *cmd, nsICommandParams *nsparam)
274 nsICommandManager *cmdmgr;
275 nsIInterfaceRequestor *iface_req;
276 nsresult nsres;
278 nsres = nsIWebBrowser_QueryInterface(This->webbrowser,
279 &IID_nsIInterfaceRequestor, (void**)&iface_req);
280 if(NS_FAILED(nsres)) {
281 ERR("Could not get nsIInterfaceRequestor: %08lx\n", nsres);
282 return nsres;
285 nsres = nsIInterfaceRequestor_GetInterface(iface_req, &IID_nsICommandManager,
286 (void**)&cmdmgr);
287 nsIInterfaceRequestor_Release(iface_req);
288 if(NS_FAILED(nsres)) {
289 ERR("Could not get nsICommandManager: %08lx\n", nsres);
290 return nsres;
293 nsres = nsICommandManager_GetCommandState(cmdmgr, cmd, NULL, nsparam);
294 if(NS_FAILED(nsres))
295 ERR("GetCommandState(%s) failed: %08lx\n", debugstr_a(cmd), nsres);
297 nsICommandManager_Release(cmdmgr);
298 return nsres;
301 static HRESULT exec_fontname(HTMLDocument *This, VARIANT *in, VARIANT *out)
303 TRACE("(%p)->(%p %p)\n", This, in, out);
305 if(!This->nscontainer)
306 return E_FAIL;
308 if(in) {
309 nsICommandParams *nsparam = create_nscommand_params();
310 char *stra;
311 DWORD len;
313 if(V_VT(in) != VT_BSTR) {
314 FIXME("Unsupported vt=%d\n", V_VT(out));
315 return E_INVALIDARG;
318 len = WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, NULL, 0, NULL, NULL);
319 stra = mshtml_alloc(len);
320 WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, stra, -1, NULL, NULL);
321 nsICommandParams_SetCStringValue(nsparam, "state_attribute", stra);
322 mshtml_free(stra);
324 do_ns_command(This->nscontainer, "cmd_fontFace", nsparam);
326 nsICommandParams_Release(nsparam);
329 if(out) {
330 nsICommandParams *nsparam;
331 LPWSTR strw;
332 char *stra;
333 DWORD len;
334 nsresult nsres;
336 if(V_VT(out) != VT_BSTR) {
337 FIXME("Unsupported vt=%d\n", V_VT(out));
338 return E_INVALIDARG;
341 nsparam = create_nscommand_params();
343 nsres = get_ns_command_state(This->nscontainer, "cmd_fontFace", nsparam);
344 if(NS_FAILED(nsres))
345 return S_OK;
347 nsICommandParams_GetCStringValue(nsparam, "state_attribute", &stra);
348 nsICommandParams_Release(nsparam);
350 len = MultiByteToWideChar(CP_ACP, 0, stra, -1, NULL, 0);
351 strw = mshtml_alloc(len*sizeof(WCHAR));
352 MultiByteToWideChar(CP_ACP, 0, stra, -1, strw, -1);
353 nsfree(stra);
355 V_BSTR(out) = SysAllocString(strw);
356 mshtml_free(strw);
359 return S_OK;
362 static HRESULT exec_bold(HTMLDocument *This)
364 TRACE("(%p)\n", This);
366 if(This->nscontainer)
367 do_ns_command(This->nscontainer, "cmd_bold", NULL);
369 return S_OK;
372 static HRESULT exec_italic(HTMLDocument *This)
374 TRACE("(%p)\n", This);
376 if(This->nscontainer)
377 do_ns_command(This->nscontainer, "cmd_italic", NULL);
379 return S_OK;
382 static HRESULT exec_underline(HTMLDocument *This)
384 TRACE("(%p)\n", This);
386 if(This->nscontainer)
387 do_ns_command(This->nscontainer, "cmd_underline", NULL);
389 return S_OK;
392 static HRESULT exec_browsemode(HTMLDocument *This)
394 WARN("(%p)\n", This);
396 This->usermode = BROWSEMODE;
398 return S_OK;
401 static void setup_ns_editing(NSContainer *This)
403 nsIInterfaceRequestor *iface_req;
404 nsIEditingSession *editing_session = NULL;
405 nsIURIContentListener *listener = NULL;
406 nsIDOMWindow *dom_window = NULL;
407 nsresult nsres;
409 nsres = nsIWebBrowser_QueryInterface(This->webbrowser,
410 &IID_nsIInterfaceRequestor, (void**)&iface_req);
411 if(NS_FAILED(nsres)) {
412 ERR("Could not get nsIInterfaceRequestor: %08lx\n", nsres);
413 return;
416 nsres = nsIInterfaceRequestor_GetInterface(iface_req, &IID_nsIEditingSession,
417 (void**)&editing_session);
418 nsIInterfaceRequestor_Release(iface_req);
419 if(NS_FAILED(nsres)) {
420 ERR("Could not get nsIEditingSession: %08lx\n", nsres);
421 return;
424 nsres = nsIWebBrowser_GetContentDOMWindow(This->webbrowser, &dom_window);
425 nsIDOMWindow_Release(dom_window);
426 if(NS_FAILED(nsres)) {
427 ERR("Could not get content DOM window: %08lx\n", nsres);
428 nsIEditingSession_Release(editing_session);
429 return;
432 nsres = nsIEditingSession_MakeWindowEditable(editing_session, dom_window, NULL, FALSE);
433 nsIEditingSession_Release(editing_session);
434 if(NS_FAILED(nsres)) {
435 ERR("MakeWindowEditable failed: %08lx\n", nsres);
436 return;
439 /* MakeWindowEditable changes WebBrowser's parent URI content listener.
440 * It seams to be a bug in Gecko. To workaround it we set our content
441 * listener again and Gecko's one as its parent.
443 nsIWebBrowser_GetParentURIContentListener(This->webbrowser, &listener);
444 nsIURIContentListener_SetParentContentListener(NSURICL(This), listener);
445 nsIURIContentListener_Release(listener);
446 nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This));
449 static HRESULT exec_editmode(HTMLDocument *This)
451 HRESULT hres;
453 TRACE("(%p)\n", This);
455 This->usermode = EDITMODE;
457 if(This->frame)
458 IOleInPlaceFrame_SetStatusText(This->frame, NULL);
460 if(This->client) {
461 IOleCommandTarget *cmdtrg = NULL;
463 hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
464 (void**)&cmdtrg);
465 if(SUCCEEDED(hres)) {
466 VARIANT var;
468 V_VT(&var) = VT_I4;
469 V_I4(&var) = 0;
470 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
474 if(This->hostui) {
475 DOCHOSTUIINFO hostinfo;
477 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
478 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
479 hres = IDocHostUIHandler_GetHostInfo(This->hostui, &hostinfo);
480 if(SUCCEEDED(hres))
481 /* FIXME: use hostinfo */
482 TRACE("hostinfo = {%lu %08lx %08lx %s %s}\n",
483 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
484 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
487 if(This->client) {
488 VARIANT silent, offline;
490 hres = get_client_disp_property(This->client, DISPID_AMBIENT_SILENT, &silent);
491 if(SUCCEEDED(hres)) {
492 if(V_VT(&silent) != VT_BOOL)
493 WARN("V_VT(silent) = %d\n", V_VT(&silent));
494 else if(V_BOOL(&silent))
495 FIXME("silent == true\n");
498 hres = get_client_disp_property(This->client,
499 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &offline);
500 if(SUCCEEDED(hres)) {
501 if(V_VT(&silent) != VT_BOOL)
502 WARN("V_VT(offline) = %d\n", V_VT(&silent));
503 else if(V_BOOL(&silent))
504 FIXME("offline == true\n");
508 if(This->nscontainer)
509 setup_ns_editing(This->nscontainer);
512 * FIXME: We should load about:protocol here.
514 This->readystate = READYSTATE_LOADING;
515 call_property_onchanged(This->cp_propnotif, DISPID_READYSTATE);
517 return S_OK;
520 static HRESULT exec_baselinefont3(HTMLDocument *This)
522 FIXME("(%p)\n", This);
523 return S_OK;
526 static const struct {
527 OLECMDF cmdf;
528 HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
529 } exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
530 {0},
531 { OLECMDF_SUPPORTED, exec_open }, /* OLECMDID_OPEN */
532 { OLECMDF_SUPPORTED, exec_new }, /* OLECMDID_NEW */
533 { OLECMDF_SUPPORTED, exec_save }, /* OLECMDID_SAVE */
534 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_save_as }, /* OLECMDID_SAVEAS */
535 { OLECMDF_SUPPORTED, exec_save_copy_as }, /* OLECMDID_SAVECOPYAS */
536 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print }, /* OLECMDID_PRINT */
537 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print_preview }, /* OLECMDID_PRINTPREVIEW */
538 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_page_setup }, /* OLECMDID_PAGESETUP */
539 { OLECMDF_SUPPORTED, exec_spell }, /* OLECMDID_SPELL */
540 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_properties }, /* OLECMDID_PROPERTIES */
541 { OLECMDF_SUPPORTED, exec_cut }, /* OLECMDID_CUT */
542 { OLECMDF_SUPPORTED, exec_copy }, /* OLECMDID_COPY */
543 { OLECMDF_SUPPORTED, exec_paste }, /* OLECMDID_PASTE */
544 { OLECMDF_SUPPORTED, exec_paste_special }, /* OLECMDID_PASTESPECIAL */
545 { OLECMDF_SUPPORTED, exec_undo }, /* OLECMDID_UNDO */
546 { OLECMDF_SUPPORTED, exec_rendo }, /* OLECMDID_REDO */
547 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_select_all }, /* OLECMDID_SELECTALL */
548 { OLECMDF_SUPPORTED, exec_clear_selection }, /* OLECMDID_CLEARSELECTION */
549 { OLECMDF_SUPPORTED, exec_zoom }, /* OLECMDID_ZOOM */
550 { OLECMDF_SUPPORTED, exec_get_zoom_range }, /* OLECMDID_GETZOOMRANGE */
551 {0},
552 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_refresh }, /* OLECMDID_REFRESH */
553 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_stop }, /* OLECMDID_STOP */
554 {0},{0},{0},{0},{0},{0},
555 { OLECMDF_SUPPORTED, exec_stop_download }, /* OLECMDID_STOPDOWNLOAD */
556 {0},{0},
557 { OLECMDF_SUPPORTED, exec_delete }, /* OLECMDID_DELETE */
558 {0},{0},
559 { OLECMDF_SUPPORTED, exec_enable_interaction }, /* OLECMDID_ENABLE_INTERACTION */
560 { OLECMDF_SUPPORTED, exec_on_unload }, /* OLECMDID_ONUNLOAD */
561 {0},{0},{0},{0},{0},
562 { OLECMDF_SUPPORTED, exec_show_page_setup }, /* OLECMDID_SHOWPAGESETUP */
563 { OLECMDF_SUPPORTED, exec_show_print }, /* OLECMDID_SHOWPRINT */
564 {0},{0},
565 { OLECMDF_SUPPORTED, exec_close }, /* OLECMDID_CLOSE */
566 {0},{0},{0},
567 { OLECMDF_SUPPORTED, exec_set_print_template }, /* OLECMDID_SETPRINTTEMPLATE */
568 { OLECMDF_SUPPORTED, exec_get_print_template } /* OLECMDID_GETPRINTTEMPLATE */
571 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
573 HTMLDocument *This = CMDTARGET_THIS(iface);
574 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
577 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
579 HTMLDocument *This = CMDTARGET_THIS(iface);
580 return IHTMLDocument2_AddRef(HTMLDOC(This));
583 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
585 HTMLDocument *This = CMDTARGET_THIS(iface);
586 return IHTMLDocument_Release(HTMLDOC(This));
589 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
590 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
592 HTMLDocument *This = CMDTARGET_THIS(iface);
593 HRESULT hres = S_OK, hr;
595 TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
597 if(!pguidCmdGroup) {
598 ULONG i;
600 for(i=0; i<cCmds; i++) {
601 if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
602 WARN("Unsupported cmdID = %ld\n", prgCmds[i].cmdID);
603 prgCmds[i].cmdf = 0;
604 hres = OLECMDERR_E_NOTSUPPORTED;
605 }else {
606 if(prgCmds[i].cmdID == OLECMDID_OPEN || prgCmds[i].cmdID == OLECMDID_NEW) {
607 IOleCommandTarget *cmdtrg = NULL;
608 OLECMD olecmd;
610 prgCmds[i].cmdf = OLECMDF_SUPPORTED;
611 if(This->client) {
612 hr = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
613 (void**)&cmdtrg);
614 if(SUCCEEDED(hr)) {
615 olecmd.cmdID = prgCmds[i].cmdID;
616 olecmd.cmdf = 0;
618 hr = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &olecmd, NULL);
619 if(SUCCEEDED(hr) && olecmd.cmdf)
620 prgCmds[i].cmdf = olecmd.cmdf;
622 }else {
623 ERR("This->client == NULL, native would crash\n");
625 }else {
626 prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
627 TRACE("cmdID = %ld returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdf);
629 hres = S_OK;
633 if(pCmdText)
634 FIXME("Set pCmdText\n");
635 }else if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
636 ULONG i;
638 for(i=0; i<cCmds; i++) {
639 switch(prgCmds[i].cmdID) {
640 case IDM_COPY:
641 FIXME("CGID_MSHTML: IDM_COPY\n");
642 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
643 break;
644 case IDM_CUT:
645 FIXME("CGID_MSHTML: IDM_CUT\n");
646 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
647 break;
648 case IDM_FONTNAME:
649 FIXME("CGID_MSHTML: IDM_FONTNAME\n");
650 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
651 break;
652 case IDM_FONTSIZE:
653 FIXME("CGID_MSHTML: IDM_FONTSIZE\n");
654 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
655 break;
656 case IDM_PASTE:
657 FIXME("CGID_MSHTML: IDM_PASTE\n");
658 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
659 break;
660 case IDM_BOLD:
661 FIXME("CGID_MSHTML: IDM_BOLD\n");
662 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
663 break;
664 case IDM_FORECOLOR:
665 FIXME("CGID_MSHTML: IDM_FORECOLOR\n");
666 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
667 break;
668 case IDM_ITALIC:
669 FIXME("CGID_MSHTML: IDM_ITALIC\n");
670 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
671 break;
672 case IDM_JUSTIFYCENTER:
673 FIXME("CGID_MSHTML: IDM_JUSTIFYCENTER\n");
674 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
675 break;
676 case IDM_JUSTIFYLEFT:
677 FIXME("CGID_MSHTML: IDM_JUSTIFYLEFT\n");
678 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
679 break;
680 case IDM_JUSTIFYRIGHT:
681 FIXME("CGID_MSHTML: IDM_JUSTIFYRIGHT\n");
682 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
683 break;
684 case IDM_UNDERLINE:
685 FIXME("CGID_MSHTML: IDM_UNDERLINE\n");
686 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
687 break;
688 case IDM_HORIZONTALLINE:
689 FIXME("CGID_MSHTML: IDM_HORIZONTALLINE\n");
690 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
691 break;
692 case IDM_ORDERLIST:
693 FIXME("CGID_MSHTML: IDM_ORDERLIST\n");
694 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
695 break;
696 case IDM_UNORDERLIST:
697 FIXME("CGID_MSHTML: IDM_UNORDERLIST\n");
698 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
699 break;
700 case IDM_INDENT:
701 FIXME("CGID_MSHTML: IDM_INDENT\n");
702 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
703 break;
704 case IDM_OUTDENT:
705 FIXME("CGID_MSHTML: IDM_OUTDENT\n");
706 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
707 break;
708 case IDM_BLOCKDIRLTR:
709 FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
710 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
711 break;
712 case IDM_BLOCKDIRRTL:
713 FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
714 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
715 break;
716 default:
717 FIXME("CGID_MSHTML: unsupported cmdID %ld\n", prgCmds[i].cmdID);
718 prgCmds[i].cmdf = 0;
722 hres = prgCmds[i-1].cmdf ? S_OK : OLECMDERR_E_NOTSUPPORTED;
724 if(pCmdText)
725 FIXME("Set pCmdText\n");
726 }else {
727 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
728 hres = OLECMDERR_E_UNKNOWNGROUP;
731 return hres;
734 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
735 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
737 HTMLDocument *This = CMDTARGET_THIS(iface);
739 if(!pguidCmdGroup) {
740 if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
741 WARN("Unsupported cmdID = %ld\n", nCmdID);
742 return OLECMDERR_E_NOTSUPPORTED;
745 return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
746 }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
747 FIXME("unsupported nCmdID %ld of CGID_Explorer group\n", nCmdID);
748 TRACE("%p %p\n", pvaIn, pvaOut);
749 return OLECMDERR_E_NOTSUPPORTED;
750 }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
751 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID);
752 return OLECMDERR_E_NOTSUPPORTED;
753 }else if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
754 switch(nCmdID) {
755 case IDM_FONTNAME:
756 return exec_fontname(This, pvaIn, pvaOut);
757 case IDM_BOLD:
758 if(pvaIn || pvaOut)
759 FIXME("unsupported arguments\n");
760 return exec_bold(This);
761 case IDM_ITALIC:
762 if(pvaIn || pvaOut)
763 FIXME("unsupported arguments\n");
764 return exec_italic(This);
765 case IDM_UNDERLINE:
766 if(pvaIn || pvaOut)
767 FIXME("unsupported arguments\n");
768 return exec_underline(This);
769 case IDM_BROWSEMODE:
770 if(pvaIn || pvaOut)
771 FIXME("unsupported arguments\n");
772 return exec_browsemode(This);
773 case IDM_EDITMODE:
774 if(pvaIn || pvaOut)
775 FIXME("unsupported arguments\n");
776 return exec_editmode(This);
777 case IDM_BASELINEFONT3:
778 return exec_baselinefont3(This);
779 default:
780 FIXME("unsupported nCmdID %ld of CGID_MSHTML group\n", nCmdID);
781 return OLECMDERR_E_NOTSUPPORTED;
785 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
786 return OLECMDERR_E_UNKNOWNGROUP;
789 #undef CMDTARGET_THIS
791 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
792 OleCommandTarget_QueryInterface,
793 OleCommandTarget_AddRef,
794 OleCommandTarget_Release,
795 OleCommandTarget_QueryStatus,
796 OleCommandTarget_Exec
799 void HTMLDocument_OleCmd_Init(HTMLDocument *This)
801 This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;