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"
23 void do_ns_command(HTMLDocument
*This
, const char *cmd
, nsICommandParams
*nsparam
)
25 nsICommandManager
*cmdmgr
;
28 TRACE("(%p)\n", This
);
30 if(!This
->doc_obj
|| !This
->doc_obj
->nscontainer
)
33 nsres
= get_nsinterface((nsISupports
*)This
->doc_obj
->nscontainer
->webbrowser
, &IID_nsICommandManager
, (void**)&cmdmgr
);
34 if(NS_FAILED(nsres
)) {
35 ERR("Could not get nsICommandManager: %08x\n", nsres
);
39 nsres
= nsICommandManager_DoCommand(cmdmgr
, cmd
, nsparam
, This
->window
->nswindow
);
41 ERR("DoCommand(%s) failed: %08x\n", debugstr_a(cmd
), nsres
);
43 nsICommandManager_Release(cmdmgr
);
46 /**********************************************************
47 * IOleCommandTarget implementation
50 static inline HTMLDocument
*impl_from_IOleCommandTarget(IOleCommandTarget
*iface
)
52 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleCommandTarget_iface
);
55 static HRESULT
exec_open(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
57 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
61 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
63 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
67 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
69 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
73 static HRESULT
exec_save_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
75 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
79 static HRESULT
exec_save_copy_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
81 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
85 static nsresult
set_head_text(nsIPrintSettings
*settings
, LPCWSTR
template, BOOL head
, int pos
)
90 return nsIPrintSettings_SetHeaderStrLeft(settings
, template);
92 return nsIPrintSettings_SetHeaderStrRight(settings
, template);
94 return nsIPrintSettings_SetHeaderStrCenter(settings
, template);
99 return nsIPrintSettings_SetFooterStrLeft(settings
, template);
101 return nsIPrintSettings_SetFooterStrRight(settings
, template);
103 return nsIPrintSettings_SetFooterStrCenter(settings
, template);
110 static void set_print_template(nsIPrintSettings
*settings
, LPCWSTR
template, BOOL head
)
112 PRUnichar nstemplate
[200]; /* FIXME: Use dynamic allocation */
113 PRUnichar
*p
= nstemplate
;
114 LPCWSTR ptr
=template;
129 case 'b': /* change align */
132 set_head_text(settings
, nstemplate
, head
, pos
);
136 case 'd': { /* short date */
138 GetLocalTime(&systime
);
139 GetDateFormatW(LOCALE_SYSTEM_DEFAULT
, 0, &systime
, NULL
, p
,
140 sizeof(nstemplate
)-(p
-nstemplate
)*sizeof(WCHAR
));
145 case 'p': /* page number */
150 case 'P': /* page count */
151 *p
++ = '?'; /* FIXME */
160 /* FIXME: set window title */
170 set_head_text(settings
, nstemplate
, head
, pos
);
173 set_head_text(settings
, p
, head
, pos
);
176 static void set_default_templates(nsIPrintSettings
*settings
)
180 static const PRUnichar empty
[] = {0};
182 nsIPrintSettings_SetHeaderStrLeft(settings
, empty
);
183 nsIPrintSettings_SetHeaderStrRight(settings
, empty
);
184 nsIPrintSettings_SetHeaderStrCenter(settings
, empty
);
185 nsIPrintSettings_SetFooterStrLeft(settings
, empty
);
186 nsIPrintSettings_SetFooterStrRight(settings
, empty
);
187 nsIPrintSettings_SetFooterStrCenter(settings
, empty
);
189 if(LoadStringW(get_shdoclc(), IDS_PRINT_HEADER_TEMPLATE
, buf
,
190 sizeof(buf
)/sizeof(WCHAR
)))
191 set_print_template(settings
, buf
, TRUE
);
194 if(LoadStringW(get_shdoclc(), IDS_PRINT_FOOTER_TEMPLATE
, buf
,
195 sizeof(buf
)/sizeof(WCHAR
)))
196 set_print_template(settings
, buf
, FALSE
);
200 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
202 nsIWebBrowserPrint
*nsprint
;
203 nsIPrintSettings
*settings
;
206 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
209 FIXME("unsupported pvaOut\n");
211 if(!This
->doc_obj
->nscontainer
)
214 nsres
= get_nsinterface((nsISupports
*)This
->doc_obj
->nscontainer
->webbrowser
, &IID_nsIWebBrowserPrint
,
216 if(NS_FAILED(nsres
)) {
217 ERR("Could not get nsIWebBrowserPrint: %08x\n", nsres
);
221 nsres
= nsIWebBrowserPrint_GetGlobalPrintSettings(nsprint
, &settings
);
223 ERR("GetCurrentPrintSettings failed: %08x\n", nsres
);
225 set_default_templates(settings
);
228 switch(V_VT(pvaIn
)) {
229 case VT_BYREF
|VT_ARRAY
: {
233 if(V_ARRAY(pvaIn
)->cDims
!= 1)
234 WARN("cDims = %d\n", V_ARRAY(pvaIn
)->cDims
);
236 SafeArrayAccessData(V_ARRAY(pvaIn
), (void**)&opts
);
237 opts_cnt
= V_ARRAY(pvaIn
)->rgsabound
[0].cElements
;
242 TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts
)));
243 set_print_template(settings
, V_BSTR(opts
), TRUE
);
248 WARN("opts = %s\n", debugstr_variant(opts
));
253 switch(V_VT(opts
+1)) {
255 TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts
+1)));
256 set_print_template(settings
, V_BSTR(opts
+1), FALSE
);
261 WARN("opts[1] = %s\n", debugstr_variant(opts
+1));
266 FIXME("Unsupported opts_cnt %d\n", opts_cnt
);
268 SafeArrayUnaccessData(V_ARRAY(pvaIn
));
272 FIXME("unsupported arg %s\n", debugstr_variant(pvaIn
));
276 nsres
= nsIWebBrowserPrint_Print(nsprint
, settings
, NULL
);
278 ERR("Print failed: %08x\n", nsres
);
280 nsIWebBrowserPrint_Release(nsprint
);
285 static HRESULT
exec_print_preview(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
287 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
291 static HRESULT
exec_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
293 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
297 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
299 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
303 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
305 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
309 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
311 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
315 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
317 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
321 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
323 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
327 static HRESULT
exec_paste_special(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
329 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
333 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
335 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
339 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
341 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
345 static HRESULT
exec_select_all(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
347 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
351 static HRESULT
exec_clear_selection(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
353 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
357 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
359 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
363 static HRESULT
exec_get_zoom_range(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
365 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
371 HTMLOuterWindow
*window
;
374 static void refresh_proc(task_t
*_task
)
376 refresh_task_t
*task
= (refresh_task_t
*)_task
;
377 HTMLOuterWindow
*window
= task
->window
;
379 TRACE("%p\n", window
);
381 window
->readystate
= READYSTATE_UNINITIALIZED
;
383 if(window
->doc_obj
&& window
->doc_obj
->client_cmdtrg
) {
388 IOleCommandTarget_Exec(window
->doc_obj
->client_cmdtrg
, &CGID_ShellDocView
, 37, 0, &var
, NULL
);
391 load_uri(task
->window
, task
->window
->uri
, BINDING_REFRESH
|BINDING_NOFRAG
);
394 static void refresh_destr(task_t
*_task
)
396 refresh_task_t
*task
= (refresh_task_t
*)_task
;
398 IHTMLWindow2_Release(&task
->window
->base
.IHTMLWindow2_iface
);
402 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
404 refresh_task_t
*task
;
407 TRACE("(%p)->(%d %s %p)\n", This
, nCmdexecopt
, debugstr_variant(pvaIn
), pvaOut
);
409 if(This
->doc_obj
->client
) {
410 IOleCommandTarget
*olecmd
;
412 hres
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
413 if(SUCCEEDED(hres
)) {
414 hres
= IOleCommandTarget_Exec(olecmd
, &CGID_DocHostCommandHandler
, 2300, nCmdexecopt
, pvaIn
, pvaOut
);
415 IOleCommandTarget_Release(olecmd
);
424 task
= heap_alloc(sizeof(*task
));
426 return E_OUTOFMEMORY
;
428 IHTMLWindow2_AddRef(&This
->window
->base
.IHTMLWindow2_iface
);
429 task
->window
= This
->window
;
431 return push_task(&task
->header
, refresh_proc
, refresh_destr
, This
->window
->task_magic
);
434 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
436 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
440 static HRESULT
exec_stop_download(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
442 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
446 static HRESULT
exec_find(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
448 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
452 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
454 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
458 static HRESULT
exec_enable_interaction(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
460 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
464 static HRESULT
exec_on_unload(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
466 TRACE("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
468 /* Tests show that we have nothing more to do here */
471 V_VT(pvaOut
) = VT_BOOL
;
472 V_BOOL(pvaOut
) = VARIANT_TRUE
;
478 static HRESULT
exec_show_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
480 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
484 static HRESULT
exec_show_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
486 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
490 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
492 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
496 static HRESULT
exec_set_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
498 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
502 static HRESULT
exec_get_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
504 FIXME("(%p)->(%d %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
508 static HRESULT
query_mshtml_copy(HTMLDocument
*This
, OLECMD
*cmd
)
510 FIXME("(%p)\n", This
);
511 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
515 static HRESULT
exec_mshtml_copy(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
517 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
519 if(This
->doc_obj
->usermode
== EDITMODE
)
520 return editor_exec_copy(This
, cmdexecopt
, in
, out
);
522 do_ns_command(This
, NSCMD_COPY
, NULL
);
526 static HRESULT
query_mshtml_cut(HTMLDocument
*This
, OLECMD
*cmd
)
528 FIXME("(%p)\n", This
);
529 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
533 static HRESULT
exec_mshtml_cut(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
535 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
537 if(This
->doc_obj
->usermode
== EDITMODE
)
538 return editor_exec_cut(This
, cmdexecopt
, in
, out
);
540 FIXME("Unimplemented in browse mode\n");
544 static HRESULT
query_mshtml_paste(HTMLDocument
*This
, OLECMD
*cmd
)
546 FIXME("(%p)\n", This
);
547 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
551 static HRESULT
exec_mshtml_paste(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
553 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
555 if(This
->doc_obj
->usermode
== EDITMODE
)
556 return editor_exec_paste(This
, cmdexecopt
, in
, out
);
558 FIXME("Unimplemented in browse mode\n");
562 static HRESULT
exec_browsemode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
564 WARN("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
567 FIXME("unsupported args\n");
569 This
->doc_obj
->usermode
= BROWSEMODE
;
574 static HRESULT
exec_editmode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
576 TRACE("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
579 FIXME("unsupported args\n");
581 return setup_edit_mode(This
->doc_obj
);
584 static HRESULT
exec_htmleditmode(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
586 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
590 static HRESULT
exec_baselinefont3(HTMLDocument
*This
, DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
592 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
596 static HRESULT
exec_respectvisibility_indesign(HTMLDocument
*This
, DWORD cmdexecopt
,
597 VARIANT
*in
, VARIANT
*out
)
599 FIXME("(%p)->(%08x %p %p)\n", This
, cmdexecopt
, in
, out
);
603 static HRESULT
query_enabled_stub(HTMLDocument
*This
, OLECMD
*cmd
)
607 FIXME("CGID_MSHTML: IDM_PRINT\n");
608 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
610 case IDM_BLOCKDIRLTR
:
611 FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
612 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
614 case IDM_BLOCKDIRRTL
:
615 FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
616 cmd
->cmdf
= OLECMDF_SUPPORTED
|OLECMDF_ENABLED
;
623 static const struct {
625 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
626 } exec_table
[OLECMDID_GETPRINTTEMPLATE
+1] = {
628 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
629 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
630 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
631 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
632 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
633 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
634 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
635 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
636 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
637 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
638 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
639 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
640 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
641 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
642 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
643 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
644 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
645 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
646 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
647 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
649 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
650 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
651 {0},{0},{0},{0},{0},{0},
652 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
654 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_find
}, /* OLECMDID_FIND */
655 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
657 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
658 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
660 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
661 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
663 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
665 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
666 { OLECMDF_SUPPORTED
, exec_get_print_template
} /* OLECMDID_GETPRINTTEMPLATE */
669 static const cmdtable_t base_cmds
[] = {
670 {IDM_COPY
, query_mshtml_copy
, exec_mshtml_copy
},
671 {IDM_PASTE
, query_mshtml_paste
, exec_mshtml_paste
},
672 {IDM_CUT
, query_mshtml_cut
, exec_mshtml_cut
},
673 {IDM_BROWSEMODE
, NULL
, exec_browsemode
},
674 {IDM_EDITMODE
, NULL
, exec_editmode
},
675 {IDM_PRINT
, query_enabled_stub
, exec_print
},
676 {IDM_HTMLEDITMODE
, NULL
, exec_htmleditmode
},
677 {IDM_BASELINEFONT3
, NULL
, exec_baselinefont3
},
678 {IDM_BLOCKDIRLTR
, query_enabled_stub
, NULL
},
679 {IDM_BLOCKDIRRTL
, query_enabled_stub
, NULL
},
680 {IDM_RESPECTVISIBILITY_INDESIGN
, NULL
, exec_respectvisibility_indesign
},
684 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
686 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
687 return htmldoc_query_interface(This
, riid
, ppv
);
690 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
692 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
693 return htmldoc_addref(This
);
696 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
698 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
699 return htmldoc_release(This
);
702 static HRESULT
query_from_table(HTMLDocument
*This
, const cmdtable_t
*cmdtable
, OLECMD
*cmd
)
704 const cmdtable_t
*iter
= cmdtable
;
708 while(iter
->id
&& iter
->id
!= cmd
->cmdID
)
711 if(!iter
->id
|| !iter
->query
)
712 return OLECMDERR_E_NOTSUPPORTED
;
714 return iter
->query(This
, cmd
);
717 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
718 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
720 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
721 HRESULT hres
= S_OK
, hr
;
723 TRACE("(%p)->(%s %d %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
728 for(i
=0; i
<cCmds
; i
++) {
729 if(prgCmds
[i
].cmdID
<OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>OLECMDID_GETPRINTTEMPLATE
) {
730 WARN("Unsupported cmdID = %d\n", prgCmds
[i
].cmdID
);
732 hres
= OLECMDERR_E_NOTSUPPORTED
;
734 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
735 IOleCommandTarget
*cmdtrg
= NULL
;
738 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
739 if(This
->doc_obj
->client
) {
740 hr
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
,
743 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
746 hr
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
747 if(SUCCEEDED(hr
) && olecmd
.cmdf
)
748 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
751 ERR("This->client == NULL, native would crash\n");
754 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
755 TRACE("cmdID = %d returning %x\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
762 FIXME("Set pCmdText\n");
763 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
766 for(i
=0; i
<cCmds
; i
++) {
767 HRESULT hres
= query_from_table(This
, base_cmds
, prgCmds
+i
);
768 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
769 hres
= query_from_table(This
, editmode_cmds
, prgCmds
+i
);
770 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
771 FIXME("CGID_MSHTML: unsupported cmdID %d\n", prgCmds
[i
].cmdID
);
774 hres
= prgCmds
[i
-1].cmdf
? S_OK
: OLECMDERR_E_NOTSUPPORTED
;
777 FIXME("Set pCmdText\n");
779 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
780 hres
= OLECMDERR_E_UNKNOWNGROUP
;
786 static HRESULT
exec_from_table(HTMLDocument
*This
, const cmdtable_t
*cmdtable
, DWORD cmdid
,
787 DWORD cmdexecopt
, VARIANT
*in
, VARIANT
*out
)
789 const cmdtable_t
*iter
= cmdtable
;
791 while(iter
->id
&& iter
->id
!= cmdid
)
794 if(!iter
->id
|| !iter
->exec
)
795 return OLECMDERR_E_NOTSUPPORTED
;
797 return iter
->exec(This
, cmdexecopt
, in
, out
);
800 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
801 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
803 HTMLDocument
*This
= impl_from_IOleCommandTarget(iface
);
806 if(nCmdID
<OLECMDID_OPEN
|| nCmdID
>OLECMDID_GETPRINTTEMPLATE
|| !exec_table
[nCmdID
].func
) {
807 WARN("Unsupported cmdID = %d\n", nCmdID
);
808 return OLECMDERR_E_NOTSUPPORTED
;
811 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
812 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
813 FIXME("unsupported nCmdID %d of CGID_Explorer group\n", nCmdID
);
814 TRACE("%p %p\n", pvaIn
, pvaOut
);
815 return OLECMDERR_E_NOTSUPPORTED
;
816 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
817 FIXME("unsupported nCmdID %d of CGID_ShellDocView group\n", nCmdID
);
818 return OLECMDERR_E_NOTSUPPORTED
;
819 }else if(IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
820 HRESULT hres
= exec_from_table(This
, base_cmds
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
821 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
822 hres
= exec_from_table(This
, editmode_cmds
, nCmdID
,
823 nCmdexecopt
, pvaIn
, pvaOut
);
824 if(hres
== OLECMDERR_E_NOTSUPPORTED
)
825 FIXME("unsupported nCmdID %d of CGID_MSHTML group\n", nCmdID
);
830 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
831 return OLECMDERR_E_UNKNOWNGROUP
;
834 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
835 OleCommandTarget_QueryInterface
,
836 OleCommandTarget_AddRef
,
837 OleCommandTarget_Release
,
838 OleCommandTarget_QueryStatus
,
839 OleCommandTarget_Exec
842 void show_context_menu(HTMLDocumentObj
*This
, DWORD dwID
, POINT
*ppt
, IDispatch
*elem
)
844 HMENU menu_res
, menu
;
847 if(This
->hostui
&& S_OK
== IDocHostUIHandler_ShowContextMenu(This
->hostui
,
848 dwID
, ppt
, (IUnknown
*)&This
->basedoc
.IOleCommandTarget_iface
, elem
))
851 menu_res
= LoadMenuW(get_shdoclc(), MAKEINTRESOURCEW(IDR_BROWSE_CONTEXT_MENU
));
852 menu
= GetSubMenu(menu_res
, dwID
);
854 cmdid
= TrackPopupMenu(menu
, TPM_LEFTALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
855 ppt
->x
, ppt
->y
, 0, This
->hwnd
, NULL
);
856 DestroyMenu(menu_res
);
859 IOleCommandTarget_Exec(&This
->basedoc
.IOleCommandTarget_iface
, &CGID_MSHTML
, cmdid
, 0,
863 void HTMLDocument_OleCmd_Init(HTMLDocument
*This
)
865 This
->IOleCommandTarget_iface
.lpVtbl
= &OleCommandTargetVtbl
;