2 * Implementation of IOleObject interfaces for WebBrowser control
8 * Copyright 2001 John R. Sheets (for CodeWeavers)
9 * Copyright 2005 Jacek Caban
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(ieframe
);
39 HWND WINAPI
SHSetParentHwnd(HWND hWnd
, HWND hWndParent
);
41 static ATOM shell_embedding_atom
= 0;
43 static LRESULT
resize_window(WebBrowser
*This
, LONG width
, LONG height
)
45 if(This
->doc_host
.hwnd
)
46 SetWindowPos(This
->doc_host
.hwnd
, NULL
, 0, 0, width
, height
,
47 SWP_NOZORDER
| SWP_NOACTIVATE
);
52 static LRESULT WINAPI
shell_embedding_proc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
56 static const WCHAR wszTHIS
[] = {'T','H','I','S',0};
58 if(msg
== WM_CREATE
) {
59 This
= *(WebBrowser
**)lParam
;
60 SetPropW(hwnd
, wszTHIS
, This
);
62 This
= GetPropW(hwnd
, wszTHIS
);
67 return resize_window(This
, LOWORD(lParam
), HIWORD(lParam
));
69 return process_dochost_tasks(&This
->doc_host
);
72 return DefWindowProcW(hwnd
, msg
, wParam
, lParam
);
75 static void create_shell_embedding_hwnd(WebBrowser
*This
)
77 IOleInPlaceSite
*inplace
;
81 static const WCHAR wszShellEmbedding
[] =
82 {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0};
84 if(!shell_embedding_atom
) {
85 static WNDCLASSEXW wndclass
= {
89 0, 0 /* native uses 8 */, NULL
, NULL
, NULL
,
90 (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
,
94 wndclass
.hInstance
= ieframe_instance
;
96 RegisterClassExW(&wndclass
);
99 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleInPlaceSite
, (void**)&inplace
);
100 if(SUCCEEDED(hres
)) {
101 IOleInPlaceSite_GetWindow(inplace
, &parent
);
102 IOleInPlaceSite_Release(inplace
);
105 This
->doc_host
.frame_hwnd
= This
->shell_embedding_hwnd
= CreateWindowExW(
107 wszShellEmbedding
, wszShellEmbedding
,
108 WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
109 | (parent
? WS_CHILD
| WS_TABSTOP
: WS_POPUP
| WS_MAXIMIZEBOX
),
111 NULL
, ieframe_instance
, This
);
113 TRACE("parent=%p hwnd=%p\n", parent
, This
->shell_embedding_hwnd
);
116 static HRESULT
activate_inplace(WebBrowser
*This
, IOleClientSite
*active_site
)
127 hres
= IOleClientSite_QueryInterface(active_site
, &IID_IOleInPlaceSite
,
128 (void**)&This
->inplace
);
130 WARN("Could not get IOleInPlaceSite\n");
134 hres
= IOleInPlaceSite_CanInPlaceActivate(This
->inplace
);
136 WARN("CanInPlaceActivate returned: %08x\n", hres
);
137 IOleInPlaceSite_Release(This
->inplace
);
138 This
->inplace
= NULL
;
142 hres
= IOleInPlaceSite_GetWindow(This
->inplace
, &parent_hwnd
);
144 SHSetParentHwnd(This
->shell_embedding_hwnd
, parent_hwnd
);
146 IOleInPlaceSite_OnInPlaceActivate(This
->inplace
);
148 This
->frameinfo
.cb
= sizeof(OLEINPLACEFRAMEINFO
);
149 IOleInPlaceSite_GetWindowContext(This
->inplace
, &This
->doc_host
.frame
, &This
->uiwindow
,
150 &This
->pos_rect
, &This
->clip_rect
,
153 SetWindowPos(This
->shell_embedding_hwnd
, NULL
,
154 This
->pos_rect
.left
, This
->pos_rect
.top
,
155 This
->pos_rect
.right
-This
->pos_rect
.left
,
156 This
->pos_rect
.bottom
-This
->pos_rect
.top
,
157 SWP_NOZORDER
| SWP_SHOWWINDOW
);
160 IOleContainer
*container
;
162 IOleClientSite_ShowObject(This
->client
);
164 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
165 if(SUCCEEDED(hres
)) {
167 IOleContainer_Release(This
->container
);
168 This
->container
= container
;
172 if(This
->doc_host
.frame
)
173 IOleInPlaceFrame_GetWindow(This
->doc_host
.frame
, &This
->frame_hwnd
);
178 static HRESULT
activate_ui(WebBrowser
*This
, IOleClientSite
*active_site
)
182 static const WCHAR wszitem
[] = {'i','t','e','m',0};
186 if(This
->shell_embedding_hwnd
)
187 ShowWindow(This
->shell_embedding_hwnd
, SW_SHOW
);
191 hres
= activate_inplace(This
, active_site
);
195 IOleInPlaceSite_OnUIActivate(This
->inplace
);
197 if(This
->doc_host
.frame
)
198 IOleInPlaceFrame_SetActiveObject(This
->doc_host
.frame
, &This
->IOleInPlaceActiveObject_iface
, wszitem
);
200 IOleInPlaceUIWindow_SetActiveObject(This
->uiwindow
, &This
->IOleInPlaceActiveObject_iface
, wszitem
);
202 if(This
->doc_host
.frame
)
203 IOleInPlaceFrame_SetMenu(This
->doc_host
.frame
, NULL
, NULL
, This
->shell_embedding_hwnd
);
205 SetFocus(This
->shell_embedding_hwnd
);
210 static HRESULT
get_client_disp_property(IOleClientSite
*client
, DISPID dispid
, VARIANT
*res
)
212 IDispatch
*disp
= NULL
;
213 DISPPARAMS dispparams
= {NULL
, 0};
221 hres
= IOleClientSite_QueryInterface(client
, &IID_IDispatch
, (void**)&disp
);
223 TRACE("Could not get IDispatch\n");
227 hres
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_SYSTEM_DEFAULT
,
228 DISPATCH_PROPERTYGET
, &dispparams
, res
, NULL
, NULL
);
230 IDispatch_Release(disp
);
235 static HRESULT
on_offlineconnected_change(WebBrowser
*This
)
239 get_client_disp_property(This
->client
, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
, &offline
);
241 if(V_VT(&offline
) == VT_BOOL
)
242 IWebBrowser2_put_Offline(&This
->IWebBrowser2_iface
, V_BOOL(&offline
));
243 else if(V_VT(&offline
) != VT_EMPTY
)
244 WARN("wrong V_VT(silent) %d\n", V_VT(&offline
));
249 static HRESULT
on_silent_change(WebBrowser
*This
)
253 get_client_disp_property(This
->client
, DISPID_AMBIENT_SILENT
, &silent
);
255 if(V_VT(&silent
) == VT_BOOL
)
256 IWebBrowser2_put_Silent(&This
->IWebBrowser2_iface
, V_BOOL(&silent
));
257 else if(V_VT(&silent
) != VT_EMPTY
)
258 WARN("wrong V_VT(silent) %d\n", V_VT(&silent
));
263 static void release_client_site(WebBrowser
*This
)
265 release_dochost_client(&This
->doc_host
);
267 if(This
->shell_embedding_hwnd
) {
268 DestroyWindow(This
->shell_embedding_hwnd
);
269 This
->shell_embedding_hwnd
= NULL
;
273 IOleInPlaceSite_Release(This
->inplace
);
274 This
->inplace
= NULL
;
277 if(This
->container
) {
278 IOleContainer_Release(This
->container
);
279 This
->container
= NULL
;
283 IOleInPlaceUIWindow_Release(This
->uiwindow
);
284 This
->uiwindow
= NULL
;
288 IOleClientSite_Release(This
->client
);
293 /**********************************************************************
294 * Implement the IOleObject interface for the WebBrowser control
297 static inline WebBrowser
*impl_from_IOleObject(IOleObject
*iface
)
299 return CONTAINING_RECORD(iface
, WebBrowser
, IOleObject_iface
);
302 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppv
)
304 WebBrowser
*This
= impl_from_IOleObject(iface
);
305 return IWebBrowser_QueryInterface(&This
->IWebBrowser2_iface
, riid
, ppv
);
308 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
310 WebBrowser
*This
= impl_from_IOleObject(iface
);
311 return IWebBrowser_AddRef(&This
->IWebBrowser2_iface
);
314 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
316 WebBrowser
*This
= impl_from_IOleObject(iface
);
317 return IWebBrowser_Release(&This
->IWebBrowser2_iface
);
320 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, LPOLECLIENTSITE pClientSite
)
322 WebBrowser
*This
= impl_from_IOleObject(iface
);
323 IDocHostUIHandler
*hostui
;
324 IOleContainer
*container
;
328 TRACE("(%p)->(%p)\n", This
, pClientSite
);
330 if(This
->client
== pClientSite
)
333 release_client_site(This
);
336 if(This
->doc_host
.document
)
337 deactivate_document(&This
->doc_host
);
341 IOleClientSite_AddRef(pClientSite
);
342 This
->client
= pClientSite
;
344 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IDispatch
,
347 This
->doc_host
.client_disp
= disp
;
349 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IDocHostUIHandler
,
352 This
->doc_host
.hostui
= hostui
;
354 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
355 if(SUCCEEDED(hres
)) {
356 ITargetContainer
*target_container
;
358 hres
= IOleContainer_QueryInterface(container
, &IID_ITargetContainer
,
359 (void**)&target_container
);
360 if(SUCCEEDED(hres
)) {
361 FIXME("Unsupported ITargetContainer\n");
362 ITargetContainer_Release(target_container
);
365 IOleContainer_Release(container
);
368 create_shell_embedding_hwnd(This
);
370 on_offlineconnected_change(This
);
371 on_silent_change(This
);
376 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, LPOLECLIENTSITE
*ppClientSite
)
378 WebBrowser
*This
= impl_from_IOleObject(iface
);
380 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
386 IOleClientSite_AddRef(This
->client
);
387 *ppClientSite
= This
->client
;
392 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
,
393 LPCOLESTR szContainerObj
)
395 WebBrowser
*This
= impl_from_IOleObject(iface
);
397 TRACE("(%p)->(%s, %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
399 /* We have nothing to do here. */
403 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
405 WebBrowser
*This
= impl_from_IOleObject(iface
);
407 TRACE("(%p)->(%d)\n", This
, dwSaveOption
);
409 if(dwSaveOption
!= OLECLOSE_NOSAVE
) {
410 FIXME("unimplemnted flag: %x\n", dwSaveOption
);
414 if(This
->doc_host
.frame
)
415 IOleInPlaceFrame_SetActiveObject(This
->doc_host
.frame
, NULL
, NULL
);
418 IOleInPlaceUIWindow_SetActiveObject(This
->uiwindow
, NULL
, NULL
);
421 IOleInPlaceSite_OnUIDeactivate(This
->inplace
, FALSE
);
422 IOleInPlaceSite_OnInPlaceDeactivate(This
->inplace
);
425 return IOleObject_SetClientSite(iface
, NULL
);
428 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
* pmk
)
430 WebBrowser
*This
= impl_from_IOleObject(iface
);
431 FIXME("(%p)->(%d, %p)\n", This
, dwWhichMoniker
, pmk
);
435 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
,
436 DWORD dwWhichMoniker
, LPMONIKER
*ppmk
)
438 WebBrowser
*This
= impl_from_IOleObject(iface
);
439 FIXME("(%p)->(%d, %d, %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
443 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, LPDATAOBJECT pDataObject
,
444 BOOL fCreation
, DWORD dwReserved
)
446 WebBrowser
*This
= impl_from_IOleObject(iface
);
447 FIXME("(%p)->(%p, %d, %d)\n", This
, pDataObject
, fCreation
, dwReserved
);
451 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
,
452 LPDATAOBJECT
*ppDataObject
)
454 WebBrowser
*This
= impl_from_IOleObject(iface
);
455 FIXME("(%p)->(%d, %p)\n", This
, dwReserved
, ppDataObject
);
459 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, struct tagMSG
* lpmsg
,
460 LPOLECLIENTSITE pActiveSite
, LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
462 WebBrowser
*This
= impl_from_IOleObject(iface
);
464 TRACE("(%p)->(%d %p %p %d %p %p)\n", This
, iVerb
, lpmsg
, pActiveSite
, lindex
, hwndParent
,
470 TRACE("OLEIVERB_SHOW\n");
471 return activate_ui(This
, pActiveSite
);
472 case OLEIVERB_UIACTIVATE
:
473 TRACE("OLEIVERB_UIACTIVATE\n");
474 return activate_ui(This
, pActiveSite
);
475 case OLEIVERB_INPLACEACTIVATE
:
476 TRACE("OLEIVERB_INPLACEACTIVATE\n");
477 return activate_inplace(This
, pActiveSite
);
479 TRACE("OLEIVERB_HIDE\n");
480 if(This
->shell_embedding_hwnd
)
481 ShowWindow(This
->shell_embedding_hwnd
, SW_HIDE
);
484 FIXME("stub for %d\n", iVerb
);
491 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
493 WebBrowser
*This
= impl_from_IOleObject(iface
);
494 TRACE("(%p)->(%p)\n", This
, ppEnumOleVerb
);
495 return OleRegEnumVerbs(&CLSID_WebBrowser
, ppEnumOleVerb
);
498 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
500 WebBrowser
*This
= impl_from_IOleObject(iface
);
501 FIXME("(%p)\n", This
);
505 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
507 WebBrowser
*This
= impl_from_IOleObject(iface
);
508 FIXME("(%p)\n", This
);
512 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
* pClsid
)
514 WebBrowser
*This
= impl_from_IOleObject(iface
);
515 FIXME("(%p)->(%p)\n", This
, pClsid
);
519 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
,
520 LPOLESTR
* pszUserType
)
522 WebBrowser
*This
= impl_from_IOleObject(iface
);
523 TRACE("(%p, %d, %p)\n", This
, dwFormOfType
, pszUserType
);
524 return OleRegGetUserType(&CLSID_WebBrowser
, dwFormOfType
, pszUserType
);
527 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
529 WebBrowser
*This
= impl_from_IOleObject(iface
);
531 TRACE("(%p)->(%x %p)\n", This
, dwDrawAspect
, psizel
);
533 /* Tests show that dwDrawAspect is ignored */
534 This
->extent
= *psizel
;
538 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
540 WebBrowser
*This
= impl_from_IOleObject(iface
);
542 TRACE("(%p)->(%x, %p)\n", This
, dwDrawAspect
, psizel
);
544 /* Tests show that dwDrawAspect is ignored */
545 *psizel
= This
->extent
;
549 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
,
550 DWORD
* pdwConnection
)
552 WebBrowser
*This
= impl_from_IOleObject(iface
);
553 FIXME("(%p)->(%p, %p)\n", This
, pAdvSink
, pdwConnection
);
557 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
559 WebBrowser
*This
= impl_from_IOleObject(iface
);
560 FIXME("(%p)->(%d)\n", This
, dwConnection
);
564 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
566 WebBrowser
*This
= impl_from_IOleObject(iface
);
567 FIXME("(%p)->(%p)\n", This
, ppenumAdvise
);
571 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
573 WebBrowser
*This
= impl_from_IOleObject(iface
);
575 TRACE("(%p)->(%x, %p)\n", This
, dwAspect
, pdwStatus
);
577 *pdwStatus
= OLEMISC_SETCLIENTSITEFIRST
|OLEMISC_ACTIVATEWHENVISIBLE
|OLEMISC_INSIDEOUT
578 |OLEMISC_CANTLINKINSIDE
|OLEMISC_RECOMPOSEONRESIZE
;
583 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
* pLogpal
)
585 WebBrowser
*This
= impl_from_IOleObject(iface
);
586 FIXME("(%p)->(%p)\n", This
, pLogpal
);
590 static const IOleObjectVtbl OleObjectVtbl
=
592 OleObject_QueryInterface
,
595 OleObject_SetClientSite
,
596 OleObject_GetClientSite
,
597 OleObject_SetHostNames
,
599 OleObject_SetMoniker
,
600 OleObject_GetMoniker
,
601 OleObject_InitFromData
,
602 OleObject_GetClipboardData
,
606 OleObject_IsUpToDate
,
607 OleObject_GetUserClassID
,
608 OleObject_GetUserType
,
613 OleObject_EnumAdvise
,
614 OleObject_GetMiscStatus
,
615 OleObject_SetColorScheme
618 /**********************************************************************
619 * Implement the IOleInPlaceObject interface
622 static inline WebBrowser
*impl_from_IOleInPlaceObject(IOleInPlaceObject
*iface
)
624 return CONTAINING_RECORD(iface
, WebBrowser
, IOleInPlaceObject_iface
);
627 static HRESULT WINAPI
OleInPlaceObject_QueryInterface(IOleInPlaceObject
*iface
,
628 REFIID riid
, LPVOID
*ppobj
)
630 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
631 return IWebBrowser_QueryInterface(&This
->IWebBrowser2_iface
, riid
, ppobj
);
634 static ULONG WINAPI
OleInPlaceObject_AddRef(IOleInPlaceObject
*iface
)
636 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
637 return IWebBrowser_AddRef(&This
->IWebBrowser2_iface
);
640 static ULONG WINAPI
OleInPlaceObject_Release(IOleInPlaceObject
*iface
)
642 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
643 return IWebBrowser_Release(&This
->IWebBrowser2_iface
);
646 static HRESULT WINAPI
OleInPlaceObject_GetWindow(IOleInPlaceObject
*iface
, HWND
* phwnd
)
648 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
650 TRACE("(%p)->(%p)\n", This
, phwnd
);
652 *phwnd
= This
->shell_embedding_hwnd
;
656 static HRESULT WINAPI
OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject
*iface
,
659 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
660 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
664 static HRESULT WINAPI
OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject
*iface
)
666 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
667 FIXME("(%p)\n", This
);
670 IOleInPlaceSite_Release(This
->inplace
);
671 This
->inplace
= NULL
;
677 static HRESULT WINAPI
OleInPlaceObject_UIDeactivate(IOleInPlaceObject
*iface
)
679 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
680 FIXME("(%p)\n", This
);
684 static HRESULT WINAPI
OleInPlaceObject_SetObjectRects(IOleInPlaceObject
*iface
,
685 LPCRECT lprcPosRect
, LPCRECT lprcClipRect
)
687 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
689 TRACE("(%p)->(%p %p)\n", This
, lprcPosRect
, lprcClipRect
);
691 This
->pos_rect
= *lprcPosRect
;
694 This
->clip_rect
= *lprcClipRect
;
696 if(This
->shell_embedding_hwnd
) {
697 SetWindowPos(This
->shell_embedding_hwnd
, NULL
,
698 lprcPosRect
->left
, lprcPosRect
->top
,
699 lprcPosRect
->right
-lprcPosRect
->left
,
700 lprcPosRect
->bottom
-lprcPosRect
->top
,
701 SWP_NOZORDER
| SWP_NOACTIVATE
);
707 static HRESULT WINAPI
OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject
*iface
)
709 WebBrowser
*This
= impl_from_IOleInPlaceObject(iface
);
710 FIXME("(%p)\n", This
);
714 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl
=
716 OleInPlaceObject_QueryInterface
,
717 OleInPlaceObject_AddRef
,
718 OleInPlaceObject_Release
,
719 OleInPlaceObject_GetWindow
,
720 OleInPlaceObject_ContextSensitiveHelp
,
721 OleInPlaceObject_InPlaceDeactivate
,
722 OleInPlaceObject_UIDeactivate
,
723 OleInPlaceObject_SetObjectRects
,
724 OleInPlaceObject_ReactivateAndUndo
727 /**********************************************************************
728 * Implement the IOleControl interface
731 static inline WebBrowser
*impl_from_IOleControl(IOleControl
*iface
)
733 return CONTAINING_RECORD(iface
, WebBrowser
, IOleControl_iface
);
736 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
,
737 REFIID riid
, LPVOID
*ppobj
)
739 WebBrowser
*This
= impl_from_IOleControl(iface
);
740 return IWebBrowser_QueryInterface(&This
->IWebBrowser2_iface
, riid
, ppobj
);
743 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
745 WebBrowser
*This
= impl_from_IOleControl(iface
);
746 return IWebBrowser_AddRef(&This
->IWebBrowser2_iface
);
749 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
751 WebBrowser
*This
= impl_from_IOleControl(iface
);
752 return IWebBrowser_Release(&This
->IWebBrowser2_iface
);
755 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, LPCONTROLINFO pCI
)
757 WebBrowser
*This
= impl_from_IOleControl(iface
);
759 TRACE("(%p)->(%p)\n", This
, pCI
);
761 /* Tests show that this function should be not implemented */
765 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, struct tagMSG
*pMsg
)
767 WebBrowser
*This
= impl_from_IOleControl(iface
);
768 FIXME("(%p)->(%p)\n", This
, pMsg
);
772 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
774 WebBrowser
*This
= impl_from_IOleControl(iface
);
776 TRACE("(%p)->(%d)\n", This
, dispID
);
780 /* Unknown means multiple properties changed, so check them all.
781 * BUT the Webbrowser OleControl object doesn't appear to do this.
784 case DISPID_AMBIENT_DLCONTROL
:
786 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
787 return on_offlineconnected_change(This
);
788 case DISPID_AMBIENT_SILENT
:
789 return on_silent_change(This
);
792 FIXME("Unknown dispID %d\n", dispID
);
796 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL bFreeze
)
798 WebBrowser
*This
= impl_from_IOleControl(iface
);
799 FIXME("(%p)->(%x)\n", This
, bFreeze
);
803 static const IOleControlVtbl OleControlVtbl
=
805 OleControl_QueryInterface
,
808 OleControl_GetControlInfo
,
809 OleControl_OnMnemonic
,
810 OleControl_OnAmbientPropertyChange
,
811 OleControl_FreezeEvents
814 static inline WebBrowser
*impl_from_IOleInPlaceActiveObject(IOleInPlaceActiveObject
*iface
)
816 return CONTAINING_RECORD(iface
, WebBrowser
, IOleInPlaceActiveObject_iface
);
819 static HRESULT WINAPI
InPlaceActiveObject_QueryInterface(IOleInPlaceActiveObject
*iface
,
820 REFIID riid
, void **ppv
)
822 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
823 return IWebBrowser2_QueryInterface(&This
->IWebBrowser2_iface
, riid
, ppv
);
826 static ULONG WINAPI
InPlaceActiveObject_AddRef(IOleInPlaceActiveObject
*iface
)
828 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
829 return IWebBrowser2_AddRef(&This
->IWebBrowser2_iface
);
832 static ULONG WINAPI
InPlaceActiveObject_Release(IOleInPlaceActiveObject
*iface
)
834 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
835 return IWebBrowser2_Release(&This
->IWebBrowser2_iface
);
838 static HRESULT WINAPI
InPlaceActiveObject_GetWindow(IOleInPlaceActiveObject
*iface
,
841 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
842 return IOleInPlaceObject_GetWindow(&This
->IOleInPlaceObject_iface
, phwnd
);
845 static HRESULT WINAPI
InPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceActiveObject
*iface
,
848 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
849 return IOleInPlaceObject_ContextSensitiveHelp(&This
->IOleInPlaceObject_iface
, fEnterMode
);
852 static HRESULT WINAPI
InPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject
*iface
,
855 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
856 IOleInPlaceActiveObject
*activeobj
;
857 HRESULT hr
= S_FALSE
;
859 TRACE("(%p)->(%p)\n", This
, lpmsg
);
861 if(This
->doc_host
.document
) {
862 if(SUCCEEDED(IUnknown_QueryInterface(This
->doc_host
.document
,
863 &IID_IOleInPlaceActiveObject
,
864 (void**)&activeobj
))) {
865 hr
= IOleInPlaceActiveObject_TranslateAccelerator(activeobj
, lpmsg
);
866 IOleInPlaceActiveObject_Release(activeobj
);
876 static HRESULT WINAPI
InPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject
*iface
,
879 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
880 FIXME("(%p)->(%x)\n", This
, fActivate
);
884 static HRESULT WINAPI
InPlaceActiveObject_OnDocWindowActivate(IOleInPlaceActiveObject
*iface
,
887 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
888 FIXME("(%p)->(%x)\n", This
, fActivate
);
892 static HRESULT WINAPI
InPlaceActiveObject_ResizeBorder(IOleInPlaceActiveObject
*iface
,
893 LPCRECT lprcBorder
, IOleInPlaceUIWindow
*pUIWindow
, BOOL fFrameWindow
)
895 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
896 FIXME("(%p)->(%p %p %x)\n", This
, lprcBorder
, pUIWindow
, fFrameWindow
);
900 static HRESULT WINAPI
InPlaceActiveObject_EnableModeless(IOleInPlaceActiveObject
*iface
,
903 WebBrowser
*This
= impl_from_IOleInPlaceActiveObject(iface
);
904 FIXME("(%p)->(%x)\n", This
, fEnable
);
908 static const IOleInPlaceActiveObjectVtbl OleInPlaceActiveObjectVtbl
= {
909 InPlaceActiveObject_QueryInterface
,
910 InPlaceActiveObject_AddRef
,
911 InPlaceActiveObject_Release
,
912 InPlaceActiveObject_GetWindow
,
913 InPlaceActiveObject_ContextSensitiveHelp
,
914 InPlaceActiveObject_TranslateAccelerator
,
915 InPlaceActiveObject_OnFrameWindowActivate
,
916 InPlaceActiveObject_OnDocWindowActivate
,
917 InPlaceActiveObject_ResizeBorder
,
918 InPlaceActiveObject_EnableModeless
921 static inline WebBrowser
*impl_from_IOleCommandTarget(IOleCommandTarget
*iface
)
923 return CONTAINING_RECORD(iface
, WebBrowser
, IOleCommandTarget_iface
);
926 static HRESULT WINAPI
WBOleCommandTarget_QueryInterface(IOleCommandTarget
*iface
,
927 REFIID riid
, void **ppv
)
929 WebBrowser
*This
= impl_from_IOleCommandTarget(iface
);
930 return IWebBrowser2_QueryInterface(&This
->IWebBrowser2_iface
, riid
, ppv
);
933 static ULONG WINAPI
WBOleCommandTarget_AddRef(IOleCommandTarget
*iface
)
935 WebBrowser
*This
= impl_from_IOleCommandTarget(iface
);
936 return IWebBrowser2_AddRef(&This
->IWebBrowser2_iface
);
939 static ULONG WINAPI
WBOleCommandTarget_Release(IOleCommandTarget
*iface
)
941 WebBrowser
*This
= impl_from_IOleCommandTarget(iface
);
942 return IWebBrowser2_Release(&This
->IWebBrowser2_iface
);
945 static HRESULT WINAPI
WBOleCommandTarget_QueryStatus(IOleCommandTarget
*iface
,
946 const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
948 WebBrowser
*This
= impl_from_IOleCommandTarget(iface
);
949 IOleCommandTarget
*cmdtrg
;
952 TRACE("(%p)->(%s %u %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
,
955 if(!This
->doc_host
.document
)
958 /* NOTE: There are probably some commands that we should handle here
959 * instead of forwarding to document object. */
961 hres
= IUnknown_QueryInterface(This
->doc_host
.document
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
965 hres
= IOleCommandTarget_QueryStatus(cmdtrg
, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
966 IOleCommandTarget_Release(cmdtrg
);
971 static HRESULT WINAPI
WBOleCommandTarget_Exec(IOleCommandTarget
*iface
,
972 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
,
975 WebBrowser
*This
= impl_from_IOleCommandTarget(iface
);
976 FIXME("(%p)->(%s %d %d %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), nCmdID
,
977 nCmdexecopt
, pvaIn
, pvaOut
);
981 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
982 WBOleCommandTarget_QueryInterface
,
983 WBOleCommandTarget_AddRef
,
984 WBOleCommandTarget_Release
,
985 WBOleCommandTarget_QueryStatus
,
986 WBOleCommandTarget_Exec
989 void WebBrowser_OleObject_Init(WebBrowser
*This
)
995 /* default aspect ratio is 96dpi / 96dpi */
997 dpi_x
= GetDeviceCaps(hdc
, LOGPIXELSX
);
998 dpi_y
= GetDeviceCaps(hdc
, LOGPIXELSY
);
1001 This
->IOleObject_iface
.lpVtbl
= &OleObjectVtbl
;
1002 This
->IOleInPlaceObject_iface
.lpVtbl
= &OleInPlaceObjectVtbl
;
1003 This
->IOleControl_iface
.lpVtbl
= &OleControlVtbl
;
1004 This
->IOleInPlaceActiveObject_iface
.lpVtbl
= &OleInPlaceActiveObjectVtbl
;
1005 This
->IOleCommandTarget_iface
.lpVtbl
= &OleCommandTargetVtbl
;
1007 /* Default size is 50x20 pixels, in himetric units */
1008 This
->extent
.cx
= MulDiv( 50, 2540, dpi_x
);
1009 This
->extent
.cy
= MulDiv( 20, 2540, dpi_y
);
1012 void WebBrowser_OleObject_Destroy(WebBrowser
*This
)
1014 release_client_site(This
);