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
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
);
54 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
56 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
60 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
62 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
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
);
78 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
80 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
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
);
96 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
98 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
102 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
104 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
108 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
110 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
114 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
116 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
120 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
122 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
132 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
134 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
138 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
140 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
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
);
156 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
158 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
168 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
170 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
174 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
176 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
186 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
188 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
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 */
205 V_VT(pvaOut
) = VT_BOOL
;
206 V_BOOL(pvaOut
) = VARIANT_TRUE
;
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
);
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
);
224 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
226 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
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
);
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
);
242 static void do_ns_command(NSContainer
*This
, const char *cmd
, nsICommandParams
*nsparam
)
244 nsICommandManager
*cmdmgr
;
245 nsIInterfaceRequestor
*iface_req
;
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
);
257 nsres
= nsIInterfaceRequestor_GetInterface(iface_req
, &IID_nsICommandManager
,
259 nsIInterfaceRequestor_Release(iface_req
);
260 if(NS_FAILED(nsres
)) {
261 ERR("Could not get nsICommandManager: %08lx\n", nsres
);
265 nsres
= nsICommandManager_DoCommand(cmdmgr
, cmd
, nsparam
, NULL
);
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
;
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
);
285 nsres
= nsIInterfaceRequestor_GetInterface(iface_req
, &IID_nsICommandManager
,
287 nsIInterfaceRequestor_Release(iface_req
);
288 if(NS_FAILED(nsres
)) {
289 ERR("Could not get nsICommandManager: %08lx\n", nsres
);
293 nsres
= nsICommandManager_GetCommandState(cmdmgr
, cmd
, NULL
, nsparam
);
295 ERR("GetCommandState(%s) failed: %08lx\n", debugstr_a(cmd
), nsres
);
297 nsICommandManager_Release(cmdmgr
);
301 static HRESULT
exec_fontname(HTMLDocument
*This
, VARIANT
*in
, VARIANT
*out
)
303 TRACE("(%p)->(%p %p)\n", This
, in
, out
);
305 if(!This
->nscontainer
)
309 nsICommandParams
*nsparam
= create_nscommand_params();
313 if(V_VT(in
) != VT_BSTR
) {
314 FIXME("Unsupported vt=%d\n", V_VT(out
));
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
);
324 do_ns_command(This
->nscontainer
, "cmd_fontFace", nsparam
);
326 nsICommandParams_Release(nsparam
);
330 nsICommandParams
*nsparam
;
336 if(V_VT(out
) != VT_BSTR
) {
337 FIXME("Unsupported vt=%d\n", V_VT(out
));
341 nsparam
= create_nscommand_params();
343 nsres
= get_ns_command_state(This
->nscontainer
, "cmd_fontFace", nsparam
);
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);
355 V_BSTR(out
) = SysAllocString(strw
);
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
);
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
);
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
);
392 static HRESULT
exec_browsemode(HTMLDocument
*This
)
394 WARN("(%p)\n", This
);
396 This
->usermode
= BROWSEMODE
;
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
;
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
);
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
);
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
);
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
);
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
)
453 TRACE("(%p)\n", This
);
455 This
->usermode
= EDITMODE
;
458 IOleInPlaceFrame_SetStatusText(This
->frame
, NULL
);
461 IOleCommandTarget
*cmdtrg
= NULL
;
463 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleCommandTarget
,
465 if(SUCCEEDED(hres
)) {
470 IOleCommandTarget_Exec(cmdtrg
, &CGID_ShellDocView
, 37, 0, &var
, NULL
);
475 DOCHOSTUIINFO hostinfo
;
477 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
478 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
479 hres
= IDocHostUIHandler_GetHostInfo(This
->hostui
, &hostinfo
);
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
));
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
);
511 call_property_onchanged(This
->cp_propnotif
, DISPID_READYSTATE
);
516 static HRESULT
exec_baselinefont3(HTMLDocument
*This
)
518 FIXME("(%p)\n", This
);
522 static const struct {
524 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
525 } exec_table
[OLECMDID_GETPRINTTEMPLATE
+1] = {
527 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
528 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
529 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
530 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
531 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
532 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
533 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
534 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
535 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
536 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
537 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
538 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
539 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
540 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
541 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
542 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
543 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
544 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
545 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
546 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
548 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
549 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
550 {0},{0},{0},{0},{0},{0},
551 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
553 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
555 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
556 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
558 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
559 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
561 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
563 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
564 { OLECMDF_SUPPORTED
, exec_get_print_template
} /* OLECMDID_GETPRINTTEMPLATE */
567 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
569 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
570 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppv
);
573 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
575 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
576 return IHTMLDocument2_AddRef(HTMLDOC(This
));
579 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
581 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
582 return IHTMLDocument_Release(HTMLDOC(This
));
585 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
586 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
588 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
589 HRESULT hres
= S_OK
, hr
;
591 TRACE("(%p)->(%s %ld %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
596 for(i
=0; i
<cCmds
; i
++) {
597 if(prgCmds
[i
].cmdID
<OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>OLECMDID_GETPRINTTEMPLATE
) {
598 WARN("Unsupported cmdID = %ld\n", prgCmds
[i
].cmdID
);
600 hres
= OLECMDERR_E_NOTSUPPORTED
;
602 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
603 IOleCommandTarget
*cmdtrg
= NULL
;
606 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
608 hr
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleCommandTarget
,
611 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
614 hr
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
615 if(SUCCEEDED(hr
) && olecmd
.cmdf
)
616 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
619 ERR("This->client == NULL, native would crash\n");
622 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
623 TRACE("cmdID = %ld returning %lx\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
630 FIXME("Set pCmdText\n");
631 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
634 for(i
=0; i
<cCmds
; i
++) {
635 switch(prgCmds
[i
].cmdID
) {
637 FIXME("CGID_MSHTML: IDM_COPY\n");
638 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
641 FIXME("CGID_MSHTML: IDM_CUT\n");
642 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
645 FIXME("CGID_MSHTML: IDM_FONTNAME\n");
646 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
649 FIXME("CGID_MSHTML: IDM_FONTSIZE\n");
650 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
653 FIXME("CGID_MSHTML: IDM_PASTE\n");
654 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
657 FIXME("CGID_MSHTML: IDM_BOLD\n");
658 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
661 FIXME("CGID_MSHTML: IDM_FORECOLOR\n");
662 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
665 FIXME("CGID_MSHTML: IDM_ITALIC\n");
666 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
668 case IDM_JUSTIFYCENTER
:
669 FIXME("CGID_MSHTML: IDM_JUSTIFYCENTER\n");
670 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
672 case IDM_JUSTIFYLEFT
:
673 FIXME("CGID_MSHTML: IDM_JUSTIFYLEFT\n");
674 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
676 case IDM_JUSTIFYRIGHT
:
677 FIXME("CGID_MSHTML: IDM_JUSTIFYRIGHT\n");
678 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
681 FIXME("CGID_MSHTML: IDM_UNDERLINE\n");
682 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
684 case IDM_HORIZONTALLINE
:
685 FIXME("CGID_MSHTML: IDM_HORIZONTALLINE\n");
686 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
689 FIXME("CGID_MSHTML: IDM_ORDERLIST\n");
690 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
692 case IDM_UNORDERLIST
:
693 FIXME("CGID_MSHTML: IDM_UNORDERLIST\n");
694 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
697 FIXME("CGID_MSHTML: IDM_INDENT\n");
698 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
701 FIXME("CGID_MSHTML: IDM_OUTDENT\n");
702 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
704 case IDM_BLOCKDIRLTR
:
705 FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
706 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
708 case IDM_BLOCKDIRRTL
:
709 FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
710 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
713 FIXME("CGID_MSHTML: unsupported cmdID %ld\n", prgCmds
[i
].cmdID
);
718 hres
= prgCmds
[i
-1].cmdf
? S_OK
: OLECMDERR_E_NOTSUPPORTED
;
721 FIXME("Set pCmdText\n");
723 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
724 hres
= OLECMDERR_E_UNKNOWNGROUP
;
730 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
731 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
733 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
736 if(nCmdID
<OLECMDID_OPEN
|| nCmdID
>OLECMDID_GETPRINTTEMPLATE
|| !exec_table
[nCmdID
].func
) {
737 WARN("Unsupported cmdID = %ld\n", nCmdID
);
738 return OLECMDERR_E_NOTSUPPORTED
;
741 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
742 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
743 FIXME("unsupported nCmdID %ld of CGID_Explorer group\n", nCmdID
);
744 TRACE("%p %p\n", pvaIn
, pvaOut
);
745 return OLECMDERR_E_NOTSUPPORTED
;
746 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
747 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID
);
748 return OLECMDERR_E_NOTSUPPORTED
;
749 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
752 return exec_fontname(This
, pvaIn
, pvaOut
);
755 FIXME("unsupported arguments\n");
756 return exec_bold(This
);
759 FIXME("unsupported arguments\n");
760 return exec_italic(This
);
763 FIXME("unsupported arguments\n");
764 return exec_underline(This
);
767 FIXME("unsupported arguments\n");
768 return exec_browsemode(This
);
771 FIXME("unsupported arguments\n");
772 return exec_editmode(This
);
773 case IDM_BASELINEFONT3
:
774 return exec_baselinefont3(This
);
776 FIXME("unsupported nCmdID %ld of CGID_MSHTML group\n", nCmdID
);
777 return OLECMDERR_E_NOTSUPPORTED
;
781 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
782 return OLECMDERR_E_UNKNOWNGROUP
;
785 #undef CMDTARGET_THIS
787 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
788 OleCommandTarget_QueryInterface
,
789 OleCommandTarget_AddRef
,
790 OleCommandTarget_Release
,
791 OleCommandTarget_QueryStatus
,
792 OleCommandTarget_Exec
795 void HTMLDocument_OleCmd_Init(HTMLDocument
*This
)
797 This
->lpOleCommandTargetVtbl
= &OleCommandTargetVtbl
;