Module: wine Branch: master Commit: 29bf096f276bf478c166bda3b03b54eb626d7dea URL: http://source.winehq.org/git/wine.git/?a=commit;h=29bf096f276bf478c166bda3b0...
Author: David Hedberg david.hedberg@gmail.com Date: Wed Aug 18 07:08:14 2010 +0200
explorerframe: Implement GetNextItem.
---
dlls/explorerframe/nstc.c | 39 ++++++++++++++++++++++++++- dlls/explorerframe/tests/nstc.c | 54 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 2 deletions(-)
diff --git a/dlls/explorerframe/nstc.c b/dlls/explorerframe/nstc.c index c993b08..28029e5 100644 --- a/dlls/explorerframe/nstc.c +++ b/dlls/explorerframe/nstc.c @@ -1256,8 +1256,43 @@ static HRESULT WINAPI NSTC2_fnGetNextItem(INameSpaceTreeControl2* iface, IShellItem **ppsiNext) { NSTC2Impl *This = (NSTC2Impl*)iface; - FIXME("stub, %p (%p, %x, %p)\n", This, psi, nstcgi, ppsiNext); - return E_NOTIMPL; + HTREEITEM hitem, hnext; + UINT tvgn; + TRACE("%p (%p, %x, %p)\n", This, psi, nstcgi, ppsiNext); + + if(!ppsiNext) return E_POINTER; + if(!psi) return E_FAIL; + + *ppsiNext = NULL; + + hitem = treeitem_from_shellitem(This, psi); + if(!hitem) + return E_INVALIDARG; + + switch(nstcgi) + { + case NSTCGNI_NEXT: tvgn = TVGN_NEXT; break; + case NSTCGNI_NEXTVISIBLE: tvgn = TVGN_NEXTVISIBLE; break; + case NSTCGNI_PREV: tvgn = TVGN_PREVIOUS; break; + case NSTCGNI_PREVVISIBLE: tvgn = TVGN_PREVIOUSVISIBLE; break; + case NSTCGNI_PARENT: tvgn = TVGN_PARENT; break; + case NSTCGNI_CHILD: tvgn = TVGN_CHILD; break; + case NSTCGNI_FIRSTVISIBLE: tvgn = TVGN_FIRSTVISIBLE; break; + case NSTCGNI_LASTVISIBLE: tvgn = TVGN_LASTVISIBLE; break; + default: + FIXME("Unknown nstcgi value %d\n", nstcgi); + return E_FAIL; + } + + hnext = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, tvgn, (WPARAM)hitem); + if(hnext) + { + *ppsiNext = shellitem_from_treeitem(This, hnext); + IShellItem_AddRef(*ppsiNext); + return S_OK; + } + + return E_FAIL; }
static HRESULT WINAPI NSTC2_fnHitTest(INameSpaceTreeControl2* iface, diff --git a/dlls/explorerframe/tests/nstc.c b/dlls/explorerframe/tests/nstc.c index 5d650a9..89ed1e0 100644 --- a/dlls/explorerframe/tests/nstc.c +++ b/dlls/explorerframe/tests/nstc.c @@ -1329,6 +1329,7 @@ static void test_events(void) IOleWindow *pow; LPITEMIDLIST pidl_desktop; NSTCITEMSTATE itemstate; + IShellItem *psi; DWORD cookie1, cookie2; HWND hwnd_tv; HRESULT hr; @@ -1797,6 +1798,59 @@ static void test_events(void) ok_event_count(pnstceimpl, OnItemDeleted, 1); ok_no_events(pnstceimpl);
+ /* GetNextItem */ + hr = INameSpaceTreeControl_GetNextItem(pnstc, NULL, 0, NULL); + ok(hr == E_POINTER, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, 0, NULL); + ok(hr == E_POINTER, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetNextItem(pnstc, NULL, 0, &psi); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, 0, &psi); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_no_events(pnstceimpl); + + /* Get child from unexpanded and unfilled parent */ + psi = (void*)0xDEADBEEF; + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, NSTCGNI_CHILD, &psi); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok(psi == NULL, "psi is %p\n", psi); + process_msgs(); + ok_no_events(pnstceimpl); + + /* Expand and try again */ + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, NSTCIS_EXPANDED, 0xffff); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count(pnstceimpl, OnBeforeExpand, 1); + ok_event_broken(pnstceimpl, OnItemAdded); /* Does not fire on Vista */ + ok_event_count(pnstceimpl, OnAfterExpand, 1); + todo_wine ok_event_count_broken(pnstceimpl, OnSelectionChanged, 1, 0 /*Vista */); + ok_no_events(pnstceimpl); + psi = (void*)0xDEADBEEF; + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, NSTCGNI_CHILD, &psi); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok((psi != NULL) && (psi != (void*)0xDEADBEEF), "psi is %p\n", psi); + process_msgs(); + ok_no_events(pnstceimpl); + if(SUCCEEDED(hr)) IShellItem_Release(psi); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_event_count(pnstceimpl, OnItemDeleted, 1); + ok_no_events(pnstceimpl); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); ok(hr == S_OK, "Got 0x%08x\n", hr); if(SUCCEEDED(hr))