libs: Merged libwine_unicode into libwine.
[wine] / dlls / shdocvw / oleobject.c
1 /*
2  * Implementation of IOleObject interfaces for WebBrowser control
3  *
4  * - IOleObject
5  * - IOleInPlaceObject
6  * - IOleControl
7  *
8  * Copyright 2001 John R. Sheets (for CodeWeavers)
9  * Copyright 2005 Jacek Caban
10  *
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.
15  *
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.
20  *
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
24  */
25
26 #include <string.h>
27 #include "wine/debug.h"
28 #include "shdocvw.h"
29 #include "htiframe.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
32
33 static ATOM shell_embedding_atom = 0;
34
35 static LRESULT resize_window(WebBrowser *This, LONG width, LONG height)
36 {
37     if(This->doc_host.hwnd)
38         SetWindowPos(This->doc_host.hwnd, NULL, 0, 0, width, height,
39                      SWP_NOZORDER | SWP_NOACTIVATE);
40
41     return 0;
42 }
43
44 static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
45 {
46     WebBrowser *This;
47
48     static const WCHAR wszTHIS[] = {'T','H','I','S',0};
49
50     if(msg == WM_CREATE) {
51         This = *(WebBrowser**)lParam;
52         SetPropW(hwnd, wszTHIS, This);
53     }else {
54         This = GetPropW(hwnd, wszTHIS);
55     }
56
57     switch(msg) {
58     case WM_SIZE:
59         return resize_window(This, LOWORD(lParam), HIWORD(lParam));
60     }
61
62     return DefWindowProcW(hwnd, msg, wParam, lParam);
63 }
64
65 static void create_shell_embedding_hwnd(WebBrowser *This)
66 {
67     IOleInPlaceSite *inplace;
68     HWND parent = NULL;
69     HRESULT hres;
70
71     static const WCHAR wszShellEmbedding[] =
72         {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0};
73
74     if(!shell_embedding_atom) {
75         static WNDCLASSEXW wndclass = {
76             sizeof(wndclass),
77             CS_DBLCLKS,
78             shell_embedding_proc,
79             0, 0 /* native uses 8 */, NULL, NULL, NULL,
80             (HBRUSH)COLOR_WINDOWFRAME, NULL,
81             wszShellEmbedding,
82             NULL
83         };
84         wndclass.hInstance = shdocvw_hinstance;
85
86         RegisterClassExW(&wndclass);
87     }
88
89     hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace);
90     if(SUCCEEDED(hres)) {
91         IOleInPlaceSite_GetWindow(inplace, &parent);
92         IOleInPlaceSite_Release(inplace);
93     }
94
95     This->doc_host.frame_hwnd = This->shell_embedding_hwnd = CreateWindowExW(
96             WS_EX_WINDOWEDGE,
97             wszShellEmbedding, wszShellEmbedding,
98             WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP,
99             0, 0, 0, 0, parent,
100             NULL, shdocvw_hinstance, This);
101 }
102
103 static HRESULT activate_inplace(WebBrowser *This, IOleClientSite *active_site, HWND parent_hwnd)
104 {
105     HRESULT hres;
106
107     if(This->inplace)
108         return S_OK;
109
110     if(!active_site)
111         return E_INVALIDARG;
112
113     hres = IOleClientSite_QueryInterface(active_site, &IID_IOleInPlaceSite,
114                                          (void**)&This->inplace);
115     if(FAILED(hres)) {
116         WARN("Could not get IOleInPlaceSite\n");
117         return hres;
118     }
119
120     hres = IOleInPlaceSite_CanInPlaceActivate(This->inplace);
121     if(hres != S_OK) {
122         WARN("CanInPlaceActivate returned: %08lx\n", hres);
123         IOleInPlaceSite_Release(This->inplace);
124         return E_FAIL;
125     }
126
127     hres = IOleInPlaceSite_GetWindow(This->inplace, &This->iphwnd);
128     if(FAILED(hres))
129         This->iphwnd = parent_hwnd;
130
131     IOleInPlaceSite_OnInPlaceActivate(This->inplace);
132
133     IOleInPlaceSite_GetWindowContext(This->inplace, &This->frame, &This->uiwindow,
134                                      &This->pos_rect, &This->clip_rect,
135                                      &This->frameinfo);
136
137     SetWindowPos(This->shell_embedding_hwnd, NULL,
138                  This->pos_rect.left, This->pos_rect.top,
139                  This->pos_rect.right-This->pos_rect.left,
140                  This->pos_rect.bottom-This->pos_rect.top,
141                  SWP_NOZORDER | SWP_SHOWWINDOW);
142
143     if(This->client) {
144         IOleClientSite_ShowObject(This->client);
145         IOleClientSite_GetContainer(This->client, &This->container);
146     }
147
148     if(This->frame)
149         IOleInPlaceFrame_GetWindow(This->frame, &This->frame_hwnd);
150
151     return S_OK;
152 }
153
154 static HRESULT activate_ui(WebBrowser *This, IOleClientSite *active_site, HWND parent_hwnd)
155 {
156     HRESULT hres;
157
158     static const WCHAR wszitem[] = {'i','t','e','m',0};
159
160     if(This->inplace)
161         return S_OK;
162
163     hres = activate_inplace(This, active_site, parent_hwnd);
164     if(FAILED(hres))
165         return hres;
166
167     IOleInPlaceSite_OnUIActivate(This->inplace);
168
169     if(This->frame)
170         IOleInPlaceFrame_SetActiveObject(This->frame, ACTIVEOBJ(This), wszitem);
171     if(This->uiwindow)
172         IOleInPlaceUIWindow_SetActiveObject(This->uiwindow, ACTIVEOBJ(This), wszitem);
173
174     if(This->frame)
175         IOleInPlaceFrame_SetMenu(This->frame, NULL, NULL, This->shell_embedding_hwnd);
176
177     SetFocus(This->shell_embedding_hwnd);
178
179     return S_OK;
180 }
181
182 /**********************************************************************
183  * Implement the IOleObject interface for the WebBrowser control
184  */
185
186 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
187
188 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
189 {
190     WebBrowser *This = OLEOBJ_THIS(iface);
191     return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppv);
192 }
193
194 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
195 {
196     WebBrowser *This = OLEOBJ_THIS(iface);
197     return IWebBrowser_AddRef(WEBBROWSER(This));
198 }
199
200 static ULONG WINAPI OleObject_Release(IOleObject *iface)
201 {
202     WebBrowser *This = OLEOBJ_THIS(iface);
203     return IWebBrowser_Release(WEBBROWSER(This));
204 }
205
206 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite)
207 {
208     WebBrowser *This = OLEOBJ_THIS(iface);
209     IOleContainer *container;
210     HRESULT hres;
211
212     TRACE("(%p)->(%p)\n", This, pClientSite);
213
214     if(This->client == pClientSite)
215         return S_OK;
216
217     if(This->doc_host.hwnd) {
218         DestroyWindow(This->doc_host.hwnd);
219         This->doc_host.hwnd = NULL;
220     }
221     if(This->shell_embedding_hwnd) {
222         DestroyWindow(This->shell_embedding_hwnd);
223         This->shell_embedding_hwnd = NULL;
224     }
225
226     if(This->inplace) {
227         IOleInPlaceSite_Release(This->inplace);
228         This->inplace = NULL;
229     }
230
231     if(This->doc_host.hostui)
232         IDocHostUIHandler_Release(This->doc_host.hostui);
233     if(This->client)
234         IOleClientSite_Release(This->client);
235
236     if(!pClientSite) {
237         if(This->doc_host.document)
238             deactivate_document(&This->doc_host);
239         This->client = NULL;
240         return S_OK;
241     }
242
243     This->client = pClientSite;
244     IOleClientSite_AddRef(pClientSite);
245
246     hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
247                                          (void**)&This->doc_host.hostui);
248     if(FAILED(hres))
249         This->doc_host.hostui = NULL;
250
251     hres = IOleClientSite_GetContainer(This->client, &container);
252     if(SUCCEEDED(hres)) {
253         ITargetContainer *target_container;
254
255         hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer,
256                                             (void**)&target_container);
257         if(SUCCEEDED(hres)) {
258             FIXME("Unsupported ITargetContainer\n");
259             ITargetContainer_Release(target_container);
260         }
261
262         IOleContainer_Release(container);
263     }
264
265     create_shell_embedding_hwnd(This);
266
267     return S_OK;
268 }
269
270 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, LPOLECLIENTSITE *ppClientSite)
271 {
272     WebBrowser *This = OLEOBJ_THIS(iface);
273
274     TRACE("(%p)->(%p)\n", This, ppClientSite);
275
276     if(!ppClientSite)
277         return E_INVALIDARG;
278
279     if(This->client)
280         IOleClientSite_AddRef(This->client);
281     *ppClientSite = This->client;
282
283     return S_OK;
284 }
285
286 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp,
287         LPCOLESTR szContainerObj)
288 {
289     WebBrowser *This = OLEOBJ_THIS(iface);
290     FIXME("(%p)->(%s, %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
291     return E_NOTIMPL;
292 }
293
294 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
295 {
296     WebBrowser *This = OLEOBJ_THIS(iface);
297     FIXME("(%p)->(%ld)\n", This, dwSaveOption);
298     return E_NOTIMPL;
299 }
300
301 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk)
302 {
303     WebBrowser *This = OLEOBJ_THIS(iface);
304     FIXME("(%p)->(%ld, %p)\n", This, dwWhichMoniker, pmk);
305     return E_NOTIMPL;
306 }
307
308 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign,
309         DWORD dwWhichMoniker, LPMONIKER *ppmk)
310 {
311     WebBrowser *This = OLEOBJ_THIS(iface);
312     FIXME("(%p)->(%ld, %ld, %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
313     return E_NOTIMPL;
314 }
315
316 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, LPDATAOBJECT pDataObject,
317         BOOL fCreation, DWORD dwReserved)
318 {
319     WebBrowser *This = OLEOBJ_THIS(iface);
320     FIXME("(%p)->(%p, %d, %ld)\n", This, pDataObject, fCreation, dwReserved);
321     return E_NOTIMPL;
322 }
323
324 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved,
325         LPDATAOBJECT *ppDataObject)
326 {
327     WebBrowser *This = OLEOBJ_THIS(iface);
328     FIXME("(%p)->(%ld, %p)\n", This, dwReserved, ppDataObject);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tagMSG* lpmsg,
333         LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
334 {
335     WebBrowser *This = OLEOBJ_THIS(iface);
336
337     TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
338             lprcPosRect);
339
340     switch (iVerb)
341     {
342     case OLEIVERB_SHOW:
343         TRACE("OLEIVERB_SHOW\n");
344         return activate_ui(This, pActiveSite, hwndParent);
345     case OLEIVERB_UIACTIVATE:
346         TRACE("OLEIVERB_UIACTIVATE\n");
347         return activate_ui(This, pActiveSite, hwndParent);
348     case OLEIVERB_INPLACEACTIVATE:
349         TRACE("OLEIVERB_INPLACEACTIVATE\n");
350         return activate_inplace(This, pActiveSite, hwndParent);
351     default:
352         FIXME("stub for %ld\n", iVerb);
353         break;
354     }
355
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
360 {
361     WebBrowser *This = OLEOBJ_THIS(iface);
362     TRACE("(%p)->(%p)\n", This, ppEnumOleVerb);
363     return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
364 }
365
366 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
367 {
368     WebBrowser *This = OLEOBJ_THIS(iface);
369     FIXME("(%p)\n", This);
370     return E_NOTIMPL;
371 }
372
373 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
374 {
375     WebBrowser *This = OLEOBJ_THIS(iface);
376     FIXME("(%p)\n", This);
377     return E_NOTIMPL;
378 }
379
380 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID* pClsid)
381 {
382     WebBrowser *This = OLEOBJ_THIS(iface);
383     FIXME("(%p)->(%p)\n", This, pClsid);
384     return E_NOTIMPL;
385 }
386
387 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType,
388         LPOLESTR* pszUserType)
389 {
390     WebBrowser *This = OLEOBJ_THIS(iface);
391     TRACE("(%p, %ld, %p)\n", This, dwFormOfType, pszUserType);
392     return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
393 }
394
395 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
396 {
397     WebBrowser *This = OLEOBJ_THIS(iface);
398     FIXME("(%p)->(%lx %p)\n", This, dwDrawAspect, psizel);
399     return E_NOTIMPL;
400 }
401
402 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
403 {
404     WebBrowser *This = OLEOBJ_THIS(iface);
405     FIXME("(%p)->(%lx, %p)\n", This, dwDrawAspect, psizel);
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink,
410         DWORD* pdwConnection)
411 {
412     WebBrowser *This = OLEOBJ_THIS(iface);
413     FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection);
414     return E_NOTIMPL;
415 }
416
417 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
418 {
419     WebBrowser *This = OLEOBJ_THIS(iface);
420     FIXME("(%p)->(%ld)\n", This, dwConnection);
421     return E_NOTIMPL;
422 }
423
424 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
425 {
426     WebBrowser *This = OLEOBJ_THIS(iface);
427     FIXME("(%p)->(%p)\n", This, ppenumAdvise);
428     return S_OK;
429 }
430
431 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
432 {
433     WebBrowser *This = OLEOBJ_THIS(iface);
434
435     TRACE("(%p)->(%lx, %p)\n", This, dwAspect, pdwStatus);
436
437     *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
438         |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE;
439
440     return S_OK;
441 }
442
443 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE* pLogpal)
444 {
445     WebBrowser *This = OLEOBJ_THIS(iface);
446     FIXME("(%p)->(%p)\n", This, pLogpal);
447     return E_NOTIMPL;
448 }
449
450 #undef OLEOBJ_THIS
451
452 static const IOleObjectVtbl OleObjectVtbl =
453 {
454     OleObject_QueryInterface,
455     OleObject_AddRef,
456     OleObject_Release,
457     OleObject_SetClientSite,
458     OleObject_GetClientSite,
459     OleObject_SetHostNames,
460     OleObject_Close,
461     OleObject_SetMoniker,
462     OleObject_GetMoniker,
463     OleObject_InitFromData,
464     OleObject_GetClipboardData,
465     OleObject_DoVerb,
466     OleObject_EnumVerbs,
467     OleObject_Update,
468     OleObject_IsUpToDate,
469     OleObject_GetUserClassID,
470     OleObject_GetUserType,
471     OleObject_SetExtent,
472     OleObject_GetExtent,
473     OleObject_Advise,
474     OleObject_Unadvise,
475     OleObject_EnumAdvise,
476     OleObject_GetMiscStatus,
477     OleObject_SetColorScheme
478 };
479
480 /**********************************************************************
481  * Implement the IOleInPlaceObject interface
482  */
483
484 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
485
486 static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObject *iface,
487         REFIID riid, LPVOID *ppobj)
488 {
489     WebBrowser *This = INPLACEOBJ_THIS(iface);
490     return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
491 }
492
493 static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObject *iface)
494 {
495     WebBrowser *This = INPLACEOBJ_THIS(iface);
496     return IWebBrowser_AddRef(WEBBROWSER(This));
497 }
498
499 static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObject *iface)
500 {
501     WebBrowser *This = INPLACEOBJ_THIS(iface);
502     return IWebBrowser_Release(WEBBROWSER(This));
503 }
504
505 static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObject *iface, HWND* phwnd)
506 {
507     WebBrowser *This = INPLACEOBJ_THIS(iface);
508
509     TRACE("(%p)->(%p)\n", This, phwnd);
510
511     *phwnd = This->shell_embedding_hwnd;
512     return S_OK;
513 }
514
515 static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject *iface,
516         BOOL fEnterMode)
517 {
518     WebBrowser *This = INPLACEOBJ_THIS(iface);
519     FIXME("(%p)->(%x)\n", This, fEnterMode);
520     return E_NOTIMPL;
521 }
522
523 static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *iface)
524 {
525     WebBrowser *This = INPLACEOBJ_THIS(iface);
526     FIXME("(%p)\n", This);
527     return E_NOTIMPL;
528 }
529
530 static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
531 {
532     WebBrowser *This = INPLACEOBJ_THIS(iface);
533     FIXME("(%p)\n", This);
534     return E_NOTIMPL;
535 }
536
537 static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObject *iface,
538         LPCRECT lprcPosRect, LPCRECT lprcClipRect)
539 {
540     WebBrowser *This = INPLACEOBJ_THIS(iface);
541
542     TRACE("(%p)->(%p %p)\n", This, lprcPosRect, lprcClipRect);
543
544     memcpy(&This->pos_rect, lprcPosRect, sizeof(RECT));
545
546     if(lprcClipRect)
547         memcpy(&This->clip_rect, lprcClipRect, sizeof(RECT));
548
549     if(This->shell_embedding_hwnd) {
550         SetWindowPos(This->shell_embedding_hwnd, NULL,
551                      lprcPosRect->left, lprcPosRect->top,
552                      lprcPosRect->right-lprcPosRect->left,
553                      lprcPosRect->bottom-lprcPosRect->top,
554                      SWP_NOZORDER | SWP_NOACTIVATE);
555     }
556
557     return S_OK;
558 }
559
560 static HRESULT WINAPI OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject *iface)
561 {
562     WebBrowser *This = INPLACEOBJ_THIS(iface);
563     FIXME("(%p)\n", This);
564     return E_NOTIMPL;
565 }
566
567 #undef INPLACEOBJ_THIS
568
569 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl =
570 {
571     OleInPlaceObject_QueryInterface,
572     OleInPlaceObject_AddRef,
573     OleInPlaceObject_Release,
574     OleInPlaceObject_GetWindow,
575     OleInPlaceObject_ContextSensitiveHelp,
576     OleInPlaceObject_InPlaceDeactivate,
577     OleInPlaceObject_UIDeactivate,
578     OleInPlaceObject_SetObjectRects,
579     OleInPlaceObject_ReactivateAndUndo
580 };
581
582 /**********************************************************************
583  * Implement the IOleControl interface
584  */
585
586 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
587
588 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface,
589         REFIID riid, LPVOID *ppobj)
590 {
591     WebBrowser *This = CONTROL_THIS(iface);
592     return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
593 }
594
595 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
596 {
597     WebBrowser *This = CONTROL_THIS(iface);
598     return IWebBrowser_AddRef(WEBBROWSER(This));
599 }
600
601 static ULONG WINAPI OleControl_Release(IOleControl *iface)
602 {
603     WebBrowser *This = CONTROL_THIS(iface);
604     return IWebBrowser_Release(WEBBROWSER(This));
605 }
606
607 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, LPCONTROLINFO pCI)
608 {
609     WebBrowser *This = CONTROL_THIS(iface);
610     FIXME("(%p)->(%p)\n", This, pCI);
611     return E_NOTIMPL;
612 }
613
614 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, struct tagMSG *pMsg)
615 {
616     WebBrowser *This = CONTROL_THIS(iface);
617     FIXME("(%p)->(%p)\n", This, pMsg);
618     return E_NOTIMPL;
619 }
620
621 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
622 {
623     WebBrowser *This = CONTROL_THIS(iface);
624     FIXME("(%p)->(%ld)\n", This, dispID);
625     return E_NOTIMPL;
626 }
627
628 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
629 {
630     WebBrowser *This = CONTROL_THIS(iface);
631     FIXME("(%p)->(%x)\n", This, bFreeze);
632     return E_NOTIMPL;
633 }
634
635 #undef CONTROL_THIS
636
637 static const IOleControlVtbl OleControlVtbl =
638 {
639     OleControl_QueryInterface,
640     OleControl_AddRef,
641     OleControl_Release,
642     OleControl_GetControlInfo,
643     OleControl_OnMnemonic,
644     OleControl_OnAmbientPropertyChange,
645     OleControl_FreezeEvents
646 };
647
648 #define ACTIVEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceActiveObject, iface)
649
650 static HRESULT WINAPI InPlaceActiveObject_QueryInterface(IOleInPlaceActiveObject *iface,
651                                                             REFIID riid, void **ppv)
652 {
653     WebBrowser *This = ACTIVEOBJ_THIS(iface);
654     return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv);
655 }
656
657 static ULONG WINAPI InPlaceActiveObject_AddRef(IOleInPlaceActiveObject *iface)
658 {
659     WebBrowser *This = ACTIVEOBJ_THIS(iface);
660     return IWebBrowser2_AddRef(WEBBROWSER2(This));
661 }
662
663 static ULONG WINAPI InPlaceActiveObject_Release(IOleInPlaceActiveObject *iface)
664 {
665     WebBrowser *This = ACTIVEOBJ_THIS(iface);
666     return IWebBrowser2_Release(WEBBROWSER2(This));
667 }
668
669 static HRESULT WINAPI InPlaceActiveObject_GetWindow(IOleInPlaceActiveObject *iface,
670                                                     HWND *phwnd)
671 {
672     WebBrowser *This = ACTIVEOBJ_THIS(iface);
673     return IOleInPlaceObject_GetWindow(INPLACEOBJ(This), phwnd);
674 }
675
676 static HRESULT WINAPI InPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceActiveObject *iface,
677                                                                BOOL fEnterMode)
678 {
679     WebBrowser *This = ACTIVEOBJ_THIS(iface);
680     return IOleInPlaceObject_ContextSensitiveHelp(INPLACEOBJ(This), fEnterMode);
681 }
682
683 static HRESULT WINAPI InPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject *iface,
684                                                                LPMSG lpmsg)
685 {
686     WebBrowser *This = ACTIVEOBJ_THIS(iface);
687     FIXME("(%p)->(%p)\n", This, lpmsg);
688     return E_NOTIMPL;
689 }
690
691 static HRESULT WINAPI InPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject *iface,
692                                                                 BOOL fActivate)
693 {
694     WebBrowser *This = ACTIVEOBJ_THIS(iface);
695     FIXME("(%p)->(%x)\n", This, fActivate);
696     return E_NOTIMPL;
697 }
698
699 static HRESULT WINAPI InPlaceActiveObject_OnDocWindowActivate(IOleInPlaceActiveObject *iface,
700                                                               BOOL fActivate)
701 {
702     WebBrowser *This = ACTIVEOBJ_THIS(iface);
703     FIXME("(%p)->(%x)\n", This, fActivate);
704     return E_NOTIMPL;
705 }
706
707 static HRESULT WINAPI InPlaceActiveObject_ResizeBorder(IOleInPlaceActiveObject *iface,
708         LPCRECT lprcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow)
709 {
710     WebBrowser *This = ACTIVEOBJ_THIS(iface);
711     FIXME("(%p)->(%p %p %x)\n", This, lprcBorder, pUIWindow, fFrameWindow);
712     return E_NOTIMPL;
713 }
714
715 static HRESULT WINAPI InPlaceActiveObject_EnableModeless(IOleInPlaceActiveObject *iface,
716                                                          BOOL fEnable)
717 {
718     WebBrowser *This = ACTIVEOBJ_THIS(iface);
719     FIXME("(%p)->(%x)\n", This, fEnable);
720     return E_NOTIMPL;
721 }
722
723 #undef ACTIVEOBJ_THIS
724
725 static const IOleInPlaceActiveObjectVtbl OleInPlaceActiveObjectVtbl = {
726     InPlaceActiveObject_QueryInterface,
727     InPlaceActiveObject_AddRef,
728     InPlaceActiveObject_Release,
729     InPlaceActiveObject_GetWindow,
730     InPlaceActiveObject_ContextSensitiveHelp,
731     InPlaceActiveObject_TranslateAccelerator,
732     InPlaceActiveObject_OnFrameWindowActivate,
733     InPlaceActiveObject_OnDocWindowActivate,
734     InPlaceActiveObject_ResizeBorder,
735     InPlaceActiveObject_EnableModeless
736 };
737
738 #define OLECMD_THIS(iface) DEFINE_THIS(WebBrowser, OleCommandTarget, iface)
739
740 static HRESULT WINAPI WBOleCommandTarget_QueryInterface(IOleCommandTarget *iface,
741         REFIID riid, void **ppv)
742 {
743     WebBrowser *This = OLECMD_THIS(iface);
744     return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppv);
745 }
746
747 static ULONG WINAPI WBOleCommandTarget_AddRef(IOleCommandTarget *iface)
748 {
749     WebBrowser *This = OLECMD_THIS(iface);
750     return IWebBrowser2_AddRef(WEBBROWSER(This));
751 }
752
753 static ULONG WINAPI WBOleCommandTarget_Release(IOleCommandTarget *iface)
754 {
755     WebBrowser *This = OLECMD_THIS(iface);
756     return IWebBrowser2_Release(WEBBROWSER(This));
757 }
758
759 static HRESULT WINAPI WBOleCommandTarget_QueryStatus(IOleCommandTarget *iface,
760         const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
761 {
762     WebBrowser *This = OLECMD_THIS(iface);
763     FIXME("(%p)->(%s %lu %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds,
764           pCmdText);
765     return E_NOTIMPL;
766 }
767
768 static HRESULT WINAPI WBOleCommandTarget_Exec(IOleCommandTarget *iface,
769         const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn,
770         VARIANT *pvaOut)
771 {
772     WebBrowser *This = OLECMD_THIS(iface);
773     FIXME("(%p)->(%s %ld %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID,
774           nCmdexecopt, pvaIn, pvaOut);
775     return E_NOTIMPL;
776 }
777
778 #undef OLECMD_THIS
779
780 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
781     WBOleCommandTarget_QueryInterface,
782     WBOleCommandTarget_AddRef,
783     WBOleCommandTarget_Release,
784     WBOleCommandTarget_QueryStatus,
785     WBOleCommandTarget_Exec
786 };
787
788 void WebBrowser_OleObject_Init(WebBrowser *This)
789 {
790     This->lpOleObjectVtbl              = &OleObjectVtbl;
791     This->lpOleInPlaceObjectVtbl       = &OleInPlaceObjectVtbl;
792     This->lpOleControlVtbl             = &OleControlVtbl;
793     This->lpOleInPlaceActiveObjectVtbl = &OleInPlaceActiveObjectVtbl;
794     This->lpOleCommandTargetVtbl     = &OleCommandTargetVtbl;
795
796     This->client = NULL;
797     This->inplace = NULL;
798     This->container = NULL;
799     This->iphwnd = NULL;
800     This->frame_hwnd = NULL;
801     This->frame = NULL;
802     This->uiwindow = NULL;
803     This->shell_embedding_hwnd = NULL;
804
805     memset(&This->pos_rect, 0, sizeof(RECT));
806     memset(&This->clip_rect, 0, sizeof(RECT));
807     memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO));
808 }
809
810 void WebBrowser_OleObject_Destroy(WebBrowser *This)
811 {
812     if(This->client)
813         IOleObject_SetClientSite(OLEOBJ(This), NULL);
814     if(This->container)
815         IOleContainer_Release(This->container);
816     if(This->frame)
817         IOleInPlaceFrame_Release(This->frame);
818     if(This->uiwindow)
819         IOleInPlaceUIWindow_Release(This->uiwindow);
820 }