From fea8a762cc2d6c8aaa95c695fa6ffdba54cc3437 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 28 Nov 2005 11:01:17 +0100 Subject: [PATCH] Added implementation of GetWindowContext. Added stub implementation of IOleInPlaceFrame interface. --- dlls/shdocvw/Makefile.in | 1 + dlls/shdocvw/client.c | 17 +++- dlls/shdocvw/frame.c | 180 ++++++++++++++++++++++++++++++++++++++ dlls/shdocvw/shdocvw.h | 8 ++ dlls/shdocvw/webbrowser.c | 1 + 5 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 dlls/shdocvw/frame.c diff --git a/dlls/shdocvw/Makefile.in b/dlls/shdocvw/Makefile.in index cf4ffb43dd6..46b358b6b13 100644 --- a/dlls/shdocvw/Makefile.in +++ b/dlls/shdocvw/Makefile.in @@ -15,6 +15,7 @@ C_SRCS = \ dochost.c \ events.c \ factory.c \ + frame.c \ misc.c \ oleobject.c \ persist.c \ diff --git a/dlls/shdocvw/client.c b/dlls/shdocvw/client.c index d616b90e47f..c374a5dd949 100644 --- a/dlls/shdocvw/client.c +++ b/dlls/shdocvw/client.c @@ -191,9 +191,22 @@ static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { WebBrowser *This = INPLACESITE_THIS(iface); - FIXME("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, + + TRACE("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, lpFrameInfo); - return E_NOTIMPL; + + *ppFrame = INPLACEFRAME(This); + *ppDoc = NULL; + GetClientRect(This->doc_view_hwnd, lprcPosRect); + memcpy(lprcClipRect, lprcPosRect, sizeof(RECT)); + + lpFrameInfo->cb = sizeof(*lpFrameInfo); + lpFrameInfo->fMDIApp = FALSE; + lpFrameInfo->hwndFrame = This->shell_embedding_hwnd; + lpFrameInfo->haccel = NULL; + lpFrameInfo->cAccelEntries = 0; /* FIXME: should be 5 */ + + return S_OK; } static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent) diff --git a/dlls/shdocvw/frame.c b/dlls/shdocvw/frame.c new file mode 100644 index 00000000000..585a64deed8 --- /dev/null +++ b/dlls/shdocvw/frame.c @@ -0,0 +1,180 @@ +/* + * Copyright 2005 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wine/debug.h" +#include "shdocvw.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); + +#define INPLACEFRAME_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceFrame, iface) + +static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, + REFIID riid, void **ppv) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = INPLACEFRAME(This); + }else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid)) { + TRACE("(%p)->(IID_IOleInPlaceUIWindow %p)\n", This, ppv); + *ppv = INPLACEFRAME(This); + }else if(IsEqualGUID(&IID_IOleInPlaceFrame, riid)) { + TRACE("(%p)->(IID_IOleInPlaceFrame %p)\n", This, ppv); + *ppv = INPLACEFRAME(This); + } + + if(*ppv) { + IOleInPlaceFrame_AddRef(INPLACEFRAME(This)); + return S_OK; + } + + WARN("Unsopported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + return IWebBrowser2_AddRef(WEBBROWSER(This)); +} + +static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + return IWebBrowser2_Release(WEBBROWSER(This)); +} + +static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p)\n", This, phwnd); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, + BOOL fEnterMode) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%x)\n", This, fEnterMode); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p)\n", This, lprectBorder); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface, + LPCBORDERWIDTHS pborderwidths) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p)\n", This, pborderwidths); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface, + LPCBORDERWIDTHS pborderwidths) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p)\n", This, pborderwidths); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface, + IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p %s)\n", This, pActiveObject, debugstr_w(pszObjName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, + LPOLEMENUGROUPWIDTHS lpMenuWidths) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, hmenuShared, lpMenuWidths); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, + HOLEMENU holemenu, HWND hwndActiveObject) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p %p %p)\n", This, hmenuShared, holemenu, hwndActiveObject); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p)\n", This, hmenuShared); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, + LPCOLESTR pszStatusText) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p)\n", This, debugstr_w(pszStatusText)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%x)\n", This, fEnable); + return E_NOTIMPL; +} + +static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, + WORD wID) +{ + WebBrowser *This = INPLACEFRAME_THIS(iface); + FIXME("(%p)->(%p %d)\n", This, lpmsg, wID); + return E_NOTIMPL; +} + +#undef INPLACEFRAME_THIS + +static const IOleInPlaceFrameVtbl OleInPlaceFrameVtbl = { + InPlaceFrame_QueryInterface, + InPlaceFrame_AddRef, + InPlaceFrame_Release, + InPlaceFrame_GetWindow, + InPlaceFrame_ContextSensitiveHelp, + InPlaceFrame_GetBorder, + InPlaceFrame_RequestBorderSpace, + InPlaceFrame_SetBorderSpace, + InPlaceFrame_SetActiveObject, + InPlaceFrame_InsertMenus, + InPlaceFrame_SetMenu, + InPlaceFrame_RemoveMenus, + InPlaceFrame_SetStatusText, + InPlaceFrame_EnableModeless, + InPlaceFrame_TranslateAccelerator +}; + +void WebBrowser_Frame_Init(WebBrowser *This) +{ + This->lpOleInPlaceFrameVtbl = &OleInPlaceFrameVtbl; +} diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index 104f978e728..128e75c321f 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -78,6 +78,10 @@ typedef struct { const IOleInPlaceSiteVtbl *lpOleInPlaceSiteVtbl; const IDocHostUIHandler2Vtbl *lpDocHostUIHandlerVtbl; + /* Interfaces of InPlaceFrame object */ + + const IOleInPlaceFrameVtbl *lpOleInPlaceFrameVtbl; + LONG ref; IUnknown *document; @@ -123,6 +127,8 @@ typedef struct { #define DOCHOSTUI(x) ((IDocHostUIHandler*) &(x)->lpDocHostUIHandlerVtbl) #define DOCHOSTUI2(x) ((IDocHostUIHandler2*) &(x)->lpDocHostUIHandlerVtbl) +#define INPLACEFRAME(x) ((IOleInPlaceFrame*) &(x)->lpOleInPlaceFrameVtbl) + void WebBrowser_OleObject_Init(WebBrowser*); void WebBrowser_ViewObject_Init(WebBrowser*); void WebBrowser_Persist_Init(WebBrowser*); @@ -133,6 +139,8 @@ void WebBrowser_Events_Init(WebBrowser*); void WebBrowser_ClientSite_Init(WebBrowser*); void WebBrowser_DocHost_Init(WebBrowser*); +void WebBrowser_Frame_Init(WebBrowser*); + void WebBrowser_OleObject_Destroy(WebBrowser*); void WebBrowser_Events_Destroy(WebBrowser*); diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c index 5f01ea667e7..79a773991de 100644 --- a/dlls/shdocvw/webbrowser.c +++ b/dlls/shdocvw/webbrowser.c @@ -788,6 +788,7 @@ HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv) WebBrowser_Events_Init(ret); WebBrowser_ClientSite_Init(ret); WebBrowser_DocHost_Init(ret); + WebBrowser_Frame_Init(ret); hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv); if(SUCCEEDED(hres)) {