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);