2 * SHDOCVW - Internet Explorer main frame window
4 * Copyright 2006 Mike McCormack (for CodeWeavers)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw
);
39 typedef struct tag_ieoc
{
40 const IOleContainerVtbl
*lpVtbl
;
44 static ieoc
*ieoc_from_IOleContainer(IOleContainer
*iface
)
50 ic_QueryInterface(IOleContainer
*iface
, REFIID riid
, void **ppv
)
52 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
53 IsEqualGUID(riid
, &IID_IOleClientSite
))
55 IUnknown_AddRef(iface
);
62 static ULONG WINAPI
ic_AddRef(IOleContainer
*iface
)
64 ieoc
*This
= ieoc_from_IOleContainer(iface
);
65 return InterlockedIncrement(&This
->ref
);
68 static ULONG WINAPI
ic_Release(IOleContainer
*iface
)
70 ieoc
*This
= ieoc_from_IOleContainer(iface
);
71 LONG ref
= InterlockedDecrement(&This
->ref
);
74 HeapFree(GetProcessHeap(), 0, This
);
75 SHDOCVW_UnlockModule();
77 TRACE("refcount = %ld\n", ref
);
82 ic_ParseDisplayName(IOleContainer
*iface
, IBindCtx
*pbc
, LPOLESTR pszDisplayName
,
83 ULONG
*pchEaten
, IMoniker
**ppmkOut
)
90 ic_EnumObjects(IOleContainer
*iface
, DWORD grfFlags
, IEnumUnknown
**ppenum
)
96 static HRESULT WINAPI
ic_LockContainer(IOleContainer
*iface
, BOOL fLock
)
102 static const IOleContainerVtbl ocVtbl
=
112 static IOleContainer
* get_container(void)
117 oc
= HeapAlloc(GetProcessHeap(), 0, sizeof *oc
);
118 oc
->lpVtbl
= &ocVtbl
;
121 This
= (IOleContainer
*) oc
;
122 IOleContainer_AddRef(This
);
123 SHDOCVW_LockModule();
128 /**********************/
130 typedef struct tag_iecs
{
131 const IOleClientSiteVtbl
*lpVtbl
;
132 const IOleInPlaceSiteVtbl
*lpInPlaceVtbl
;
134 IOleContainer
*container
;
139 static iecs
*iecs_from_IOleClientSite(IOleClientSite
*iface
)
141 return (iecs
*) iface
;
144 static iecs
*iecs_from_IOleInPlaceSite(IOleInPlaceSite
*iface
)
146 return (iecs
*) (((char*)iface
) - FIELD_OFFSET(iecs
,lpInPlaceVtbl
));
149 static ULONG WINAPI
iecs_AddRef(iecs
*This
)
151 return InterlockedIncrement(&This
->ref
);
154 static ULONG WINAPI
iecs_Release(iecs
*This
)
156 LONG ref
= InterlockedDecrement(&This
->ref
);
160 DestroyWindow(This
->hwnd
);
161 IOleContainer_Release(This
->container
);
162 HeapFree(GetProcessHeap(), 0, This
);
163 SHDOCVW_UnlockModule();
168 static HRESULT WINAPI
169 iecs_QueryInterface(iecs
*This
, REFIID riid
, void **ppv
)
171 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
172 IsEqualGUID(riid
, &IID_IOleClientSite
))
175 *ppv
= &This
->lpVtbl
;;
178 if (IsEqualGUID(riid
, &IID_IOleInPlaceSite
) ||
179 IsEqualGUID(riid
, &IID_IOleWindow
))
182 *ppv
= &This
->lpInPlaceVtbl
;
185 FIXME("unknown interface %s\n", debugstr_guid(riid
));
186 return E_NOINTERFACE
;
189 static HRESULT WINAPI
190 cs_QueryInterface(IOleClientSite
*iface
, REFIID riid
, void **ppv
)
192 iecs
*This
= iecs_from_IOleClientSite(iface
);
193 return iecs_QueryInterface(This
, riid
, ppv
);
196 static ULONG WINAPI
cs_AddRef(IOleClientSite
*iface
)
198 iecs
*This
= iecs_from_IOleClientSite(iface
);
199 return iecs_AddRef(This
);
202 static ULONG WINAPI
cs_Release(IOleClientSite
*iface
)
204 iecs
*This
= iecs_from_IOleClientSite(iface
);
205 return iecs_Release(This
);
208 static HRESULT WINAPI
cs_SaveObject(IOleClientSite
*iface
)
214 static HRESULT WINAPI
cs_GetMoniker(IOleClientSite
*iface
, DWORD dwAssign
,
215 DWORD dwWhichMoniker
, IMoniker
**ppmk
)
221 static HRESULT WINAPI
222 cs_GetContainer(IOleClientSite
*iface
, IOleContainer
**ppContainer
)
224 iecs
*This
= iecs_from_IOleClientSite(iface
);
228 IOleContainer_AddRef(This
->container
);
229 *ppContainer
= This
->container
;
233 static HRESULT WINAPI
cs_ShowObject(IOleClientSite
*iface
)
239 static HRESULT WINAPI
cs_OnShowWindow(IOleClientSite
*iface
, BOOL fShow
)
245 static HRESULT WINAPI
cs_RequestNewObjectLayout(IOleClientSite
*iface
)
251 static const IOleClientSiteVtbl csVtbl
=
261 cs_RequestNewObjectLayout
,
264 static HRESULT WINAPI
265 is_QueryInterface(IOleInPlaceSite
*iface
, REFIID riid
, void **ppv
)
267 iecs
*This
= iecs_from_IOleInPlaceSite(iface
);
268 return iecs_QueryInterface(This
, riid
, ppv
);
271 static ULONG WINAPI
is_AddRef(IOleInPlaceSite
*iface
)
273 iecs
*This
= iecs_from_IOleInPlaceSite(iface
);
274 return iecs_AddRef(This
);
277 static ULONG WINAPI
is_Release(IOleInPlaceSite
*iface
)
279 iecs
*This
= iecs_from_IOleInPlaceSite(iface
);
280 return iecs_Release(This
);
283 static HRESULT WINAPI
is_getWindow(IOleInPlaceSite
*iface
, HWND
*phwnd
)
285 iecs
*This
= iecs_from_IOleInPlaceSite(iface
);
293 static HRESULT WINAPI
294 is_ContextSensitiveHelp(IOleInPlaceSite
*iface
, BOOL fEnterMode
)
300 static HRESULT WINAPI
is_CanInPlaceActivate(IOleInPlaceSite
*iface
)
306 static HRESULT WINAPI
is_OnInPlaceActivate(IOleInPlaceSite
*iface
)
312 static HRESULT WINAPI
is_OnUIActivate(IOleInPlaceSite
*iface
)
318 static HRESULT WINAPI
319 is_GetWindowContext(IOleInPlaceSite
*iface
, IOleInPlaceFrame
**ppFrame
,
320 IOleInPlaceUIWindow
** ppDoc
, LPRECT lprcPosRect
,
321 LPRECT lprcClipRect
, LPOLEINPLACEFRAMEINFO lpFrameInfo
)
323 iecs
*This
= iecs_from_IOleInPlaceSite(iface
);
329 GetClientRect(This
->hwnd
, lprcPosRect
);
330 GetClientRect(This
->hwnd
, lprcClipRect
);
331 if (lpFrameInfo
->cb
!= sizeof *lpFrameInfo
)
332 ERR("frame info wrong size\n");
333 lpFrameInfo
->cAccelEntries
= 0;
334 lpFrameInfo
->fMDIApp
= FALSE
;
335 lpFrameInfo
->haccel
= 0;
336 lpFrameInfo
->hwndFrame
= This
->hwnd
;
341 static HRESULT WINAPI
is_Scroll(IOleInPlaceSite
*iface
, SIZE scrollExtent
)
347 static HRESULT WINAPI
is_OnUIDeactivate(IOleInPlaceSite
*iface
, BOOL fUndoable
)
353 static HRESULT WINAPI
is_OnInPlaceDeactivate(IOleInPlaceSite
*iface
)
359 static HRESULT WINAPI
is_DiscardUndoState(IOleInPlaceSite
*iface
)
365 static const IOleInPlaceSiteVtbl isVtbl
=
371 is_ContextSensitiveHelp
,
372 is_CanInPlaceActivate
,
373 is_OnInPlaceActivate
,
378 is_OnInPlaceDeactivate
,
382 static const WCHAR szIEWinFrame
[] = { 'I','E','F','r','a','m','e',0 };
384 static LRESULT
iewnd_OnCreate(HWND hwnd
, LPCREATESTRUCTW lpcs
)
386 SetWindowLongPtrW(hwnd
, 0, (LONG_PTR
) lpcs
->lpCreateParams
);
390 static LRESULT
iewnd_OnSize(iecs
*This
, INT width
, INT height
)
394 TRACE("%p %d %d\n", This
, width
, height
);
398 IOleObject_SetExtent(This
->oo
, DVASPECT_CONTENT
, &sz
);
402 static LRESULT
iewnd_OnDestroy(iecs
*This
)
407 IOleObject_Close(This
->oo
, OLECLOSE_NOSAVE
);
408 IOleObject_Release(This
->oo
);
415 static LRESULT CALLBACK
416 ie_window_proc(HWND hwnd
, UINT msg
, WPARAM wparam
, LPARAM lparam
)
418 iecs
*This
= (iecs
*) GetWindowLongPtrW(hwnd
, 0);
423 return iewnd_OnCreate(hwnd
, (LPCREATESTRUCTW
)lparam
);
425 return iewnd_OnDestroy(This
);
427 return iewnd_OnSize(This
, LOWORD(lparam
), HIWORD(lparam
));
429 return DefWindowProcW(hwnd
, msg
, wparam
, lparam
);
432 static IOleClientSite
* get_client_site(IOleObject
*oo
, HWND
*phwnd
)
434 static const WCHAR winname
[] = {
435 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',0};
436 IOleClientSite
*This
;
440 cs
= HeapAlloc(GetProcessHeap(), 0, sizeof *cs
);
445 cs
->lpVtbl
= &csVtbl
;
446 cs
->lpInPlaceVtbl
= &isVtbl
;
447 cs
->container
= get_container();
450 hwnd
= CreateWindowW(szIEWinFrame
, winname
, WS_VISIBLE
|WS_OVERLAPPEDWINDOW
,
451 CW_USEDEFAULT
, CW_USEDEFAULT
,
452 CW_USEDEFAULT
, CW_USEDEFAULT
,
453 NULL
, NULL
, shdocvw_hinstance
, cs
);
456 HeapFree(GetProcessHeap(), 0, cs
);
460 IOleObject_AddRef(oo
);
464 This
= (IOleClientSite
*) cs
;
465 IOleClientSite_AddRef(This
);
466 SHDOCVW_LockModule();
471 void register_iewindow_class(void)
475 memset(&wc
, 0, sizeof wc
);
477 wc
.lpfnWndProc
= ie_window_proc
;
479 wc
.cbWndExtra
= sizeof(iecs
*);
480 wc
.hInstance
= shdocvw_hinstance
;
482 wc
.hCursor
= LoadCursorW(0, MAKEINTRESOURCEW(IDI_APPLICATION
));
483 wc
.hbrBackground
= 0;
484 wc
.lpszClassName
= szIEWinFrame
;
485 wc
.lpszMenuName
= NULL
;
490 void unregister_iewindow_class(void)
492 UnregisterClassW(szIEWinFrame
, shdocvw_hinstance
);
495 BOOL
create_ie_window(LPCWSTR url
)
497 IWebBrowser2
*wb
= NULL
;
498 IOleObject
*oo
= NULL
;
499 IOleClientSite
*cs
= NULL
;
502 RECT rcClient
= { 0,0,100,100 };
506 /* create the web browser */
507 r
= CoCreateInstance(&CLSID_WebBrowser
, NULL
, CLSCTX_INPROC_SERVER
,
508 &IID_IWebBrowser2
, (LPVOID
)&wb
);
512 /* get its IOleObject interface */
513 r
= IWebBrowser2_QueryInterface(wb
, &IID_IOleObject
, (void**) &oo
);
517 /* create the window frame for the browser object */
518 cs
= get_client_site(oo
, &hwnd
);
522 /* attach the browser to the window frame */
523 r
= IOleObject_SetClientSite(oo
, cs
);
527 /* activate the browser */
528 r
= IOleObject_DoVerb(oo
, OLEIVERB_INPLACEACTIVATE
, &msg
, cs
, 0, hwnd
, &rcClient
);
532 /* navigate to the first page */
533 bstrUrl
= SysAllocString(url
);
534 IWebBrowser2_Navigate(wb
, bstrUrl
, NULL
, NULL
, NULL
, NULL
);
536 /* run the message loop for this thread */
537 while (GetMessageW(&msg
, 0, 0, 0))
539 TranslateMessage(&msg
);
540 DispatchMessageW(&msg
);
548 IOleClientSite_Release(cs
);
550 IOleObject_Release(oo
);
552 IOleObject_Release(wb
);