explorerframe: Implement GetSelectedItems.
This commit is contained in:
parent
29bf096f27
commit
20872fadce
|
@ -1212,8 +1212,17 @@ static HRESULT WINAPI NSTC2_fnGetSelectedItems(INameSpaceTreeControl2* iface,
|
||||||
IShellItemArray **psiaItems)
|
IShellItemArray **psiaItems)
|
||||||
{
|
{
|
||||||
NSTC2Impl *This = (NSTC2Impl*)iface;
|
NSTC2Impl *This = (NSTC2Impl*)iface;
|
||||||
FIXME("stub, %p (%p)\n", This, psiaItems);
|
IShellItem *psiselected;
|
||||||
return E_NOTIMPL;
|
HRESULT hr;
|
||||||
|
TRACE("%p (%p)\n", This, psiaItems);
|
||||||
|
|
||||||
|
psiselected = get_selected_shellitem(This);
|
||||||
|
if(!psiselected)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
hr = SHCreateShellItemArrayFromShellItem(psiselected, &IID_IShellItemArray,
|
||||||
|
(void**)psiaItems);
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI NSTC2_fnGetItemCustomState(INameSpaceTreeControl2* iface,
|
static HRESULT WINAPI NSTC2_fnGetItemCustomState(INameSpaceTreeControl2* iface,
|
||||||
|
|
|
@ -723,10 +723,12 @@ static void test_basics(void)
|
||||||
INameSpaceTreeControl2 *pnstc2;
|
INameSpaceTreeControl2 *pnstc2;
|
||||||
IShellItemArray *psia;
|
IShellItemArray *psia;
|
||||||
IShellFolder *psfdesktop;
|
IShellFolder *psfdesktop;
|
||||||
|
IShellItem *psi;
|
||||||
IShellItem *psidesktop, *psidesktop2;
|
IShellItem *psidesktop, *psidesktop2;
|
||||||
IShellItem *psitestdir, *psitestdir2;
|
IShellItem *psitestdir, *psitestdir2, *psitest1;
|
||||||
IOleWindow *pow;
|
IOleWindow *pow;
|
||||||
LPITEMIDLIST pidl_desktop;
|
LPITEMIDLIST pidl_desktop;
|
||||||
|
NSTCITEMSTATE istate;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
UINT i, res;
|
UINT i, res;
|
||||||
RECT rc;
|
RECT rc;
|
||||||
|
@ -736,9 +738,12 @@ static void test_basics(void)
|
||||||
static const WCHAR testdirW[] = {'t','e','s','t','d','i','r',0};
|
static const WCHAR testdirW[] = {'t','e','s','t','d','i','r',0};
|
||||||
static const WCHAR testdir2W[] =
|
static const WCHAR testdir2W[] =
|
||||||
{'t','e','s','t','d','i','r','\\','t','e','s','t','d','i','r','2',0};
|
{'t','e','s','t','d','i','r','\\','t','e','s','t','d','i','r','2',0};
|
||||||
|
static const WCHAR test1W[] =
|
||||||
|
{'t','e','s','t','d','i','r','\\','t','e','s','t','1','.','t','x','t',0};
|
||||||
|
|
||||||
/* These should exist on platforms supporting the NSTC */
|
/* These should exist on platforms supporting the NSTC */
|
||||||
ok(pSHCreateShellItem != NULL, "No SHCreateShellItem.\n");
|
ok(pSHCreateShellItem != NULL, "No SHCreateShellItem.\n");
|
||||||
|
ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n");
|
||||||
ok(pSHGetIDListFromObject != NULL, "No SHCreateShellItem.\n");
|
ok(pSHGetIDListFromObject != NULL, "No SHCreateShellItem.\n");
|
||||||
ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n");
|
ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n");
|
||||||
|
|
||||||
|
@ -783,6 +788,12 @@ static void test_basics(void)
|
||||||
hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitestdir2);
|
hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitestdir2);
|
||||||
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
if(FAILED(hr)) goto cleanup;
|
if(FAILED(hr)) goto cleanup;
|
||||||
|
lstrcpyW(buf, curdirW);
|
||||||
|
myPathAddBackslashW(buf);
|
||||||
|
lstrcatW(buf, test1W);
|
||||||
|
hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitest1);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(FAILED(hr)) goto cleanup;
|
||||||
|
|
||||||
hr = CoCreateInstance(&CLSID_NamespaceTreeControl, NULL, CLSCTX_INPROC_SERVER,
|
hr = CoCreateInstance(&CLSID_NamespaceTreeControl, NULL, CLSCTX_INPROC_SERVER,
|
||||||
&IID_INameSpaceTreeControl, (void**)&pnstc);
|
&IID_INameSpaceTreeControl, (void**)&pnstc);
|
||||||
|
@ -1296,10 +1307,200 @@ static void test_basics(void)
|
||||||
ok(hr == S_OK, "Got (0x%08x)\n", hr);
|
ok(hr == S_OK, "Got (0x%08x)\n", hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* GetSelectedItems */
|
||||||
|
if(0)
|
||||||
|
{
|
||||||
|
/* Crashes under Windows 7 */
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
psia = (void*)0xdeadbeef;
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
ok(hr == E_FAIL, "Got 0x%08x\n", hr);
|
||||||
|
ok(psia == (void*)0xdeadbeef, "Got %p", psia);
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir2, SHCONTF_FOLDERS, 0, NULL);
|
||||||
|
ok(hr == S_OK, "Got (0x%08x)\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, SHCONTF_FOLDERS, 0, NULL);
|
||||||
|
ok(hr == S_OK, "Got (0x%08x)\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_SetItemState(pnstc, psitestdir,
|
||||||
|
NSTCIS_SELECTED, NSTCIS_SELECTED);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
UINT count;
|
||||||
|
hr = IShellItemArray_GetCount(psia, &count);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(count == 1, "Got %d selected items.\n", count);
|
||||||
|
if(count)
|
||||||
|
{
|
||||||
|
hr = IShellItemArray_GetItemAt(psia, 0, &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);
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IShellItemArray_Release(psia);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_SetItemState(pnstc, psitestdir2,
|
||||||
|
NSTCIS_SELECTED, NSTCIS_SELECTED);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
UINT count;
|
||||||
|
hr = IShellItemArray_GetCount(psia, &count);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(count == 1, "Got %d selected items.\n", count);
|
||||||
|
if(count)
|
||||||
|
{
|
||||||
|
hr = IShellItemArray_GetItemAt(psia, 0, &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);
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IShellItemArray_Release(psia);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_SetItemState(pnstc, psitest1,
|
||||||
|
NSTCIS_SELECTED, NSTCIS_SELECTED);
|
||||||
|
todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
UINT count;
|
||||||
|
hr = IShellItemArray_GetCount(psia, &count);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(count == 1, "Got %d selected items.\n", count);
|
||||||
|
if(count)
|
||||||
|
{
|
||||||
|
hr = IShellItemArray_GetItemAt(psia, 0, &psi);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
int cmp;
|
||||||
|
hr = IShellItem_Compare(psi, psitest1, SICHINT_DISPLAY, &cmp);
|
||||||
|
todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IShellItemArray_Release(psia);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_RemoveAllRoots(pnstc);
|
||||||
|
ok(hr == S_OK || broken(hr == E_FAIL), "Got 0x%08x\n", hr);
|
||||||
|
if(hr == E_FAIL)
|
||||||
|
{
|
||||||
|
/* For some reason, Vista fails to properly remove both the
|
||||||
|
* roots here on the first try. */
|
||||||
|
hr = INameSpaceTreeControl_RemoveAllRoots(pnstc);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adding without NSTCRS_EXPANDED does not set the selection */
|
||||||
|
hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir,
|
||||||
|
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
|
||||||
|
0, NULL);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_GetItemState(pnstc, psitestdir, 0xFF, &istate);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(!(istate & NSTCIS_SELECTED), "Got 0x%08x\n", istate);
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
ok(hr == E_FAIL, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr)) IShellItemArray_Release(psia);
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_RemoveAllRoots(pnstc);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
/* Adding with NSTCRS_EXPANDED sets the selection */
|
||||||
|
hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir,
|
||||||
|
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
|
||||||
|
NSTCRS_EXPANDED, NULL);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_GetItemState(pnstc, psitestdir, 0xFF, &istate);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
todo_wine ok(istate & NSTCIS_SELECTED, "Got 0x%08x\n", istate);
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
IShellItem *psi;
|
||||||
|
|
||||||
|
hr = IShellItemArray_GetItemAt(psia, 0, &psi);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
INT cmp;
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
|
||||||
|
IShellItemArray_Release(psia);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adding a second root with NSTCRS_EXPANDED does not change the selection */
|
||||||
|
hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir2,
|
||||||
|
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
|
||||||
|
NSTCRS_EXPANDED, NULL);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
process_msgs();
|
||||||
|
|
||||||
|
hr = INameSpaceTreeControl_GetItemState(pnstc, psitestdir2, 0xFF, &istate);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
ok(!(istate & NSTCIS_SELECTED), "Got 0x%08x\n", istate);
|
||||||
|
hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia);
|
||||||
|
todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
IShellItem *psi;
|
||||||
|
|
||||||
|
hr = IShellItemArray_GetItemAt(psia, 0, &psi);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
INT cmp;
|
||||||
|
hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp);
|
||||||
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
IShellItem_Release(psi);
|
||||||
|
}
|
||||||
|
|
||||||
|
IShellItemArray_Release(psia);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
IShellItem_Release(psitestdir2);
|
IShellItem_Release(psitestdir2);
|
||||||
|
IShellItem_Release(psitest1);
|
||||||
|
|
||||||
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow);
|
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow);
|
||||||
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
Loading…
Reference in New Issue