explorerframe: Add IOleWindow implementation.

This commit is contained in:
David Hedberg 2010-08-03 03:43:08 +02:00 committed by Alexandre Julliard
parent 0ea424e7eb
commit c32fa3485b
2 changed files with 151 additions and 1 deletions

View File

@ -36,6 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(nstc);
typedef struct {
const INameSpaceTreeControl2Vtbl *lpVtbl;
const IOleWindowVtbl *lpowVtbl;
LONG ref;
HWND hwnd_main;
@ -207,6 +208,10 @@ static HRESULT WINAPI NSTC2_fnQueryInterface(INameSpaceTreeControl2* iface,
{
*ppvObject = This;
}
else if(IsEqualIID(riid, &IID_IOleWindow))
{
*ppvObject = &This->lpowVtbl;
}
if(*ppvObject)
{
@ -531,6 +536,62 @@ static const INameSpaceTreeControl2Vtbl vt_INameSpaceTreeControl2 = {
NSTC2_fnGetControlStyle2
};
/**************************************************************************
* IOleWindow Implementation
*/
static inline NSTC2Impl *impl_from_IOleWindow(IOleWindow *iface)
{
return (NSTC2Impl *)((char*)iface - FIELD_OFFSET(NSTC2Impl, lpowVtbl));
}
static HRESULT WINAPI IOW_fnQueryInterface(IOleWindow *iface, REFIID riid, void **ppvObject)
{
NSTC2Impl *This = impl_from_IOleWindow(iface);
TRACE("%p\n", This);
return NSTC2_fnQueryInterface((INameSpaceTreeControl2*)This, riid, ppvObject);
}
static ULONG WINAPI IOW_fnAddRef(IOleWindow *iface)
{
NSTC2Impl *This = impl_from_IOleWindow(iface);
TRACE("%p\n", This);
return NSTC2_fnAddRef((INameSpaceTreeControl2*)This);
}
static ULONG WINAPI IOW_fnRelease(IOleWindow *iface)
{
NSTC2Impl *This = impl_from_IOleWindow(iface);
TRACE("%p\n", This);
return NSTC2_fnRelease((INameSpaceTreeControl2*)This);
}
static HRESULT WINAPI IOW_fnGetWindow(IOleWindow *iface, HWND *phwnd)
{
NSTC2Impl *This = impl_from_IOleWindow(iface);
TRACE("%p (%p)\n", This, phwnd);
*phwnd = This->hwnd_main;
return S_OK;
}
static HRESULT WINAPI IOW_fnContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode)
{
NSTC2Impl *This = impl_from_IOleWindow(iface);
TRACE("%p (%d)\n", This, fEnterMode);
/* Not implemented */
return E_NOTIMPL;
}
static const IOleWindowVtbl vt_IOleWindow = {
IOW_fnQueryInterface,
IOW_fnAddRef,
IOW_fnRelease,
IOW_fnGetWindow,
IOW_fnContextSensitiveHelp
};
HRESULT NamespaceTreeControl_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
{
NSTC2Impl *nstc;
@ -548,6 +609,7 @@ HRESULT NamespaceTreeControl_Constructor(IUnknown *pUnkOuter, REFIID riid, void
nstc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NSTC2Impl));
nstc->ref = 1;
nstc->lpVtbl = &vt_INameSpaceTreeControl2;
nstc->lpowVtbl = &vt_IOleWindow;
ret = INameSpaceTreeControl_QueryInterface((INameSpaceTreeControl*)nstc, riid, ppv);
INameSpaceTreeControl_Release((INameSpaceTreeControl*)nstc);

View File

@ -34,7 +34,9 @@ static HWND hwnd;
static BOOL test_initialization(void)
{
INameSpaceTreeControl *pnstc;
IOleWindow *pow;
IUnknown *punk;
HWND hwnd_host1;
LONG lres;
HRESULT hr;
RECT rc;
@ -60,8 +62,89 @@ static BOOL test_initialization(void)
hr = INameSpaceTreeControl_Initialize(pnstc, (HWND)0xDEADBEEF, &rc, 0);
ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE), "Got (0x%08x)\n", hr);
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow);
ok(hr == S_OK, "Got (0x%08x)\n", hr);
if(SUCCEEDED(hr))
{
hr = IOleWindow_GetWindow(pow, &hwnd_host1);
ok(hr == S_OK, "Got (0x%08x)\n", hr);
ok(hwnd_host1 == NULL, "hwnd is not null.\n");
hr = IOleWindow_ContextSensitiveHelp(pow, TRUE);
ok(hr == E_NOTIMPL, "Got (0x%08x)\n", hr);
hr = IOleWindow_ContextSensitiveHelp(pow, FALSE);
ok(hr == E_NOTIMPL, "Got (0x%08x)\n", hr);
IOleWindow_Release(pow);
}
hr = INameSpaceTreeControl_Initialize(pnstc, hwnd, NULL, 0);
ok(hr == S_OK, "Got (0x%08x)\n", hr);
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow);
ok(hr == S_OK, "Got 0x%08x\n", hr);
if(SUCCEEDED(hr))
{
static const CHAR namespacetree[] = "NamespaceTreeControl";
char buf[1024];
LONG style, expected_style;
HWND hwnd_tv;
hr = IOleWindow_GetWindow(pow, &hwnd_host1);
ok(hr == S_OK, "Got (0x%08x)\n", hr);
ok(hwnd_host1 != NULL, "hwnd_host1 is null.\n");
buf[0] = '\0';
GetClassNameA(hwnd_host1, buf, 1024);
ok(!lstrcmpA(namespacetree, buf), "Class name was %s\n", buf);
expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
style = GetWindowLongPtrW(hwnd_host1, GWL_STYLE);
ok(style == expected_style, "Got style %08x\n", style);
expected_style = 0;
style = GetWindowLongPtrW(hwnd_host1, GWL_EXSTYLE);
ok(style == expected_style, "Got style %08x\n", style);
expected_style = 0;
style = SendMessageW(hwnd_host1, TVM_GETEXTENDEDSTYLE, 0, 0);
ok(style == expected_style, "Got 0x%08x\n", style);
hwnd_tv = FindWindowExW(hwnd_host1, NULL, WC_TREEVIEWW, NULL);
ok(hwnd_tv != NULL, "Failed to get treeview hwnd.\n");
if(hwnd_tv)
{
expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | WS_TABSTOP | TVS_NOHSCROLL |
TVS_NONEVENHEIGHT | TVS_INFOTIP | TVS_TRACKSELECT | TVS_EDITLABELS;
style = GetWindowLongPtrW(hwnd_tv, GWL_STYLE);
ok(style == expected_style, "Got style %08x\n", style);
expected_style = 0;
style = GetWindowLongPtrW(hwnd_tv, GWL_EXSTYLE);
ok(style == expected_style, "Got style %08x\n", style);
expected_style = TVS_EX_NOSINGLECOLLAPSE | TVS_EX_DOUBLEBUFFER |
TVS_EX_RICHTOOLTIP | TVS_EX_DRAWIMAGEASYNC;
style = SendMessageW(hwnd_tv, TVM_GETEXTENDEDSTYLE, 0, 0);
todo_wine ok(style == expected_style, "Got 0x%08x\n", style);
}
IOleWindow_Release(pow);
}
if(0)
{
/* The control can be initialized again without crashing, but
* the reference counting will break. */
hr = INameSpaceTreeControl_Initialize(pnstc, hwnd, &rc, 0);
ok(hr == S_OK, "Got (0x%08x)\n", hr);
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow);
if(SUCCEEDED(hr))
{
HWND hwnd_host2;
hr = IOleWindow_GetWindow(pow, &hwnd_host2);
ok(hr == S_OK, "Got (0x%08x)\n", hr);
ok(hwnd_host1 != hwnd_host2, "Same hwnd.\n");
IOleWindow_Release(pow);
}
}
/* Some "random" interfaces */
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceObject, (void**)&punk);
@ -87,8 +170,13 @@ static BOOL test_initialization(void)
/* On windows, the reference count won't go to zero until the
* window is destroyed. */
INameSpaceTreeControl_AddRef(pnstc);
lres = INameSpaceTreeControl_Release(pnstc);
ok(lres, "lres was %d\n", lres);
ok(lres > 1, "Reference count was (%d).\n", lres);
DestroyWindow(hwnd_host1);
lres = INameSpaceTreeControl_Release(pnstc);
ok(!lres, "lres was %d\n", lres);
return TRUE;
}