2 * Copyright 2005-2007 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
32 #include "wine/debug.h"
34 #include "mshtml_private.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
40 #define NSCMD_COPY "cmd_copy"
42 void do_ns_command(HTMLDocument
*This
, const char *cmd
, nsICommandParams
*nsparam
)
44 nsICommandManager
*cmdmgr
;
47 TRACE("(%p)\n", This
);
49 if(!This
->doc_obj
|| !This
->doc_obj
->nscontainer
)
52 nsres
= get_nsinterface((nsISupports
*)This
->doc_obj
->nscontainer
->webbrowser
, &IID_nsICommandManager
, (void**)&cmdmgr
);
53 if(NS_FAILED(nsres
)) {
54 ERR("Could not get nsICommandManager: %08x\n", nsres
);
58 nsres
= nsICommandManager_DoCommand(cmdmgr
, cmd
, nsparam
, This
->window
->nswindow
);
60 ERR("DoCommand(%s) failed: %08x\n", debugstr_a(cmd
), nsres
);
62 nsICommandManager_Release(cmdmgr
);
65 /**********************************************************
66 * IOleCommandTarget implementation
69 static inline HTMLDocument
*impl_from_IOleCommandTarget(IOleCommandTarget
*iface
)
71 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleCommandTarget_iface
);
74 static HRESULT
exec_open(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
76 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
80 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
82 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
86 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
88 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
92 static HRESULT
exec_save_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
94 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
98 static HRESULT
exec_save_copy_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
100 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
104 static nsresult
set_head_text(nsIPrintSettings
*settings
, LPCWSTR
template, BOOL head
, int pos
)
109 return nsIPrintSettings_SetHeaderStrLeft(settings
, template);
111 return nsIPrintSettings_SetHeaderStrRight(settings
, template);
113 return nsIPrintSettings_SetHeaderStrCenter(settings
, template);
118 return nsIPrintSettings_SetFooterStrLeft(settings
, template);
120 return nsIPrintSettings_SetFooterStrRight(settings
, template);
122 return nsIPrintSettings_SetFooterStrCenter(settings
, template);
129 static void set_print_template(nsIPrintSettings
*settings
, LPCWSTR
template, BOOL head
)
131 PRUnichar nstemplate
[200]; /* FIXME: Use dynamic allocation */
132 PRUnichar
*p
= nstemplate
;
133 LPCWSTR ptr
=template;
148 case 'b': /* change align */
151 set_head_text(settings
, nstemplate
, head
, pos
);
155 case 'd': { /* short date */
157 GetLocalTime(&systime
);
158 GetDateFormatW(LOCALE_SYSTEM_DEFAULT
, 0, &systime
, NULL
, p
,
159 sizeof(nstemplate
)-(p
-nstemplate
)*sizeof(WCHAR
));
164 case 'p': /* page number */
169 case 'P': /* page count */
170 *p
++ = '?'; /* FIXME */
179 /* FIXME: set window title */
189 set_head_text(settings
, nstemplate
, head
, pos
);
192 set_head_text(settings
, p
, head
, pos
);
195 static void set_default_templates(nsIPrintSettings
*settings
)
199 static const PRUnichar empty
[] = {0};
201 nsIPrintSettings_SetHeaderStrLeft(settings
, empty
);
202 nsIPrintSettings_SetHeaderStrRight(settings
, empty
);
203 nsIPrintSettings_SetHeaderStrCenter(settings
, empty
);
204 nsIPrintSettings_SetFooterStrLeft(settings
, empty
);
205 nsIPrintSettings_SetFooterStrRight(settings
, empty
);
206 nsIPrintSettings_SetFooterStrCenter(settings
, empty
);
208 if(LoadStringW(get_shdoclc(), IDS_PRINT_HEADER_TEMPLATE
, buf
,
209 sizeof(buf
)/sizeof(WCHAR
)))
210 set_print_template(settings
, buf
, TRUE
);
213 if(LoadStringW(get_shdoclc(), IDS_PRINT_FOOTER_TEMPLATE
, buf
,
214 sizeof(buf
)/sizeof(WCHAR
)))
215 set_print_template(settings
, buf
, FALSE
);
219 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
221 nsIWebBrowserPrint
*nsprint
;
222 nsIPrintSettings
*settings
;
225 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
228 FIXME("unsupported pvaOut\n");
230 if(!This
->doc_obj
->nscontainer
)
233 nsres
= get_nsinterface((nsISupports
*)This
->doc_obj
->nscontainer
->webbrowser
, &IID_nsIWebBrowserPrint
,
235 if(NS_FAILED(nsres
)) {
236 ERR("Could not get nsIWebBrowserPrint: %08x\n", nsres
);
240 nsres
= nsIWebBrowserPrint_GetGlobalPrintSettings(nsprint
, &settings
);
242 ERR("GetCurrentPrintSettings failed: %08x\n", nsres
);
244 set_default_templates(settings
);
247 switch(V_VT(pvaIn
)) {
248 case VT_BYREF
|VT_ARRAY
: {
252 if(V_ARRAY(pvaIn
)->cDims
!= 1)
253 WARN("cDims = %d\n", V_ARRAY(pvaIn
)->cDims
);
255 SafeArrayAccessData(V_ARRAY(pvaIn
), (void**)&opts
);
256 opts_cnt
= V_ARRAY(pvaIn
)->rgsabound
[0].cElements
;
261 TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts
)));
262 set_print_template(settings
, V_BSTR(opts
), TRUE
);
267 WARN("opts = %s\n", debugstr_variant(opts
));
272 switch(V_VT(opts
+1)) {
274 TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts
+1)));
275 set_print_template(settings
, V_BSTR(opts
+1), FALSE
);
280 WARN("opts[1] = %s\n", debugstr_variant(opts
+1));
285 FIXME("Unsupported opts_cnt %d\n", opts_cnt
);
287 SafeArrayUnaccessData(V_ARRAY(pvaIn
));
291 FIXME("unsupported arg %s\n", debugstr_variant(pvaIn
));
295 nsres
= nsIWebBrowserPrint_Print(nsprint
, settings
, NULL
);
297 ERR("Print failed: %08x\n", nsres
);
299 nsIWebBrowserPrint_Release(nsprint
);
304 static HRESULT
exec_print_preview(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
306 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
310 static HRESULT
exec_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
312 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
316 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
318 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
322 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
324 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
328 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
330 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
334 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
336 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
340 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
342 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
346 static HRESULT
exec_paste_special(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
348 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
352 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
354 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
358 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
360 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
364 static HRESULT
exec_select_all(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
366 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
370 static HRESULT
exec_clear_selection(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
372 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
376 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
378 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
382 static HRESULT
exec_get_zoom_range(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
384 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
390 HTMLOuterWindow
*window
;
393 static void refresh_proc(task_t
*_task
)
395 refresh_task_t
*task
= (refresh_task_t
*)_task
;
396 HTMLOuterWindow
*window
= task
->window
;
398 TRACE("%p\n", window
);
400 window
->readystate
= READYSTATE_UNINITIALIZED
;
402 if(window
->doc_obj
&& window
->doc_obj
->client_cmdtrg
) {
407 IOleCommandTarget_Exec(window
->doc_obj
->client_cmdtrg
, &CGID_ShellDocView
, 37, 0, &var
, NULL
);
410 load_uri(task
->window
, task
->window
->uri
, BINDING_REFRESH
);
413 static void refresh_destr(task_t
*_task
)
415 refresh_task_t
*task
= (refresh_task_t
*)_task
;
417 IHTMLWindow2_Release(&task
->window
->base
.IHTMLWindow2_iface
);
421 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
423 refresh_task_t
*task
;
426 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
428 if(This
->doc_obj
->client
) {
429 IOleCommandTarget
*olecmd
;
431 hres
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
432 if(SUCCEEDED(hres
)) {
433 hres
= IOleCommandTarget_Exec(olecmd
, &CGID_DocHostCommandHandler
, 2300, nCmdexecopt
, pvaIn
, pvaOut
);
434 IOleCommandTarget_Release(olecmd
);
443 task
= heap_alloc(sizeof(*task
));
445 return E_OUTOFMEMORY
;
447 IHTMLWindow2_AddRef(&This
->window
->base
.IHTMLWindow2_iface
);
448 task
->window
= This
->window
;
450 return push_task(&task
->header
, refresh_proc
, refresh_destr
, This
->window
->task_magic
);
453 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
455 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
459 static HRESULT
exec_stop_download(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
461 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
465 static HRESULT
exec_find(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
467 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
471 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
473 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
477 static HRESULT
exec_enable_interaction(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
479 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
483 static HRESULT
exec_on_unload(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
485 TRACE("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
487 /* Tests show that we have nothing more to do here */
490 V_VT(pvaOut
) = VT_BOOL
;
491 V_BOOL(pvaOut
) = VARIANT_TRUE
;
497 static HRESULT
exec_show_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
499 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
503 static HRESULT
exec_show_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
505 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
509 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
511 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
515 static HRESULT
exec_set_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
517 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
521 static HRESULT
exec_get_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
523 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
527 static HRESULT
query_mshtml_copy(HTMLDocument
*This
, OLECMD
*cmd
)
529 FIXME("(%p)\n", This
);
530 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
534 static HRESULT
exec_mshtml_copy(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
536 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
538 if(This
->doc_obj
->usermode
== EDITMODE
)
539 return editor_exec_copy(This
, cmdexecopt
, in
, out
);
541 do_ns_command(This
, NSCMD_COPY
, NULL
);
545 static HRESULT
query_mshtml_cut(HTMLDocument
*This
, OLECMD
*cmd
)
547 FIXME("(%p)\n", This
);
548 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
552 static HRESULT
exec_mshtml_cut(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
554 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
556 if(This
->doc_obj
->usermode
== EDITMODE
)
557 return editor_exec_cut(This
, cmdexecopt
, in
, out
);
559 FIXME("Unimplemented in browse mode\n");
563 static HRESULT
query_mshtml_paste(HTMLDocument
*This
, OLECMD
*cmd
)
565 FIXME("(%p)\n", This
);
566 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
570 static HRESULT
exec_mshtml_paste(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
572 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
574 if(This
->doc_obj
->usermode
== EDITMODE
)
575 return editor_exec_paste(This
, cmdexecopt
, in
, out
);
577 FIXME("Unimplemented in browse mode\n");
581 static HRESULT
exec_browsemode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
583 WARN("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
586 FIXME("unsupported args\n");
588 This
->doc_obj
->usermode
= BROWSEMODE
;
593 static HRESULT
exec_editmode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
598 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
601 FIXME("unsupported args\n");
603 if(This
->doc_obj
->usermode
== EDITMODE
)
606 This
->doc_obj
->usermode
= EDITMODE
;
608 if(This
->window
->mon
) {
609 CLSID clsid
= IID_NULL
;
610 hres
= IMoniker_GetClassID(This
->window
->mon
, &clsid
);
611 if(SUCCEEDED(hres
)) {
612 /* We should use IMoniker::Save here */
613 FIXME("Use CLSID %s\n", debugstr_guid(&clsid
));
617 if(This
->doc_obj
->frame
)
618 IOleInPlaceFrame_SetStatusText(This
->doc_obj
->frame
, NULL
);
620 This
->window
->readystate
= READYSTATE_UNINITIALIZED
;
622 if(This
->doc_obj
->client
) {
623 IOleCommandTarget
*cmdtrg
;
625 hres
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
,
627 if(SUCCEEDED(hres
)) {
632 IOleCommandTarget_Exec(cmdtrg
, &CGID_ShellDocView
, 37, 0, &var
, NULL
);
634 IOleCommandTarget_Release(cmdtrg
);
638 if(This
->doc_obj
->hostui
) {
639 DOCHOSTUIINFO hostinfo
;
641 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
642 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
643 hres
= IDocHostUIHandler_GetHostInfo(This
->doc_obj
->hostui
, &hostinfo
);
645 /* FIXME: use hostinfo */
646 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
647 hostinfo
.cbSize
, hostinfo
.dwFlags
, hostinfo
.dwDoubleClick
,
648 debugstr_w(hostinfo
.pchHostCss
), debugstr_w(hostinfo
.pchHostNS
));
651 update_doc(This
, UPDATE_UI
);
653 if(This
->window
->mon
) {
654 /* FIXME: We should find nicer way to do this */
655 remove_target_tasks(This
->task_magic
);
657 mon
= This
->window
->mon
;
658 IMoniker_AddRef(mon
);
660 static const WCHAR about_blankW
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
662 hres
= CreateURLMoniker(NULL
, about_blankW
, &mon
);
664 FIXME("CreateURLMoniker failed: %08x\n", hres
);
669 hres
= IPersistMoniker_Load(&This
->IPersistMoniker_iface
, TRUE
, mon
, NULL
, 0);
670 IMoniker_Release(mon
);
674 if(This
->doc_obj
->ui_active
) {
675 if(This
->doc_obj
->ip_window
)
676 call_set_active_object(This
->doc_obj
->ip_window
, NULL
);
677 if(This
->doc_obj
->hostui
)
678 IDocHostUIHandler_HideUI(This
->doc_obj
->hostui
);
681 if(This
->doc_obj
->ui_active
) {
684 if(This
->doc_obj
->hostui
)
685 IDocHostUIHandler_ShowUI(This
->doc_obj
->hostui
, DOCHOSTUITYPE_AUTHOR
,
686 &This
->IOleInPlaceActiveObject_iface
, &This
->IOleCommandTarget_iface
,
687 This
->doc_obj
->frame
, This
->doc_obj
->ip_window
);
689 if(This
->doc_obj
->ip_window
)
690 call_set_active_object(This
->doc_obj
->ip_window
, &This
->IOleInPlaceActiveObject_iface
);
692 memset(&rcBorderWidths
, 0, sizeof(rcBorderWidths
));
693 if(This
->doc_obj
->frame
)
694 IOleInPlaceFrame_SetBorderSpace(This
->doc_obj
->frame
, &rcBorderWidths
);
700 static HRESULT
exec_htmleditmode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
702 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
706 static HRESULT
exec_baselinefont3(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
708 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
712 static HRESULT
exec_respectvisibility_indesign(HTMLDocument
*This
, DWORD cmdexecopt
,
713 VARIANT
*in
, VARIANT
*out
)
715 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
719 static HRESULT
query_enabled_stub(HTMLDocument
*This
, OLECMD
*cmd
)
723 FIXME("CGID_MSHTML: IDM_PRINT\n");
724 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
726 case IDM_BLOCKDIRLTR
:
727 FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
728 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
730 case IDM_BLOCKDIRRTL
:
731 FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
732 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
739 static const struct {
741 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
742 } exec_table
[OLECMDID_GETPRINTTEMPLATE
+1] = {
744 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
745 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
746 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
747 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
748 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
749 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
750 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
751 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
752 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
753 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
754 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
755 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
756 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
757 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
758 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
759 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
760 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
761 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
762 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
763 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
765 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
766 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
767 {0},{0},{0},{0},{0},{0},
768 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
770 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_find
}, /* OLECMDID_FIND */
771 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
773 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
774 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
776 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
777 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
779 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
781 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
782 { OLECMDF_SUPPORTED
, exec_get_print_template
} /* OLECMDID_GETPRINTTEMPLATE */
785 static const cmdtable_t base_cmds
[] = {
786 {IDM_COPY
, query_mshtml_copy
, exec_mshtml_copy
},
787 {IDM_PASTE
, query_mshtml_paste
, exec_mshtml_paste
},
788 {IDM_CUT
, query_mshtml_cut
, exec_mshtml_cut
},
789 {IDM_BROWSEMODE
, NULL
, exec_browsemode
},
790 {IDM_EDITMODE
, NULL
, exec_editmode
},
791 {IDM_PRINT
, query_enabled_stub
, exec_print
},
792 {IDM_HTMLEDITMODE
, NULL
, exec_htmleditmode
},
793 {IDM_BASELINEFONT3
, NULL
, exec_baselinefont3
},
794 {IDM_BLOCKDIRLTR
, query_enabled_stub
, NULL
},
795 {IDM_BLOCKDIRRTL
, query_enabled_stub
, NULL
},
796 {IDM_RESPECTVISIBILITY_INDESIGN
, NULL
, exec_respectvisibility_indesign
},
800 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
802 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
803 return htmldoc_query_interface(This
, riid
, ppv
);
806 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
808 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
809 return htmldoc_addref(This
);
812 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
814 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
815 return htmldoc_release(This
);
818 static HRESULT
query_from_table(HTMLDocument
*This
, const cmdtable_t
*cmdtable
, OLECMD
*cmd
)
820 const cmdtable_t
*iter
= cmdtable
;
824 while(iter
->id
&& iter
->id
!= cmd
->cmdID
)
827 if(!iter
->id
|| !iter
->query
)
828 return OLECMDERR_E_NOTSUPPORTED
;
830 return iter
->query(This
, cmd
);
833 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
834 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
836 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
837 HRESULT hres
= S_OK
, hr
;
839 TRACE("(%p)->(%s %d %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
844 for(i
=0; i
<cCmds
; i
++) {
845 if(prgCmds
[i
].cmdID
<OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>OLECMDID_GETPRINTTEMPLATE
) {
846 WARN("Unsupported cmdID = %d\n", prgCmds
[i
].cmdID
);
848 hres
= OLECMDERR_E_NOTSUPPORTED
;
850 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
851 IOleCommandTarget
*cmdtrg
= NULL
;
854 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
855 if(This
->doc_obj
->client
) {
856 hr
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
,
859 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
862 hr
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
863 if(SUCCEEDED(hr
) && olecmd
.cmdf
)
864 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
867 ERR("This->client == NULL, native would crash\n");
870 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
871 TRACE("cmdID = %d returning %x\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
878 FIXME("Set pCmdText\n");
879 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
882 for(i
=0; i
<cCmds
; i
++) {
883 HRESULT hres
= query_from_table(This
, base_cmds
, prgCmds
+i
);
884 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
885 hres
= query_from_table(This
, editmode_cmds
, prgCmds
+i
);
886 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
887 FIXME("CGID_MSHTML: unsupported cmdID %d\n", prgCmds
[i
].cmdID
);
890 hres
= prgCmds
[i
-1].cmdf
? S_OK
: OLECMDERR_E_NOTSUPPORTED
;
893 FIXME("Set pCmdText\n");
895 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
896 hres
= OLECMDERR_E_UNKNOWNGROUP
;
902 static HRESULT
exec_from_table(HTMLDocument
*This
, const cmdtable_t
*cmdtable
, DWORD cmdid
,
903 DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
905 const cmdtable_t
*iter
= cmdtable
;
907 while(iter
->id
&& iter
->id
!= cmdid
)
910 if(!iter
->id
|| !iter
->exec
)
911 return OLECMDERR_E_NOTSUPPORTED
;
913 return iter
->exec(This
, cmdexecopt
, in
, out
);
916 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
917 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
919 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
922 if(nCmdID
<OLECMDID_OPEN
|| nCmdID
>OLECMDID_GETPRINTTEMPLATE
|| !exec_table
[nCmdID
].func
) {
923 WARN("Unsupported cmdID = %d\n", nCmdID
);
924 return OLECMDERR_E_NOTSUPPORTED
;
927 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
928 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
929 FIXME("unsupported nCmdID %d of CGID_Explorer group\n", nCmdID
);
930 TRACE("%p %p\n", pvaIn
, pvaOut
);
931 return OLECMDERR_E_NOTSUPPORTED
;
932 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
933 FIXME("unsupported nCmdID %d of CGID_ShellDocView group\n", nCmdID
);
934 return OLECMDERR_E_NOTSUPPORTED
;
935 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
936 HRESULT hres
= exec_from_table(This
, base_cmds
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
937 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
938 hres
= exec_from_table(This
, editmode_cmds
, nCmdID
,
939 nCmdexecopt
, pvaIn
, pvaOut
);
940 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
941 FIXME("unsupported nCmdID %d of CGID_MSHTML group\n", nCmdID
);
946 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
947 return OLECMDERR_E_UNKNOWNGROUP
;
950 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
951 OleCommandTarget_QueryInterface
,
952 OleCommandTarget_AddRef
,
953 OleCommandTarget_Release
,
954 OleCommandTarget_QueryStatus
,
955 OleCommandTarget_Exec
958 void show_context_menu(HTMLDocumentObj
*This
, DWORD dwID
, POINT
*ppt
, IDispatch
*elem
)
960 HMENU menu_res
, menu
;
963 if(This
->hostui
&& S_OK
== IDocHostUIHandler_ShowContextMenu(This
->hostui
,
964 dwID
, ppt
, (IUnknown
*)&This
->basedoc
.IOleCommandTarget_iface
, elem
))
967 menu_res
= LoadMenuW(get_shdoclc(), MAKEINTRESOURCEW(IDR_BROWSE_CONTEXT_MENU
));
968 menu
= GetSubMenu(menu_res
, dwID
);
970 cmdid
= TrackPopupMenu(menu
, TPM_LEFTALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
971 ppt
->x
, ppt
->y
, 0, This
->hwnd
, NULL
);
972 DestroyMenu(menu_res
);
975 IOleCommandTarget_Exec(&This
->basedoc
.IOleCommandTarget_iface
, &CGID_MSHTML
, cmdid
, 0,
979 void HTMLDocument_OleCmd_Init(HTMLDocument
*This
)
981 This
->IOleCommandTarget_iface
.lpVtbl
= &OleCommandTargetVtbl
;