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"
37 #include "wine/unicode.h"
39 #include "mshtml_private.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
43 #define NSCMD_BOLD "cmd_bold"
44 #define NSCMD_ITALIC "cmd_italic"
45 #define NSCMD_UNDERLINE "cmd_underline"
46 #define NSCMD_FONTCOLOR "cmd_fontColor"
47 #define NSCMD_ALIGN "cmd_align"
48 #define NSCMD_FONTFACE "cmd_fontFace"
49 #define NSCMD_INDENT "cmd_indent"
50 #define NSCMD_OUTDENT "cmd_outdent"
51 #define NSCMD_INSERTHR "cmd_insertHR"
52 #define NSCMD_UL "cmd_ul"
53 #define NSCMD_OL "cmd_ol"
55 #define NSSTATE_ATTRIBUTE "state_attribute"
56 #define NSSTATE_ALL "state_all"
58 #define NSALIGN_CENTER "center"
59 #define NSALIGN_LEFT "left"
60 #define NSALIGN_RIGHT "right"
62 /**********************************************************
63 * IOleCommandTarget implementation
66 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
68 static HRESULT
exec_open(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
70 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
74 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
76 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
80 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
82 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
86 static HRESULT
exec_save_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
88 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
92 static HRESULT
exec_save_copy_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
94 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
98 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
100 nsIInterfaceRequestor
*iface_req
;
101 nsIWebBrowserPrint
*nsprint
;
104 TRACE("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
107 FIXME("unsupported pvaOut\n");
109 FIXME("unsupported pvaIn\n");
111 if(!This
->nscontainer
)
114 nsres
= nsIWebBrowser_QueryInterface(This
->nscontainer
->webbrowser
,
115 &IID_nsIInterfaceRequestor
, (void**)&iface_req
);
116 if(NS_FAILED(nsres
)) {
117 ERR("Could not get nsIInterfaceRequestor: %08x\n", nsres
);
121 nsres
= nsIInterfaceRequestor_GetInterface(iface_req
, &IID_nsIWebBrowserPrint
,
123 nsIInterfaceRequestor_Release(iface_req
);
124 if(NS_FAILED(nsres
)) {
125 ERR("Could not get nsIWebBrowserPrint: %08x\n", nsres
);
129 nsres
= nsIWebBrowserPrint_Print(nsprint
, NULL
, NULL
);
131 ERR("Print failed: %08x\n", nsres
);
133 nsIWebBrowserPrint_Release(nsprint
);
138 static HRESULT
exec_print_preview(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
140 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
144 static HRESULT
exec_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
146 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
150 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
152 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
156 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
158 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
162 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
164 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
168 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
170 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
174 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
176 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
180 static HRESULT
exec_paste_special(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
182 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
186 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
188 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
192 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
194 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
198 static HRESULT
exec_select_all(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
200 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
204 static HRESULT
exec_clear_selection(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
206 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
210 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
212 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
216 static HRESULT
exec_get_zoom_range(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
218 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
222 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
224 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
228 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
230 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
234 static HRESULT
exec_stop_download(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
236 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
240 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
242 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
246 static HRESULT
exec_enable_interaction(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
248 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
252 static HRESULT
exec_on_unload(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
254 TRACE("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
256 /* Tests show that we have nothing more to do here */
259 V_VT(pvaOut
) = VT_BOOL
;
260 V_BOOL(pvaOut
) = VARIANT_TRUE
;
266 static HRESULT
exec_show_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
268 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
272 static HRESULT
exec_show_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
274 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
278 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
280 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
284 static HRESULT
exec_set_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
286 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
290 static HRESULT
exec_get_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
292 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
296 static void do_ns_command(NSContainer
*This
, const char *cmd
, nsICommandParams
*nsparam
)
298 nsICommandManager
*cmdmgr
;
299 nsIInterfaceRequestor
*iface_req
;
302 TRACE("(%p)\n", This
);
304 nsres
= nsIWebBrowser_QueryInterface(This
->webbrowser
,
305 &IID_nsIInterfaceRequestor
, (void**)&iface_req
);
306 if(NS_FAILED(nsres
)) {
307 ERR("Could not get nsIInterfaceRequestor: %08x\n", nsres
);
311 nsres
= nsIInterfaceRequestor_GetInterface(iface_req
, &IID_nsICommandManager
,
313 nsIInterfaceRequestor_Release(iface_req
);
314 if(NS_FAILED(nsres
)) {
315 ERR("Could not get nsICommandManager: %08x\n", nsres
);
319 nsres
= nsICommandManager_DoCommand(cmdmgr
, cmd
, nsparam
, NULL
);
321 ERR("DoCommand(%s) failed: %08x\n", debugstr_a(cmd
), nsres
);
323 nsICommandManager_Release(cmdmgr
);
326 static nsresult
get_ns_command_state(NSContainer
*This
, const char *cmd
, nsICommandParams
*nsparam
)
328 nsICommandManager
*cmdmgr
;
329 nsIInterfaceRequestor
*iface_req
;
332 nsres
= nsIWebBrowser_QueryInterface(This
->webbrowser
,
333 &IID_nsIInterfaceRequestor
, (void**)&iface_req
);
334 if(NS_FAILED(nsres
)) {
335 ERR("Could not get nsIInterfaceRequestor: %08x\n", nsres
);
339 nsres
= nsIInterfaceRequestor_GetInterface(iface_req
, &IID_nsICommandManager
,
341 nsIInterfaceRequestor_Release(iface_req
);
342 if(NS_FAILED(nsres
)) {
343 ERR("Could not get nsICommandManager: %08x\n", nsres
);
347 nsres
= nsICommandManager_GetCommandState(cmdmgr
, cmd
, NULL
, nsparam
);
349 ERR("GetCommandState(%s) failed: %08x\n", debugstr_a(cmd
), nsres
);
351 nsICommandManager_Release(cmdmgr
);
355 static DWORD
query_edit_status(HTMLDocument
*This
, const char *nscmd
)
357 nsICommandParams
*nsparam
;
360 if(This
->usermode
!= EDITMODE
|| This
->readystate
< READYSTATE_INTERACTIVE
)
361 return OLECMDF_SUPPORTED
;
363 if(This
->nscontainer
&& nscmd
) {
364 nsparam
= create_nscommand_params();
365 get_ns_command_state(This
->nscontainer
, nscmd
, nsparam
);
367 nsICommandParams_GetBooleanValue(nsparam
, NSSTATE_ALL
, &b
);
369 nsICommandParams_Release(nsparam
);
372 return OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| (b
? OLECMDF_LATCHED
: 0);
375 static DWORD
query_align_status(HTMLDocument
*This
, const char *align_str
)
377 nsICommandParams
*nsparam
;
380 if(This
->usermode
!= EDITMODE
|| This
->readystate
< READYSTATE_INTERACTIVE
)
381 return OLECMDF_SUPPORTED
;
383 if(This
->nscontainer
) {
384 nsparam
= create_nscommand_params();
385 get_ns_command_state(This
->nscontainer
, NSCMD_ALIGN
, nsparam
);
387 nsICommandParams_GetCStringValue(nsparam
, NSSTATE_ATTRIBUTE
, &align
);
389 nsICommandParams_Release(nsparam
);
392 return OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| (align
&& !strcmp(align_str
, align
) ? OLECMDF_LATCHED
: 0);
395 static void set_ns_align(HTMLDocument
*This
, const char *align_str
)
397 nsICommandParams
*nsparam
;
399 if(!This
->nscontainer
)
402 nsparam
= create_nscommand_params();
403 nsICommandParams_SetCStringValue(nsparam
, NSSTATE_ATTRIBUTE
, align_str
);
405 do_ns_command(This
->nscontainer
, NSCMD_ALIGN
, nsparam
);
407 nsICommandParams_Release(nsparam
);
410 static HRESULT
exec_fontname(HTMLDocument
*This
, VARIANT
*in
, VARIANT
*out
)
412 TRACE("(%p)->(%p %p)\n", This
, in
, out
);
414 if(!This
->nscontainer
)
418 nsICommandParams
*nsparam
= create_nscommand_params();
422 if(V_VT(in
) != VT_BSTR
) {
423 FIXME("Unsupported vt=%d\n", V_VT(out
));
427 len
= WideCharToMultiByte(CP_ACP
, 0, V_BSTR(in
), -1, NULL
, 0, NULL
, NULL
);
428 stra
= mshtml_alloc(len
);
429 WideCharToMultiByte(CP_ACP
, 0, V_BSTR(in
), -1, stra
, -1, NULL
, NULL
);
430 nsICommandParams_SetCStringValue(nsparam
, NSSTATE_ATTRIBUTE
, stra
);
433 do_ns_command(This
->nscontainer
, NSCMD_FONTFACE
, nsparam
);
435 nsICommandParams_Release(nsparam
);
439 nsICommandParams
*nsparam
;
445 if(V_VT(out
) != VT_BSTR
) {
446 FIXME("Unsupported vt=%d\n", V_VT(out
));
450 nsparam
= create_nscommand_params();
452 nsres
= get_ns_command_state(This
->nscontainer
, NSCMD_FONTFACE
, nsparam
);
456 nsICommandParams_GetCStringValue(nsparam
, NSSTATE_ATTRIBUTE
, &stra
);
457 nsICommandParams_Release(nsparam
);
459 len
= MultiByteToWideChar(CP_ACP
, 0, stra
, -1, NULL
, 0);
460 strw
= mshtml_alloc(len
*sizeof(WCHAR
));
461 MultiByteToWideChar(CP_ACP
, 0, stra
, -1, strw
, -1);
464 V_BSTR(out
) = SysAllocString(strw
);
471 static HRESULT
exec_forecolor(HTMLDocument
*This
, VARIANT
*in
, VARIANT
*out
)
473 TRACE("(%p)->(%p %p)\n", This
, in
, out
);
476 if(V_VT(in
) == VT_I4
) {
477 nsICommandParams
*nsparam
= create_nscommand_params();
480 sprintf(color_str
, "#%02x%02x%02x",
481 V_I4(in
)&0xff, (V_I4(in
)>>8)&0xff, (V_I4(in
)>>16)&0xff);
483 nsICommandParams_SetCStringValue(nsparam
, NSSTATE_ATTRIBUTE
, color_str
);
484 do_ns_command(This
->nscontainer
, NSCMD_FONTCOLOR
, nsparam
);
486 nsICommandParams_Release(nsparam
);
488 FIXME("unsupported in vt=%d\n", V_VT(in
));
493 FIXME("unsupported out\n");
500 static HRESULT
exec_fontsize(HTMLDocument
*This
, VARIANT
*in
, VARIANT
*out
)
502 TRACE("(%p)->(%p %p)\n", This
, in
, out
);
509 get_font_size(This
, val
);
510 V_I4(out
) = strtolW(val
, NULL
, 10);
513 get_font_size(This
, val
);
514 V_BSTR(out
) = SysAllocString(val
);
517 FIXME("unsupported vt %d\n", V_VT(out
));
525 static const WCHAR format
[] = {'%','d',0};
526 wsprintfW(size
, format
, V_I4(in
));
527 set_font_size(This
, size
);
531 set_font_size(This
, V_BSTR(in
));
534 FIXME("unsupported vt %d\n", V_VT(out
));
541 static HRESULT
exec_bold(HTMLDocument
*This
)
543 TRACE("(%p)\n", This
);
545 if(This
->nscontainer
)
546 do_ns_command(This
->nscontainer
, NSCMD_BOLD
, NULL
);
551 static HRESULT
exec_italic(HTMLDocument
*This
)
553 TRACE("(%p)\n", This
);
555 if(This
->nscontainer
)
556 do_ns_command(This
->nscontainer
, NSCMD_ITALIC
, NULL
);
561 static HRESULT
exec_justifycenter(HTMLDocument
*This
)
563 TRACE("(%p)\n", This
);
564 set_ns_align(This
, NSALIGN_CENTER
);
568 static HRESULT
exec_justifyleft(HTMLDocument
*This
)
570 TRACE("(%p)\n", This
);
571 set_ns_align(This
, NSALIGN_LEFT
);
575 static HRESULT
exec_justifyright(HTMLDocument
*This
)
577 TRACE("(%p)\n", This
);
578 set_ns_align(This
, NSALIGN_RIGHT
);
582 static HRESULT
exec_underline(HTMLDocument
*This
)
584 TRACE("(%p)\n", This
);
586 if(This
->nscontainer
)
587 do_ns_command(This
->nscontainer
, NSCMD_UNDERLINE
, NULL
);
592 static HRESULT
exec_browsemode(HTMLDocument
*This
)
594 WARN("(%p)\n", This
);
596 This
->usermode
= BROWSEMODE
;
601 static void setup_ns_editing(NSContainer
*This
)
603 nsIInterfaceRequestor
*iface_req
;
604 nsIEditingSession
*editing_session
= NULL
;
605 nsIURIContentListener
*listener
= NULL
;
606 nsIDOMWindow
*dom_window
= NULL
;
609 nsres
= nsIWebBrowser_QueryInterface(This
->webbrowser
,
610 &IID_nsIInterfaceRequestor
, (void**)&iface_req
);
611 if(NS_FAILED(nsres
)) {
612 ERR("Could not get nsIInterfaceRequestor: %08x\n", nsres
);
616 nsres
= nsIInterfaceRequestor_GetInterface(iface_req
, &IID_nsIEditingSession
,
617 (void**)&editing_session
);
618 nsIInterfaceRequestor_Release(iface_req
);
619 if(NS_FAILED(nsres
)) {
620 ERR("Could not get nsIEditingSession: %08x\n", nsres
);
624 nsres
= nsIWebBrowser_GetContentDOMWindow(This
->webbrowser
, &dom_window
);
625 if(NS_FAILED(nsres
)) {
626 ERR("Could not get content DOM window: %08x\n", nsres
);
627 nsIEditingSession_Release(editing_session
);
631 nsres
= nsIEditingSession_MakeWindowEditable(editing_session
, dom_window
, NULL
, FALSE
);
632 nsIEditingSession_Release(editing_session
);
633 nsIDOMWindow_Release(dom_window
);
634 if(NS_FAILED(nsres
)) {
635 ERR("MakeWindowEditable failed: %08x\n", nsres
);
639 /* MakeWindowEditable changes WebBrowser's parent URI content listener.
640 * It seams to be a bug in Gecko. To workaround it we set our content
641 * listener again and Gecko's one as its parent.
643 nsIWebBrowser_GetParentURIContentListener(This
->webbrowser
, &listener
);
644 nsIURIContentListener_SetParentContentListener(NSURICL(This
), listener
);
645 nsIURIContentListener_Release(listener
);
646 nsIWebBrowser_SetParentURIContentListener(This
->webbrowser
, NSURICL(This
));
649 static HRESULT
exec_editmode(HTMLDocument
*This
)
654 static const WCHAR wszAboutBlank
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
656 TRACE("(%p)\n", This
);
658 This
->usermode
= EDITMODE
;
661 IOleInPlaceFrame_SetStatusText(This
->frame
, NULL
);
664 DOCHOSTUIINFO hostinfo
;
666 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
667 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
668 hres
= IDocHostUIHandler_GetHostInfo(This
->hostui
, &hostinfo
);
670 /* FIXME: use hostinfo */
671 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
672 hostinfo
.cbSize
, hostinfo
.dwFlags
, hostinfo
.dwDoubleClick
,
673 debugstr_w(hostinfo
.pchHostCss
), debugstr_w(hostinfo
.pchHostNS
));
676 if(This
->nscontainer
)
677 setup_ns_editing(This
->nscontainer
);
679 hres
= CreateURLMoniker(NULL
, wszAboutBlank
, &mon
);
681 FIXME("CreateURLMoniker failed: %08x\n", hres
);
685 return IPersistMoniker_Load(PERSISTMON(This
), TRUE
, mon
, NULL
, 0);
688 static HRESULT
exec_baselinefont3(HTMLDocument
*This
)
690 FIXME("(%p)\n", This
);
694 static HRESULT
exec_horizontalline(HTMLDocument
*This
)
696 TRACE("(%p)\n", This
);
698 if(This
->nscontainer
)
699 do_ns_command(This
->nscontainer
, NSCMD_INSERTHR
, NULL
);
704 static HRESULT
exec_orderlist(HTMLDocument
*This
)
706 TRACE("(%p)\n", This
);
708 if(This
->nscontainer
)
709 do_ns_command(This
->nscontainer
, NSCMD_OL
, NULL
);
714 static HRESULT
exec_unorderlist(HTMLDocument
*This
)
716 TRACE("(%p)\n", This
);
718 if(This
->nscontainer
)
719 do_ns_command(This
->nscontainer
, NSCMD_UL
, NULL
);
724 static HRESULT
exec_indent(HTMLDocument
*This
)
726 TRACE("(%p)\n", This
);
728 if(This
->nscontainer
)
729 do_ns_command(This
->nscontainer
, NSCMD_INDENT
, NULL
);
734 static HRESULT
exec_outdent(HTMLDocument
*This
)
736 TRACE("(%p)\n", This
);
738 if(This
->nscontainer
)
739 do_ns_command(This
->nscontainer
, NSCMD_OUTDENT
, NULL
);
744 static const struct {
746 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
747 } exec_table
[OLECMDID_GETPRINTTEMPLATE
+1] = {
749 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
750 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
751 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
752 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
753 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
754 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
755 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
756 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
757 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
758 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
759 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
760 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
761 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
762 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
763 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
764 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
765 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
766 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
767 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
768 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
770 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
771 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
772 {0},{0},{0},{0},{0},{0},
773 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
775 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
777 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
778 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
780 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
781 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
783 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
785 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
786 { OLECMDF_SUPPORTED
, exec_get_print_template
} /* OLECMDID_GETPRINTTEMPLATE */
789 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
791 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
792 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppv
);
795 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
797 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
798 return IHTMLDocument2_AddRef(HTMLDOC(This
));
801 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
803 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
804 return IHTMLDocument_Release(HTMLDOC(This
));
807 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
808 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
810 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
811 HRESULT hres
= S_OK
, hr
;
813 TRACE("(%p)->(%s %d %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
818 for(i
=0; i
<cCmds
; i
++) {
819 if(prgCmds
[i
].cmdID
<OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>OLECMDID_GETPRINTTEMPLATE
) {
820 WARN("Unsupported cmdID = %d\n", prgCmds
[i
].cmdID
);
822 hres
= OLECMDERR_E_NOTSUPPORTED
;
824 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
825 IOleCommandTarget
*cmdtrg
= NULL
;
828 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
830 hr
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleCommandTarget
,
833 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
836 hr
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
837 if(SUCCEEDED(hr
) && olecmd
.cmdf
)
838 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
841 ERR("This->client == NULL, native would crash\n");
844 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
845 TRACE("cmdID = %d returning %x\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
852 FIXME("Set pCmdText\n");
853 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
856 for(i
=0; i
<cCmds
; i
++) {
857 switch(prgCmds
[i
].cmdID
) {
859 FIXME("CGID_MSHTML: IDM_COPY\n");
860 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
863 FIXME("CGID_MSHTML: IDM_CUT\n");
864 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
867 TRACE("CGID_MSHTML: IDM_FONTNAME\n");
868 prgCmds
[i
].cmdf
= query_edit_status(This
, NULL
);
871 TRACE("CGID_MSHTML: IDM_FONTSIZE\n");
872 prgCmds
[i
].cmdf
= query_edit_status(This
, NULL
);
875 FIXME("CGID_MSHTML: IDM_PRINT\n");
876 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
879 FIXME("CGID_MSHTML: IDM_PASTE\n");
880 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
883 TRACE("CGID_MSHTML: IDM_BOLD\n");
884 prgCmds
[i
].cmdf
= query_edit_status(This
, NSCMD_BOLD
);
887 TRACE("CGID_MSHTML: IDM_FORECOLOR\n");
888 prgCmds
[i
].cmdf
= query_edit_status(This
, NULL
);
891 TRACE("CGID_MSHTML: IDM_ITALIC\n");
892 prgCmds
[i
].cmdf
= query_edit_status(This
, NSCMD_ITALIC
);
894 case IDM_JUSTIFYCENTER
:
895 TRACE("CGID_MSHTML: IDM_JUSTIFYCENTER\n");
896 prgCmds
[i
].cmdf
= query_align_status(This
, NSALIGN_CENTER
);
898 case IDM_JUSTIFYLEFT
:
899 TRACE("CGID_MSHTML: IDM_JUSTIFYLEFT\n");
900 prgCmds
[i
].cmdf
= query_align_status(This
, NSALIGN_LEFT
);
902 case IDM_JUSTIFYRIGHT
:
903 TRACE("CGID_MSHTML: IDM_JUSTIFYRIGHT\n");
904 prgCmds
[i
].cmdf
= query_align_status(This
, NSALIGN_RIGHT
);
907 TRACE("CGID_MSHTML: IDM_UNDERLINE\n");
908 prgCmds
[i
].cmdf
= query_edit_status(This
, NSCMD_UNDERLINE
);
910 case IDM_HORIZONTALLINE
:
911 TRACE("CGID_MSHTML: IDM_HORIZONTALLINE\n");
912 prgCmds
[i
].cmdf
= query_edit_status(This
, NULL
);
915 TRACE("CGID_MSHTML: IDM_ORDERLIST\n");
916 prgCmds
[i
].cmdf
= query_edit_status(This
, NSCMD_OL
);
918 case IDM_UNORDERLIST
:
919 TRACE("CGID_MSHTML: IDM_HORIZONTALLINE\n");
920 prgCmds
[i
].cmdf
= query_edit_status(This
, NSCMD_UL
);
923 TRACE("CGID_MSHTML: IDM_INDENT\n");
924 prgCmds
[i
].cmdf
= query_edit_status(This
, NULL
);
927 TRACE("CGID_MSHTML: IDM_OUTDENT\n");
928 prgCmds
[i
].cmdf
= query_edit_status(This
, NULL
);
930 case IDM_BLOCKDIRLTR
:
931 FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
932 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
934 case IDM_BLOCKDIRRTL
:
935 FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
936 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
939 FIXME("CGID_MSHTML: unsupported cmdID %d\n", prgCmds
[i
].cmdID
);
944 hres
= prgCmds
[i
-1].cmdf
? S_OK
: OLECMDERR_E_NOTSUPPORTED
;
947 FIXME("Set pCmdText\n");
949 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
950 hres
= OLECMDERR_E_UNKNOWNGROUP
;
956 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
957 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
959 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
962 if(nCmdID
<OLECMDID_OPEN
|| nCmdID
>OLECMDID_GETPRINTTEMPLATE
|| !exec_table
[nCmdID
].func
) {
963 WARN("Unsupported cmdID = %d\n", nCmdID
);
964 return OLECMDERR_E_NOTSUPPORTED
;
967 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
968 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
969 FIXME("unsupported nCmdID %d of CGID_Explorer group\n", nCmdID
);
970 TRACE("%p %p\n", pvaIn
, pvaOut
);
971 return OLECMDERR_E_NOTSUPPORTED
;
972 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
973 FIXME("unsupported nCmdID %d of CGID_ShellDocView group\n", nCmdID
);
974 return OLECMDERR_E_NOTSUPPORTED
;
975 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
978 return exec_fontname(This
, pvaIn
, pvaOut
);
980 return exec_fontsize(This
, pvaIn
, pvaOut
);
982 return exec_print(This
, nCmdexecopt
, pvaIn
, pvaOut
);
985 FIXME("unsupported arguments\n");
986 return exec_bold(This
);
988 return exec_forecolor(This
, pvaIn
, pvaOut
);
991 FIXME("unsupported arguments\n");
992 return exec_italic(This
);
993 case IDM_JUSTIFYCENTER
:
995 FIXME("unsupported arguments\n");
996 return exec_justifycenter(This
);
997 case IDM_JUSTIFYLEFT
:
999 FIXME("unsupported arguments\n");
1000 return exec_justifyleft(This
);
1001 case IDM_JUSTIFYRIGHT
:
1003 FIXME("unsupported arguments\n");
1004 return exec_justifyright(This
);
1007 FIXME("unsupported arguments\n");
1008 return exec_underline(This
);
1009 case IDM_BROWSEMODE
:
1011 FIXME("unsupported arguments\n");
1012 return exec_browsemode(This
);
1015 FIXME("unsupported arguments\n");
1016 return exec_editmode(This
);
1017 case IDM_BASELINEFONT3
:
1018 return exec_baselinefont3(This
);
1019 case IDM_HORIZONTALLINE
:
1021 FIXME("unsupported arguments\n");
1022 return exec_horizontalline(This
);
1025 FIXME("unsupported arguments\n");
1026 return exec_orderlist(This
);
1027 case IDM_UNORDERLIST
:
1029 FIXME("unsupported arguments\n");
1030 return exec_unorderlist(This
);
1033 FIXME("unsupported arguments\n");
1034 return exec_indent(This
);
1037 FIXME("unsupported arguments\n");
1038 return exec_outdent(This
);
1040 FIXME("unsupported nCmdID %d of CGID_MSHTML group\n", nCmdID
);
1041 return OLECMDERR_E_NOTSUPPORTED
;
1045 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
1046 return OLECMDERR_E_UNKNOWNGROUP
;
1049 #undef CMDTARGET_THIS
1051 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
1052 OleCommandTarget_QueryInterface
,
1053 OleCommandTarget_AddRef
,
1054 OleCommandTarget_Release
,
1055 OleCommandTarget_QueryStatus
,
1056 OleCommandTarget_Exec
1059 void HTMLDocument_OleCmd_Init(HTMLDocument
*This
)
1061 This
->lpOleCommandTargetVtbl
= &OleCommandTargetVtbl
;