explorerframe: Implement HitTest.
This commit is contained in:
parent
193fe3c303
commit
6923ec2708
|
@ -422,6 +422,18 @@ static void collapse_all(NSTC2Impl *This, HTREEITEM node)
|
||||||
if(next) collapse_all(This, next);
|
if(next) collapse_all(This, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HTREEITEM treeitem_from_point(NSTC2Impl *This, POINT *pt, UINT *hitflag)
|
||||||
|
{
|
||||||
|
TVHITTESTINFO tviht;
|
||||||
|
tviht.pt.x = pt->x;
|
||||||
|
tviht.pt.y = pt->y;
|
||||||
|
tviht.hItem = NULL;
|
||||||
|
|
||||||
|
SendMessageW(This->hwnd_tv, TVM_HITTEST, 0, (LPARAM)&tviht);
|
||||||
|
if(hitflag) *hitflag = tviht.flags;
|
||||||
|
return tviht.hItem;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* NamespaceTree window functions
|
* NamespaceTree window functions
|
||||||
*/
|
*/
|
||||||
|
@ -1309,8 +1321,25 @@ static HRESULT WINAPI NSTC2_fnHitTest(INameSpaceTreeControl2* iface,
|
||||||
IShellItem **ppsiOut)
|
IShellItem **ppsiOut)
|
||||||
{
|
{
|
||||||
NSTC2Impl *This = (NSTC2Impl*)iface;
|
NSTC2Impl *This = (NSTC2Impl*)iface;
|
||||||
FIXME("stub, %p (%p, %p)\n", This, ppsiOut, ppt);
|
HTREEITEM hitem;
|
||||||
return E_NOTIMPL;
|
TRACE("%p (%p, %p)\n", This, ppsiOut, ppt);
|
||||||
|
|
||||||
|
if(!ppt || !ppsiOut)
|
||||||
|
return E_POINTER;
|
||||||
|
|
||||||
|
*ppsiOut = NULL;
|
||||||
|
|
||||||
|
hitem = treeitem_from_point(This, ppt, NULL);
|
||||||
|
if(hitem)
|
||||||
|
*ppsiOut = shellitem_from_treeitem(This, hitem);
|
||||||
|
|
||||||
|
if(*ppsiOut)
|
||||||
|
{
|
||||||
|
IShellItem_AddRef(*ppsiOut);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI NSTC2_fnGetItemRect(INameSpaceTreeControl2* iface,
|
static HRESULT WINAPI NSTC2_fnGetItemRect(INameSpaceTreeControl2* iface,
|
||||||
|
|
|
@ -734,6 +734,7 @@ static void test_basics(void)
|
||||||
HWND hwnd_tv;
|
HWND hwnd_tv;
|
||||||
RECT rc;
|
RECT rc;
|
||||||
IShellItem *roots[10];
|
IShellItem *roots[10];
|
||||||
|
POINT pt;
|
||||||
WCHAR curdirW[MAX_PATH];
|
WCHAR curdirW[MAX_PATH];
|
||||||
WCHAR buf[MAX_PATH];
|
WCHAR buf[MAX_PATH];
|
||||||
static const WCHAR testdirW[] = {'t','e','s','t','d','i','r',0};
|
static const WCHAR testdirW[] = {'t','e','s','t','d','i','r',0};
|
||||||
|
@ -1555,6 +1556,89 @@ static void test_basics(void)
|
||||||
hr = INameSpaceTreeControl_RemoveAllRoots(pnstc);
|
hr = INameSpaceTreeControl_RemoveAllRoots(pnstc);
|
||||||
ok(hr == S_OK, "Got (0x%08x)\n", hr);
|
ok(hr == S_OK, "Got (0x%08x)\n", hr);
|
||||||
|
|
||||||
|
/* HitTest */
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, NULL, NULL);
|
||||||
|
ok(hr == E_POINTER, "Got 0x%08x\n", hr);
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, &pt, NULL);
|
||||||
|
ok(hr == E_POINTER, "Got 0x%08x\n", hr);
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, NULL, &psi);
|
||||||
|
ok(hr == E_POINTER, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
psi = (void*)0xdeadbeef;
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi);
|
||||||
|
ok(hr == S_FALSE, "Got 0x%08x\n", hr);
|
||||||
|
ok(psi == NULL, "Got psi %p\n", psi);
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir,
|
||||||
|
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
|
||||||
|
NSTCRS_EXPANDED, NULL);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
pt.x = pt.y = 0;
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
int cmp;
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(!cmp, "Got cmp %d\n", cmp);
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.y += height - 1;
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
int cmp;
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(!cmp, "Got cmp %d\n", cmp);
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.y += 1;
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
int cmp;
|
||||||
|
todo_wine
|
||||||
|
{
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_FALSE, "Got 0x%08x\n", hr);
|
||||||
|
ok(cmp, "no cmp value.\n");
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir2, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(!cmp, "Got cmp %d\n", cmp);
|
||||||
|
}
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_GetItemRect(pnstc, psitestdir2, &rc);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
MapWindowPoints(NULL, hwnd, (POINT*)&rc, 2);
|
||||||
|
pt.x = rc.left; pt.y = rc.top;
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
int cmp;
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir2, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(!cmp, "Got cmp %d\n", cmp);
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_RemoveAllRoots(pnstc);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
IShellItem_Release(psidesktop);
|
IShellItem_Release(psidesktop);
|
||||||
IShellItem_Release(psidesktop2);
|
IShellItem_Release(psidesktop2);
|
||||||
IShellItem_Release(psitestdir);
|
IShellItem_Release(psitestdir);
|
||||||
|
|
Loading…
Reference in New Issue