2 * Copyright 2005 Jacek Caban
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include "wine/debug.h"
34 #include "mshtml_private.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
38 /**********************************************************
39 * IOleObject implementation
42 #define OLEOBJ_THIS(iface) DEFINE_THIS(HTMLDocument, OleObject, iface)
44 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppvObject)
46 HTMLDocument *This = OLEOBJ_THIS(iface);
47 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
50 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
52 HTMLDocument *This = OLEOBJ_THIS(iface);
53 return IHTMLDocument2_AddRef(HTMLDOC(This));
56 static ULONG WINAPI OleObject_Release(IOleObject *iface)
58 HTMLDocument *This = OLEOBJ_THIS(iface);
59 return IHTMLDocument2_Release(HTMLDOC(This));
62 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
64 HTMLDocument *This = OLEOBJ_THIS(iface);
65 IDocHostUIHandler *pDocHostUIHandler = NULL;
66 IOleCommandTarget *cmdtrg = NULL;
69 TRACE("(%p)->(%p)\n", This, pClientSite);
72 IOleClientSite_Release(This->client);
75 IDocHostUIHandler_Release(This->hostui);
82 hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&pDocHostUIHandler);
84 DOCHOSTUIINFO hostinfo;
85 LPOLESTR key_path = NULL, override_key_path = NULL;
86 IDocHostUIHandler2 *pDocHostUIHandler2;
88 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
89 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
90 hres = IDocHostUIHandler_GetHostInfo(pDocHostUIHandler, &hostinfo);
92 /* FIXME: use hostinfo */
93 TRACE("hostinfo = {%lu %08lx %08lx %s %s}\n",
94 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
95 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
97 if(!This->has_key_path) {
98 hres = IDocHostUIHandler_GetOptionKeyPath(pDocHostUIHandler, &key_path, 0);
99 if(hres == S_OK && key_path) {
101 /* FIXME: use key_path */
102 TRACE("key_path = %s\n", debugstr_w(key_path));
104 CoTaskMemFree(key_path);
107 hres = IDocHostUIHandler_QueryInterface(pDocHostUIHandler, &IID_IDocHostUIHandler2,
108 (void**)&pDocHostUIHandler2);
109 if(SUCCEEDED(hres)) {
110 hres = IDocHostUIHandler2_GetOverrideKeyPath(pDocHostUIHandler2, &override_key_path, 0);
111 if(hres == S_OK && override_key_path && override_key_path[0]) {
112 if(override_key_path[0]) {
113 /*FIXME: use override_key_path */
114 TRACE("override_key_path = %s\n", debugstr_w(override_key_path));
116 CoTaskMemFree(override_key_path);
120 This->has_key_path = TRUE;
124 /* Native calls here GetWindow. What is it for?
125 * We don't have anything to do with it here (yet). */
127 IOleWindow *pOleWindow = NULL;
130 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&pOleWindow);
131 if(SUCCEEDED(hres)) {
132 IOleWindow_GetWindow(pOleWindow, &hwnd);
133 IOleWindow_Release(pOleWindow);
137 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
138 if(SUCCEEDED(hres)) {
140 OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
142 IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
146 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX, 0, &var, NULL);
147 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, 0, &var, NULL);
149 IOleCommandTarget_Release(cmdtrg);
152 IOleClientSite_AddRef(pClientSite);
153 This->client = pClientSite;
154 This->hostui = pDocHostUIHandler;
159 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
161 HTMLDocument *This = OLEOBJ_THIS(iface);
163 TRACE("(%p)->(%p)\n", This, ppClientSite);
169 IOleClientSite_AddRef(This->client);
170 *ppClientSite = This->client;
175 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
177 HTMLDocument *This = OLEOBJ_THIS(iface);
178 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
182 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
184 HTMLDocument *This = OLEOBJ_THIS(iface);
187 TRACE("(%p)->(%08lx)\n", This, dwSaveOption);
189 if(dwSaveOption == OLECLOSE_PROMPTSAVE)
190 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
192 if(This->in_place_active)
193 IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
196 IOleContainer *container;
197 hres = IOleClientSite_GetContainer(This->client, &container);
198 if(SUCCEEDED(hres)) {
199 IOleContainer_LockContainer(container, FALSE);
200 IOleContainer_Release(container);
207 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
209 HTMLDocument *This = OLEOBJ_THIS(iface);
210 FIXME("(%p %ld %p)->()\n", This, dwWhichMoniker, pmk);
214 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
216 HTMLDocument *This = OLEOBJ_THIS(iface);
217 FIXME("(%p)->(%ld %ld %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
221 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
224 HTMLDocument *This = OLEOBJ_THIS(iface);
225 FIXME("(%p)->(%p %x %ld)\n", This, pDataObject, fCreation, dwReserved);
229 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
231 HTMLDocument *This = OLEOBJ_THIS(iface);
232 FIXME("(%p)->(%ld %p)\n", This, dwReserved, ppDataObject);
236 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
237 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
239 HTMLDocument *This = OLEOBJ_THIS(iface);
240 IOleDocumentSite *pDocSite;
243 TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
245 if(iVerb != OLEIVERB_SHOW && iVerb != OLEIVERB_UIACTIVATE && iVerb != OLEIVERB_INPLACEACTIVATE) {
246 FIXME("iVerb = %ld not supported\n", iVerb);
251 pActiveSite = This->client;
253 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleDocumentSite, (void**)&pDocSite);
254 if(SUCCEEDED(hres)) {
255 IOleContainer *pContainer;
256 hres = IOleClientSite_GetContainer(pActiveSite, &pContainer);
257 if(SUCCEEDED(hres)) {
258 IOleContainer_LockContainer(pContainer, TRUE);
259 IOleContainer_Release(pContainer);
261 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
262 hres = IOleDocumentSite_ActivateMe(pDocSite, DOCVIEW(This));
263 IOleDocumentSite_Release(pDocSite);
265 hres = IOleDocumentView_UIActivate(DOCVIEW(This), TRUE);
266 if(SUCCEEDED(hres)) {
268 RECT rect; /* We need to pass rect as not const pointer */
269 memcpy(&rect, lprcPosRect, sizeof(RECT));
270 IOleDocumentView_SetRect(DOCVIEW(This), &rect);
272 IOleDocumentView_Show(DOCVIEW(This), TRUE);
279 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
281 HTMLDocument *This = OLEOBJ_THIS(iface);
282 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
286 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
288 HTMLDocument *This = OLEOBJ_THIS(iface);
289 FIXME("(%p)\n", This);
293 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
295 HTMLDocument *This = OLEOBJ_THIS(iface);
296 FIXME("(%p)\n", This);
300 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
302 HTMLDocument *This = OLEOBJ_THIS(iface);
304 TRACE("(%p)->(%p)\n", This, pClsid);
309 memcpy(pClsid, &CLSID_HTMLDocument, sizeof(GUID));
313 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
315 HTMLDocument *This = OLEOBJ_THIS(iface);
316 FIXME("(%p)->(%ld %p)\n", This, dwFormOfType, pszUserType);
320 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
322 HTMLDocument *This = OLEOBJ_THIS(iface);
323 FIXME("(%p)->(%ld %p)\n", This, dwDrawAspect, psizel);
327 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
329 HTMLDocument *This = OLEOBJ_THIS(iface);
330 FIXME("(%p)->(%ld %p)\n", This, dwDrawAspect, psizel);
334 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
336 HTMLDocument *This = OLEOBJ_THIS(iface);
337 FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
341 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
343 HTMLDocument *This = OLEOBJ_THIS(iface);
344 FIXME("(%p)->(%ld)\n", This, dwConnection);
348 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
350 HTMLDocument *This = OLEOBJ_THIS(iface);
351 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
355 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
357 HTMLDocument *This = OLEOBJ_THIS(iface);
358 FIXME("(%p)->(%ld %p)\n", This, dwAspect, pdwStatus);
362 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
364 HTMLDocument *This = OLEOBJ_THIS(iface);
365 FIXME("(%p)->(%p)\n", This, pLogpal);
371 static const IOleObjectVtbl OleObjectVtbl = {
372 OleObject_QueryInterface,
375 OleObject_SetClientSite,
376 OleObject_GetClientSite,
377 OleObject_SetHostNames,
379 OleObject_SetMoniker,
380 OleObject_GetMoniker,
381 OleObject_InitFromData,
382 OleObject_GetClipboardData,
386 OleObject_IsUpToDate,
387 OleObject_GetUserClassID,
388 OleObject_GetUserType,
393 OleObject_EnumAdvise,
394 OleObject_GetMiscStatus,
395 OleObject_SetColorScheme
398 /**********************************************************
399 * IOleDocument implementation
402 #define OLEDOC_THIS(iface) DEFINE_THIS(HTMLDocument, OleDocument, iface)
404 static HRESULT WINAPI OleDocument_QueryInterface(IOleDocument *iface, REFIID riid, void **ppvObject)
406 HTMLDocument *This = OLEDOC_THIS(iface);
407 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
410 static ULONG WINAPI OleDocument_AddRef(IOleDocument *iface)
412 HTMLDocument *This = OLEDOC_THIS(iface);
413 return IHTMLDocument2_AddRef(HTMLDOC(This));
416 static ULONG WINAPI OleDocument_Release(IOleDocument *iface)
418 HTMLDocument *This = OLEDOC_THIS(iface);
419 return IHTMLDocument2_Release(HTMLDOC(This));
422 static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm,
423 DWORD dwReserved, IOleDocumentView **ppView)
425 HTMLDocument *This = OLEDOC_THIS(iface);
428 TRACE("(%p)->(%p %p %ld %p)\n", This, pIPSite, pstm, dwReserved, ppView);
434 * Windows implementation creates new IOleDocumentView when function is called for the
435 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
436 * if the application uses returned interfaces, passed to ActivateMe or returned by
437 * QueryInterface, so there is no reason to create new interface. This needs more testing.
441 hres = IOleDocumentView_SetInPlaceSite(DOCVIEW(This), pIPSite);
447 FIXME("pstm is not supported\n");
449 IOleDocumentView_AddRef(DOCVIEW(This));
450 *ppView = DOCVIEW(This);
454 static HRESULT WINAPI OleDocument_GetDocMiscStatus(IOleDocument *iface, DWORD *pdwStatus)
456 HTMLDocument *This = OLEDOC_THIS(iface);
457 FIXME("(%p)->(%p)\n", This, pdwStatus);
461 static HRESULT WINAPI OleDocument_EnumViews(IOleDocument *iface, IEnumOleDocumentViews **ppEnum,
462 IOleDocumentView **ppView)
464 HTMLDocument *This = OLEDOC_THIS(iface);
465 FIXME("(%p)->(%p %p)\n", This, ppEnum, ppView);
471 static const IOleDocumentVtbl OleDocumentVtbl = {
472 OleDocument_QueryInterface,
475 OleDocument_CreateView,
476 OleDocument_GetDocMiscStatus,
477 OleDocument_EnumViews
480 /**********************************************************
481 * IOleCommandTarget implementation
484 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
486 static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
488 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
492 static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
494 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
498 static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
500 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
504 static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
506 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
510 static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
512 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
516 static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
518 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
522 static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
524 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
528 static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
530 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
534 static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
536 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
540 static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
542 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
546 static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
548 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
552 static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
554 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
558 static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
560 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
564 static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
566 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
570 static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
572 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
576 static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
578 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
582 static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
584 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
588 static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
590 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
594 static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
596 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
600 static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
602 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
606 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
608 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
612 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
614 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
618 static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
620 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
624 static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
626 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
630 static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
632 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
636 static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
638 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
642 static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
644 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
648 static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
650 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
654 static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
656 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
660 static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
662 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
666 static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
668 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
672 static const struct {
674 HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
675 } exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
677 { OLECMDF_SUPPORTED, exec_open }, /* OLECMDID_OPEN */
678 { OLECMDF_SUPPORTED, exec_new }, /* OLECMDID_NEW */
679 { OLECMDF_SUPPORTED, exec_save }, /* OLECMDID_SAVE */
680 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_save_as }, /* OLECMDID_SAVEAS */
681 { OLECMDF_SUPPORTED, exec_save_copy_as }, /* OLECMDID_SAVECOPYAS */
682 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print }, /* OLECMDID_PRINT */
683 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print_preview }, /* OLECMDID_PRINTPREVIEW */
684 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_page_setup }, /* OLECMDID_PAGESETUP */
685 { OLECMDF_SUPPORTED, exec_spell }, /* OLECMDID_SPELL */
686 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_properties }, /* OLECMDID_PROPERTIES */
687 { OLECMDF_SUPPORTED, exec_cut }, /* OLECMDID_CUT */
688 { OLECMDF_SUPPORTED, exec_copy }, /* OLECMDID_COPY */
689 { OLECMDF_SUPPORTED, exec_paste }, /* OLECMDID_PASTE */
690 { OLECMDF_SUPPORTED, exec_paste_special }, /* OLECMDID_PASTESPECIAL */
691 { OLECMDF_SUPPORTED, exec_undo }, /* OLECMDID_UNDO */
692 { OLECMDF_SUPPORTED, exec_rendo }, /* OLECMDID_REDO */
693 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_select_all }, /* OLECMDID_SELECTALL */
694 { OLECMDF_SUPPORTED, exec_clear_selection }, /* OLECMDID_CLEARSELECTION */
695 { OLECMDF_SUPPORTED, exec_zoom }, /* OLECMDID_ZOOM */
696 { OLECMDF_SUPPORTED, exec_get_zoom_range }, /* OLECMDID_GETZOOMRANGE */
698 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_refresh }, /* OLECMDID_REFRESH */
699 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_stop }, /* OLECMDID_STOP */
700 {0},{0},{0},{0},{0},{0},
701 { OLECMDF_SUPPORTED, exec_stop_download }, /* OLECMDID_STOPDOWNLOAD */
703 { OLECMDF_SUPPORTED, exec_delete }, /* OLECMDID_DELETE */
705 { OLECMDF_SUPPORTED, exec_enable_interaction }, /* OLECMDID_ENABLE_INTERACTION */
706 { OLECMDF_SUPPORTED, exec_on_unload }, /* OLECMDID_ONUNLOAD */
708 { OLECMDF_SUPPORTED, exec_show_page_setup }, /* OLECMDID_SHOWPAGESETUP */
709 { OLECMDF_SUPPORTED, exec_show_print }, /* OLECMDID_SHOWPRINT */
711 { OLECMDF_SUPPORTED, exec_close }, /* OLECMDID_CLOSE */
713 { OLECMDF_SUPPORTED, exec_set_print_template }, /* OLECMDID_SETPRINTTEMPLATE */
714 { OLECMDF_SUPPORTED, exec_get_print_template } /* OLECMDID_GETPRINTTEMPLATE */
717 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
719 HTMLDocument *This = CMDTARGET_THIS(iface);
720 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
723 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
725 HTMLDocument *This = CMDTARGET_THIS(iface);
726 return IHTMLDocument2_AddRef(HTMLDOC(This));
729 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
731 HTMLDocument *This = CMDTARGET_THIS(iface);
732 return IHTMLDocument_Release(HTMLDOC(This));
735 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
736 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
738 HTMLDocument *This = CMDTARGET_THIS(iface);
739 HRESULT hres = S_OK, hr;
741 TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
746 for(i=0; i<cCmds; i++) {
747 if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
748 WARN("Unsupported cmdID = %ld\n", prgCmds[i].cmdID);
750 hres = OLECMDERR_E_NOTSUPPORTED;
752 if(prgCmds[i].cmdID == OLECMDID_OPEN || prgCmds[i].cmdID == OLECMDID_NEW) {
753 IOleCommandTarget *cmdtrg = NULL;
756 prgCmds[i].cmdf = OLECMDF_SUPPORTED;
758 hr = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
761 olecmd.cmdID = prgCmds[i].cmdID;
764 hr = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &olecmd, NULL);
765 if(SUCCEEDED(hr) && olecmd.cmdf)
766 prgCmds[i].cmdf = olecmd.cmdf;
769 ERR("This->client == NULL, native would crash\n");
772 prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
773 TRACE("cmdID = %ld returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdf);
780 FIXME("Set pCmdText\n");
782 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
783 hres = OLECMDERR_E_UNKNOWNGROUP;
789 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
790 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
792 HTMLDocument *This = CMDTARGET_THIS(iface);
795 if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
796 WARN("Unsupported cmdID = %ld\n", nCmdID);
797 return OLECMDERR_E_NOTSUPPORTED;
800 return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
801 }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
802 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID);
803 return OLECMDERR_E_UNKNOWNGROUP;
806 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
807 return OLECMDERR_E_UNKNOWNGROUP;
810 #undef CMDTARGET_THIS
812 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
813 OleCommandTarget_QueryInterface,
814 OleCommandTarget_AddRef,
815 OleCommandTarget_Release,
816 OleCommandTarget_QueryStatus,
817 OleCommandTarget_Exec
820 /**********************************************************
821 * IOleControl implementation
824 #define CONTROL_THIS(iface) DEFINE_THIS(HTMLDocument, OleControl, iface)
826 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
828 HTMLDocument *This = CONTROL_THIS(iface);
829 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
832 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
834 HTMLDocument *This = CONTROL_THIS(iface);
835 return IHTMLDocument2_AddRef(HTMLDOC(This));
838 static ULONG WINAPI OleControl_Release(IOleControl *iface)
840 HTMLDocument *This = CONTROL_THIS(iface);
841 return IHTMLDocument_Release(HTMLDOC(This));
844 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
846 HTMLDocument *This = CONTROL_THIS(iface);
847 FIXME("(%p)->(%p)\n", This, pCI);
851 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *pMsg)
853 HTMLDocument *This = CONTROL_THIS(iface);
854 FIXME("(%p)->(%p)\n", This, pMsg);
858 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
860 HTMLDocument *This = CONTROL_THIS(iface);
861 FIXME("(%p)->(%ld)\n", This, dispID);
865 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
867 HTMLDocument *This = CONTROL_THIS(iface);
868 FIXME("(%p)->(%x)\n", This, bFreeze);
874 static const IOleControlVtbl OleControlVtbl = {
875 OleControl_QueryInterface,
878 OleControl_GetControlInfo,
879 OleControl_OnMnemonic,
880 OleControl_OnAmbientPropertyChange,
881 OleControl_FreezeEvents
884 void HTMLDocument_OleObj_Init(HTMLDocument *This)
886 This->lpOleObjectVtbl = &OleObjectVtbl;
887 This->lpOleDocumentVtbl = &OleDocumentVtbl;
888 This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
889 This->lpOleControlVtbl = &OleControlVtbl;
894 This->has_key_path = FALSE;