[PATCH 6/6] explorerframe: Implement GetSelectedItems.
David Hedberg
david.hedberg at gmail.com
Wed Aug 18 00:08:15 CDT 2010
---
dlls/explorerframe/nstc.c | 13 ++-
dlls/explorerframe/tests/nstc.c | 203 ++++++++++++++++++++++++++++++++++++++-
2 files changed, 213 insertions(+), 3 deletions(-)
diff --git a/dlls/explorerframe/nstc.c b/dlls/explorerframe/nstc.c
index 28029e5..4269b73 100644
--- a/dlls/explorerframe/nstc.c
+++ b/dlls/explorerframe/nstc.c
@@ -1212,8 +1212,17 @@ static HRESULT WINAPI NSTC2_fnGetSelectedItems(INameSpaceTreeControl2* iface,
IShellItemArray **psiaItems)
{
NSTC2Impl *This = (NSTC2Impl*)iface;
- FIXME("stub, %p (%p)\n", This, psiaItems);
- return E_NOTIMPL;
+ IShellItem *psiselected;
+ 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,
diff --git a/dlls/explorerframe/tests/nstc.c b/dlls/explorerframe/tests/nstc.c
index 89ed1e0..d05db8e 100644
--- a/dlls/explorerframe/tests/nstc.c
+++ b/dlls/explorerframe/tests/nstc.c
@@ -723,10 +723,12 @@ static void test_basics(void)
INameSpaceTreeControl2 *pnstc2;
IShellItemArray *psia;
IShellFolder *psfdesktop;
+ IShellItem *psi;
IShellItem *psidesktop, *psidesktop2;
- IShellItem *psitestdir, *psitestdir2;
+ IShellItem *psitestdir, *psitestdir2, *psitest1;
IOleWindow *pow;
LPITEMIDLIST pidl_desktop;
+ NSTCITEMSTATE istate;
HRESULT hr;
UINT i, res;
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 testdir2W[] =
{'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 */
ok(pSHCreateShellItem != NULL, "No SHCreateShellItem.\n");
+ ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n");
ok(pSHGetIDListFromObject != NULL, "No SHCreateShellItem.\n");
ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n");
@@ -783,6 +788,12 @@ static void test_basics(void)
hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitestdir2);
ok(hr == S_OK, "Got 0x%08x\n", hr);
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,
&IID_INameSpaceTreeControl, (void**)&pnstc);
@@ -1296,10 +1307,200 @@ static void test_basics(void)
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(psidesktop2);
IShellItem_Release(psitestdir);
IShellItem_Release(psitestdir2);
+ IShellItem_Release(psitest1);
hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow);
ok(hr == S_OK, "Got 0x%08x\n", hr);
--
1.7.2
More information about the wine-patches
mailing list