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
19 #include "mshtml_private.h"
21 #define NSCMD_COPY "cmd_copy"
22 #define NSCMD_SELECTALL "cmd_selectAll"
24 void do_ns_command(HTMLDocument
*This
, const char *cmd
, nsICommandParams
*nsparam
)
26 nsICommandManager
*cmdmgr
;
29 TRACE("(%p)\n", This
);
31 if(!This
->doc_obj
|| !This
->doc_obj
->nscontainer
)
34 nsres
= get_nsinterface((nsISupports
*)This
->doc_obj
->nscontainer
->webbrowser
, &IID_nsICommandManager
, (void**)&cmdmgr
);
35 if(NS_FAILED(nsres
)) {
36 ERR("Could not get nsICommandManager: %08x\n", nsres
);
40 nsres
= nsICommandManager_DoCommand(cmdmgr
, cmd
, nsparam
, This
->window
->nswindow
);
42 ERR("DoCommand(%s) failed: %08x\n", debugstr_a(cmd
), nsres
);
44 nsICommandManager_Release(cmdmgr
);
47 static nsIClipboardCommands
*get_clipboard_commands(HTMLDocument
*doc
)
49 nsIClipboardCommands
*clipboard_commands
;
50 nsIDocShell
*doc_shell
;
53 nsres
= get_nsinterface((nsISupports
*)doc
->window
->nswindow
, &IID_nsIDocShell
, (void**)&doc_shell
);
54 if(NS_FAILED(nsres
)) {
55 ERR("Could not get nsIDocShell interface\n");
59 nsres
= nsIDocShell_QueryInterface(doc_shell
, &IID_nsIClipboardCommands
, (void**)&clipboard_commands
);
60 nsIDocShell_Release(doc_shell
);
61 if(NS_FAILED(nsres
)) {
62 ERR("Could not get nsIClipboardCommands interface\n");
66 return clipboard_commands
;
69 /**********************************************************
70 * IOleCommandTarget implementation
73 static inline HTMLDocument
*impl_from_IOleCommandTarget(IOleCommandTarget
*iface
)
75 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleCommandTarget_iface
);
78 static HRESULT
exec_open(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
80 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
84 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
86 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
90 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
92 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
96 static HRESULT
exec_save_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
98 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
102 static HRESULT
exec_save_copy_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
104 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
108 static nsresult
set_head_text(nsIPrintSettings
*settings
, LPCWSTR
template, BOOL head
, int pos
)
113 return nsIPrintSettings_SetHeaderStrLeft(settings
, template);
115 return nsIPrintSettings_SetHeaderStrRight(settings
, template);
117 return nsIPrintSettings_SetHeaderStrCenter(settings
, template);
122 return nsIPrintSettings_SetFooterStrLeft(settings
, template);
124 return nsIPrintSettings_SetFooterStrRight(settings
, template);
126 return nsIPrintSettings_SetFooterStrCenter(settings
, template);
133 static void set_print_template(nsIPrintSettings
*settings
, LPCWSTR
template, BOOL head
)
135 PRUnichar nstemplate
[200]; /* FIXME: Use dynamic allocation */
136 PRUnichar
*p
= nstemplate
;
137 LPCWSTR ptr
=template;
152 case 'b': /* change align */
155 set_head_text(settings
, nstemplate
, head
, pos
);
159 case 'd': { /* short date */
161 GetLocalTime(&systime
);
162 GetDateFormatW(LOCALE_SYSTEM_DEFAULT
, 0, &systime
, NULL
, p
,
163 sizeof(nstemplate
)-(p
-nstemplate
)*sizeof(WCHAR
));
168 case 'p': /* page number */
173 case 'P': /* page count */
174 *p
++ = '?'; /* FIXME */
183 /* FIXME: set window title */
193 set_head_text(settings
, nstemplate
, head
, pos
);
196 set_head_text(settings
, p
, head
, pos
);
199 static void set_default_templates(nsIPrintSettings
*settings
)
203 static const PRUnichar empty
[] = {0};
205 nsIPrintSettings_SetHeaderStrLeft(settings
, empty
);
206 nsIPrintSettings_SetHeaderStrRight(settings
, empty
);
207 nsIPrintSettings_SetHeaderStrCenter(settings
, empty
);
208 nsIPrintSettings_SetFooterStrLeft(settings
, empty
);
209 nsIPrintSettings_SetFooterStrRight(settings
, empty
);
210 nsIPrintSettings_SetFooterStrCenter(settings
, empty
);
212 if(LoadStringW(get_shdoclc(), IDS_PRINT_HEADER_TEMPLATE
, buf
,
213 sizeof(buf
)/sizeof(WCHAR
)))
214 set_print_template(settings
, buf
, TRUE
);
217 if(LoadStringW(get_shdoclc(), IDS_PRINT_FOOTER_TEMPLATE
, buf
,
218 sizeof(buf
)/sizeof(WCHAR
)))
219 set_print_template(settings
, buf
, FALSE
);
223 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
225 nsIWebBrowserPrint
*nsprint
;
226 nsIPrintSettings
*settings
;
229 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
232 FIXME("unsupported pvaOut\n");
234 if(!This
->doc_obj
->nscontainer
)
237 nsres
= get_nsinterface((nsISupports
*)This
->doc_obj
->nscontainer
->webbrowser
, &IID_nsIWebBrowserPrint
,
239 if(NS_FAILED(nsres
)) {
240 ERR("Could not get nsIWebBrowserPrint: %08x\n", nsres
);
244 nsres
= nsIWebBrowserPrint_GetGlobalPrintSettings(nsprint
, &settings
);
246 ERR("GetCurrentPrintSettings failed: %08x\n", nsres
);
248 set_default_templates(settings
);
251 switch(V_VT(pvaIn
)) {
252 case VT_BYREF
|VT_ARRAY
: {
256 if(V_ARRAY(pvaIn
)->cDims
!= 1)
257 WARN("cDims = %d\n", V_ARRAY(pvaIn
)->cDims
);
259 SafeArrayAccessData(V_ARRAY(pvaIn
), (void**)&opts
);
260 opts_cnt
= V_ARRAY(pvaIn
)->rgsabound
[0].cElements
;
265 TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts
)));
266 set_print_template(settings
, V_BSTR(opts
), TRUE
);
271 WARN("opts = %s\n", debugstr_variant(opts
));
276 switch(V_VT(opts
+1)) {
278 TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts
+1)));
279 set_print_template(settings
, V_BSTR(opts
+1), FALSE
);
284 WARN("opts[1] = %s\n", debugstr_variant(opts
+1));
289 FIXME("Unsupported opts_cnt %d\n", opts_cnt
);
291 SafeArrayUnaccessData(V_ARRAY(pvaIn
));
295 FIXME("unsupported arg %s\n", debugstr_variant(pvaIn
));
299 nsres
= nsIWebBrowserPrint_Print(nsprint
, settings
, NULL
);
301 ERR("Print failed: %08x\n", nsres
);
303 nsIWebBrowserPrint_Release(nsprint
);
308 static HRESULT
exec_print_preview(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
310 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
314 static HRESULT
exec_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
316 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
320 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
322 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
326 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
328 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
332 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
334 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
338 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
340 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
342 do_ns_command(This
, NSCMD_COPY
, NULL
);
346 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
348 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
352 static HRESULT
exec_paste_special(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
354 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
358 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
360 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
364 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
366 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
370 static HRESULT
exec_select_all(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*in
, VARIANT
*out
)
372 TRACE("(%p)\n", This
);
375 FIXME("unsupported args\n");
377 if(This
->doc_obj
->nscontainer
)
378 do_ns_command(This
, NSCMD_SELECTALL
, NULL
);
380 update_doc(This
, UPDATE_UI
);
384 static HRESULT
exec_clear_selection(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
386 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
390 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
392 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
396 static HRESULT
exec_get_zoom_range(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
398 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
404 HTMLOuterWindow
*window
;
407 static void refresh_proc(task_t
*_task
)
409 refresh_task_t
*task
= (refresh_task_t
*)_task
;
410 HTMLOuterWindow
*window
= task
->window
;
412 TRACE("%p\n", window
);
414 window
->readystate
= READYSTATE_UNINITIALIZED
;
416 if(window
->doc_obj
&& window
->doc_obj
->client_cmdtrg
) {
421 IOleCommandTarget_Exec(window
->doc_obj
->client_cmdtrg
, &CGID_ShellDocView
, 37, 0, &var
, NULL
);
424 load_uri(task
->window
, task
->window
->uri
, BINDING_REFRESH
|BINDING_NOFRAG
);
427 static void refresh_destr(task_t
*_task
)
429 refresh_task_t
*task
= (refresh_task_t
*)_task
;
431 IHTMLWindow2_Release(&task
->window
->base
.IHTMLWindow2_iface
);
435 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
437 refresh_task_t
*task
;
440 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
442 if(This
->doc_obj
->client
) {
443 IOleCommandTarget
*olecmd
;
445 hres
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
446 if(SUCCEEDED(hres
)) {
447 hres
= IOleCommandTarget_Exec(olecmd
, &CGID_DocHostCommandHandler
, 2300, nCmdexecopt
, pvaIn
, pvaOut
);
448 IOleCommandTarget_Release(olecmd
);
457 task
= heap_alloc(sizeof(*task
));
459 return E_OUTOFMEMORY
;
461 IHTMLWindow2_AddRef(&This
->window
->base
.IHTMLWindow2_iface
);
462 task
->window
= This
->window
;
464 return push_task(&task
->header
, refresh_proc
, refresh_destr
, This
->window
->task_magic
);
467 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
469 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
473 static HRESULT
exec_stop_download(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
475 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
479 static HRESULT
exec_find(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
481 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
485 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
487 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
491 static HRESULT
exec_enable_interaction(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
493 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
497 static HRESULT
exec_on_unload(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
499 TRACE("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
501 /* Tests show that we have nothing more to do here */
504 V_VT(pvaOut
) = VT_BOOL
;
505 V_BOOL(pvaOut
) = VARIANT_TRUE
;
511 static HRESULT
exec_show_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
513 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
517 static HRESULT
exec_show_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
519 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
523 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
525 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
529 static HRESULT
exec_set_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
531 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
535 static HRESULT
exec_get_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
537 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
541 static HRESULT
exec_optical_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
543 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
545 if(!pvaIn
|| V_VT(pvaIn
) != VT_I4
) {
546 FIXME("Unsupported argument %s\n", debugstr_variant(pvaIn
));
550 set_viewer_zoom(This
->doc_obj
->nscontainer
, (float)V_I4(pvaIn
)/100);
554 static HRESULT
query_mshtml_copy(HTMLDocument
*This
, OLECMD
*cmd
)
556 FIXME("(%p)\n", This
);
557 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
561 static HRESULT
exec_mshtml_copy(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
563 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
565 if(This
->doc_obj
->usermode
== EDITMODE
)
566 return editor_exec_copy(This
, cmdexecopt
, in
, out
);
568 do_ns_command(This
, NSCMD_COPY
, NULL
);
572 static HRESULT
query_mshtml_cut(HTMLDocument
*This
, OLECMD
*cmd
)
574 FIXME("(%p)\n", This
);
575 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
579 static HRESULT
exec_mshtml_cut(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
581 nsIClipboardCommands
*clipboard_commands
;
584 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
586 if(This
->doc_obj
->usermode
== EDITMODE
)
587 return editor_exec_cut(This
, cmdexecopt
, in
, out
);
589 clipboard_commands
= get_clipboard_commands(This
);
590 if(!clipboard_commands
)
593 nsres
= nsIClipboardCommands_CutSelection(clipboard_commands
);
594 nsIClipboardCommands_Release(clipboard_commands
);
595 if(NS_FAILED(nsres
)) {
596 ERR("Paste failed: %08x\n", nsres
);
603 static HRESULT
query_mshtml_paste(HTMLDocument
*This
, OLECMD
*cmd
)
605 FIXME("(%p)\n", This
);
606 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
610 static HRESULT
exec_mshtml_paste(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
612 nsIClipboardCommands
*clipboard_commands
;
615 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
617 if(This
->doc_obj
->usermode
== EDITMODE
)
618 return editor_exec_paste(This
, cmdexecopt
, in
, out
);
620 clipboard_commands
= get_clipboard_commands(This
);
621 if(!clipboard_commands
)
624 nsres
= nsIClipboardCommands_Paste(clipboard_commands
);
625 nsIClipboardCommands_Release(clipboard_commands
);
626 if(NS_FAILED(nsres
)) {
627 ERR("Paste failed: %08x\n", nsres
);
634 static HRESULT
query_selall_status(HTMLDocument
*This
, OLECMD
*cmd
)
636 TRACE("(%p)->(%p)\n", This
, cmd
);
638 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
642 static HRESULT
exec_browsemode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
644 WARN("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
647 FIXME("unsupported args\n");
649 This
->doc_obj
->usermode
= BROWSEMODE
;
654 static HRESULT
exec_editmode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
656 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
659 FIXME("unsupported args\n");
661 return setup_edit_mode(This
->doc_obj
);
664 static HRESULT
exec_htmleditmode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
666 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
670 static HRESULT
exec_baselinefont3(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
672 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
676 static HRESULT
exec_respectvisibility_indesign(HTMLDocument
*This
, DWORD cmdexecopt
,
677 VARIANT
*in
, VARIANT
*out
)
679 TRACE("(%p)->(%x %s %p)\n", This
, cmdexecopt
, debugstr_variant(in
), out
);
681 /* This is turned on by default in Gecko. */
682 if(!in
|| V_VT(in
) != VT_BOOL
|| !V_BOOL(in
))
683 FIXME("Unsupported argument %s\n", debugstr_variant(in
));
688 static HRESULT
query_enabled_stub(HTMLDocument
*This
, OLECMD
*cmd
)
692 FIXME("CGID_MSHTML: IDM_PRINT\n");
693 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
695 case IDM_BLOCKDIRLTR
:
696 FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
697 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
699 case IDM_BLOCKDIRRTL
:
700 FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
701 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
708 static const struct {
710 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
713 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
714 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
715 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
716 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
717 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
718 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
719 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
720 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
721 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
722 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
723 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
724 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
725 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
726 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
727 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
728 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
729 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
730 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
731 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
732 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
734 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
735 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
736 {0},{0},{0},{0},{0},{0},
737 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
739 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_find
}, /* OLECMDID_FIND */
740 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
742 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
743 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
745 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
746 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
748 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
750 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
751 { OLECMDF_SUPPORTED
, exec_get_print_template
}, /* OLECMDID_GETPRINTTEMPLATE */
752 {0},{0},{0},{0},{0},{0},{0},{0},{0},{0},
753 { 0, /* not reported as supported */ exec_optical_zoom
} /* OLECMDID_OPTICAL_ZOOM */
756 static const cmdtable_t base_cmds
[] = {
757 {IDM_COPY
, query_mshtml_copy
, exec_mshtml_copy
},
758 {IDM_PASTE
, query_mshtml_paste
, exec_mshtml_paste
},
759 {IDM_CUT
, query_mshtml_cut
, exec_mshtml_cut
},
760 {IDM_SELECTALL
, query_selall_status
, exec_select_all
},
761 {IDM_BROWSEMODE
, NULL
, exec_browsemode
},
762 {IDM_EDITMODE
, NULL
, exec_editmode
},
763 {IDM_PRINT
, query_enabled_stub
, exec_print
},
764 {IDM_HTMLEDITMODE
, NULL
, exec_htmleditmode
},
765 {IDM_BASELINEFONT3
, NULL
, exec_baselinefont3
},
766 {IDM_BLOCKDIRLTR
, query_enabled_stub
, NULL
},
767 {IDM_BLOCKDIRRTL
, query_enabled_stub
, NULL
},
768 {IDM_RESPECTVISIBILITY_INDESIGN
, NULL
, exec_respectvisibility_indesign
},
772 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
774 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
775 return htmldoc_query_interface(This
, riid
, ppv
);
778 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
780 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
781 return htmldoc_addref(This
);
784 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
786 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
787 return htmldoc_release(This
);
790 static HRESULT
query_from_table(HTMLDocument
*This
, const cmdtable_t
*cmdtable
, OLECMD
*cmd
)
792 const cmdtable_t
*iter
= cmdtable
;
796 while(iter
->id
&& iter
->id
!= cmd
->cmdID
)
799 if(!iter
->id
|| !iter
->query
)
800 return OLECMDERR_E_NOTSUPPORTED
;
802 return iter
->query(This
, cmd
);
805 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
806 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
808 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
811 TRACE("(%p)->(%s %d %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
814 FIXME("Unsupported pCmdText\n");
821 for(i
=0; i
<cCmds
; i
++) {
822 if(prgCmds
[i
].cmdID
< OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>= sizeof(exec_table
)/sizeof(*exec_table
)) {
823 WARN("Unsupported cmdID = %d\n", prgCmds
[i
].cmdID
);
826 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
827 IOleCommandTarget
*cmdtrg
= NULL
;
830 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
831 if(This
->doc_obj
->client
) {
832 hres
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
,
834 if(SUCCEEDED(hres
)) {
835 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
838 hres
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
839 if(SUCCEEDED(hres
) && olecmd
.cmdf
)
840 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
843 ERR("This->client == NULL, native would crash\n");
846 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
847 TRACE("cmdID = %d returning %x\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
852 return (prgCmds
[cCmds
-1].cmdf
& OLECMDF_SUPPORTED
) ? S_OK
: OLECMDERR_E_NOTSUPPORTED
;
855 if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
858 for(i
=0; i
<cCmds
; i
++) {
859 hres
= query_from_table(This
, base_cmds
, prgCmds
+i
);
860 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
861 hres
= query_from_table(This
, editmode_cmds
, prgCmds
+i
);
862 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
863 FIXME("CGID_MSHTML: unsupported cmdID %d\n", prgCmds
[i
].cmdID
);
866 return (prgCmds
[cCmds
-1].cmdf
& OLECMDF_SUPPORTED
) ? S_OK
: OLECMDERR_E_NOTSUPPORTED
;
869 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
870 return OLECMDERR_E_UNKNOWNGROUP
;
873 static HRESULT
exec_from_table(HTMLDocument
*This
, const cmdtable_t
*cmdtable
, DWORD cmdid
,
874 DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
876 const cmdtable_t
*iter
= cmdtable
;
878 while(iter
->id
&& iter
->id
!= cmdid
)
881 if(!iter
->id
|| !iter
->exec
)
882 return OLECMDERR_E_NOTSUPPORTED
;
884 return iter
->exec(This
, cmdexecopt
, in
, out
);
887 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
888 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
890 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
893 if(nCmdID
< OLECMDID_OPEN
|| nCmdID
>= sizeof(exec_table
)/sizeof(*exec_table
) || !exec_table
[nCmdID
].func
) {
894 WARN("Unsupported cmdID = %d\n", nCmdID
);
895 return OLECMDERR_E_NOTSUPPORTED
;
898 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
899 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
900 FIXME("unsupported nCmdID %d of CGID_Explorer group\n", nCmdID
);
901 TRACE("%p %p\n", pvaIn
, pvaOut
);
902 return OLECMDERR_E_NOTSUPPORTED
;
903 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
904 FIXME("unsupported nCmdID %d of CGID_ShellDocView group\n", nCmdID
);
905 return OLECMDERR_E_NOTSUPPORTED
;
906 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
907 HRESULT hres
= exec_from_table(This
, base_cmds
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
908 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
909 hres
= exec_from_table(This
, editmode_cmds
, nCmdID
,
910 nCmdexecopt
, pvaIn
, pvaOut
);
911 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
912 FIXME("unsupported nCmdID %d of CGID_MSHTML group\n", nCmdID
);
917 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
918 return OLECMDERR_E_UNKNOWNGROUP
;
921 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
922 OleCommandTarget_QueryInterface
,
923 OleCommandTarget_AddRef
,
924 OleCommandTarget_Release
,
925 OleCommandTarget_QueryStatus
,
926 OleCommandTarget_Exec
929 void show_context_menu(HTMLDocumentObj
*This
, DWORD dwID
, POINT
*ppt
, IDispatch
*elem
)
931 HMENU menu_res
, menu
;
934 if(This
->hostui
&& S_OK
== IDocHostUIHandler_ShowContextMenu(This
->hostui
,
935 dwID
, ppt
, (IUnknown
*)&This
->basedoc
.IOleCommandTarget_iface
, elem
))
938 menu_res
= LoadMenuW(get_shdoclc(), MAKEINTRESOURCEW(IDR_BROWSE_CONTEXT_MENU
));
939 menu
= GetSubMenu(menu_res
, dwID
);
941 cmdid
= TrackPopupMenu(menu
, TPM_LEFTALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
942 ppt
->x
, ppt
->y
, 0, This
->hwnd
, NULL
);
943 DestroyMenu(menu_res
);
946 IOleCommandTarget_Exec(&This
->basedoc
.IOleCommandTarget_iface
, &CGID_MSHTML
, cmdid
, 0,
950 void HTMLDocument_OleCmd_Init(HTMLDocument
*This
)
952 This
->IOleCommandTarget_iface
.lpVtbl
= &OleCommandTargetVtbl
;