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
34 #include "wine/debug.h"
36 #include "mshtml_private.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
40 /**********************************************************
41 * IOleCommandTarget implementation
44 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
46 static HRESULT
exec_open(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
48 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
52 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
54 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
58 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
60 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
64 static HRESULT
exec_save_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
66 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
70 static HRESULT
exec_save_copy_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
72 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
76 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
78 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
82 static HRESULT
exec_print_preview(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
84 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
88 static HRESULT
exec_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
90 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
94 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
96 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
100 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
102 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
106 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
108 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
112 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
114 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
118 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
120 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
124 static HRESULT
exec_paste_special(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
126 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
130 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
132 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
136 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
138 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
142 static HRESULT
exec_select_all(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
144 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
148 static HRESULT
exec_clear_selection(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
150 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
154 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
156 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
160 static HRESULT
exec_get_zoom_range(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
162 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
166 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
168 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
172 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
174 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
178 static HRESULT
exec_stop_download(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
180 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
184 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
186 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
190 static HRESULT
exec_enable_interaction(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
192 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
196 static HRESULT
exec_on_unload(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
198 TRACE("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
200 /* Tests show that we have nothing more to do here */
203 V_VT(pvaOut
) = VT_BOOL
;
204 V_BOOL(pvaOut
) = VARIANT_TRUE
;
210 static HRESULT
exec_show_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
212 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
216 static HRESULT
exec_show_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
218 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
222 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
224 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
228 static HRESULT
exec_set_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
230 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
234 static HRESULT
exec_get_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
236 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
240 static const struct {
242 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
243 } exec_table
[OLECMDID_GETPRINTTEMPLATE
+1] = {
245 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
246 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
247 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
248 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
249 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
250 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
251 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
252 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
253 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
254 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
255 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
256 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
257 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
258 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
259 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
260 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
261 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
262 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
263 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
264 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
266 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
267 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
268 {0},{0},{0},{0},{0},{0},
269 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
271 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
273 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
274 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
276 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
277 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
279 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
281 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
282 { OLECMDF_SUPPORTED
, exec_get_print_template
} /* OLECMDID_GETPRINTTEMPLATE */
285 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
287 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
288 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppv
);
291 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
293 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
294 return IHTMLDocument2_AddRef(HTMLDOC(This
));
297 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
299 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
300 return IHTMLDocument_Release(HTMLDOC(This
));
303 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
304 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
306 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
307 HRESULT hres
= S_OK
, hr
;
309 TRACE("(%p)->(%s %ld %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
314 for(i
=0; i
<cCmds
; i
++) {
315 if(prgCmds
[i
].cmdID
<OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>OLECMDID_GETPRINTTEMPLATE
) {
316 WARN("Unsupported cmdID = %ld\n", prgCmds
[i
].cmdID
);
318 hres
= OLECMDERR_E_NOTSUPPORTED
;
320 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
321 IOleCommandTarget
*cmdtrg
= NULL
;
324 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
326 hr
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleCommandTarget
,
329 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
332 hr
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
333 if(SUCCEEDED(hr
) && olecmd
.cmdf
)
334 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
337 ERR("This->client == NULL, native would crash\n");
340 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
341 TRACE("cmdID = %ld returning %lx\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
348 FIXME("Set pCmdText\n");
350 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
351 hres
= OLECMDERR_E_UNKNOWNGROUP
;
357 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
358 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
360 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
363 if(nCmdID
<OLECMDID_OPEN
|| nCmdID
>OLECMDID_GETPRINTTEMPLATE
|| !exec_table
[nCmdID
].func
) {
364 WARN("Unsupported cmdID = %ld\n", nCmdID
);
365 return OLECMDERR_E_NOTSUPPORTED
;
368 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
369 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
370 FIXME("unsupported nCmdID %ld of CGID_Explorer group\n", nCmdID
);
371 TRACE("%p %p\n", pvaIn
, pvaOut
);
372 return OLECMDERR_E_NOTSUPPORTED
;
373 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
374 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID
);
375 return OLECMDERR_E_NOTSUPPORTED
;
378 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
379 return OLECMDERR_E_UNKNOWNGROUP
;
382 #undef CMDTARGET_THIS
384 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
385 OleCommandTarget_QueryInterface
,
386 OleCommandTarget_AddRef
,
387 OleCommandTarget_Release
,
388 OleCommandTarget_QueryStatus
,
389 OleCommandTarget_Exec
392 void HTMLDocument_OleCmd_Init(HTMLDocument
*This
)
394 This
->lpOleCommandTargetVtbl
= &OleCommandTargetVtbl
;