Module: wine Branch: master Commit: b431995cc45eb5f4e9002ef074ba2dfa97852851 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b431995cc45eb5f4e9002ef074...
Author: David Hedberg david.hedberg@gmail.com Date: Wed Aug 4 03:57:49 2010 +0200
explorerframe: Implement RemoveRoot and RemoveAllRoots.
---
dlls/explorerframe/nstc.c | 75 ++++++++++++++++++++++++++++++++++++-- dlls/explorerframe/tests/nstc.c | 29 +++++++++++++++ 2 files changed, 100 insertions(+), 4 deletions(-)
diff --git a/dlls/explorerframe/nstc.c b/dlls/explorerframe/nstc.c index 9116f66..e5d3913 100644 --- a/dlls/explorerframe/nstc.c +++ b/dlls/explorerframe/nstc.c @@ -99,6 +99,19 @@ static HRESULT events_OnItemAdded(NSTC2Impl *This, IShellItem *psi, BOOL fIsRoot return ret; }
+static HRESULT events_OnItemDeleted(NSTC2Impl *This, IShellItem *psi, BOOL fIsRoot) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return S_OK; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnItemDeleted(This->pnstce, psi, fIsRoot); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + /************************************************************************* * NamespaceTree helper functions */ @@ -270,11 +283,22 @@ static LRESULT destroy_namespacetree(NSTC2Impl *This) { TRACE("%p\n", This);
+ INameSpaceTreeControl_RemoveAllRoots((INameSpaceTreeControl*)This); + /* This reference was added in create_namespacetree */ INameSpaceTreeControl_Release((INameSpaceTreeControl*)This); return TRUE; }
+static LRESULT on_tvn_deleteitemw(NSTC2Impl *This, LPARAM lParam) +{ + NMTREEVIEWW *nmtv = (NMTREEVIEWW*)lParam; + TRACE("%p\n", This); + + IShellItem_Release((IShellItem*)nmtv->itemOld.lParam); + return TRUE; +} + static LRESULT on_tvn_getdispinfow(NSTC2Impl *This, LPARAM lParam) { NMTVDISPINFOW *dispinfo = (NMTVDISPINFOW*)lParam; @@ -349,6 +373,7 @@ static LRESULT CALLBACK NSTC2_WndProc(HWND hWnd, UINT uMessage, nmhdr = (NMHDR*)lParam; switch(nmhdr->code) { + case TVN_DELETEITEMW: return on_tvn_deleteitemw(This, lParam); case TVN_GETDISPINFOW: return on_tvn_getdispinfow(This, lParam); default: break; } @@ -601,15 +626,57 @@ static HRESULT WINAPI NSTC2_fnRemoveRoot(INameSpaceTreeControl2* iface, IShellItem *psiRoot) { NSTC2Impl *This = (NSTC2Impl*)iface; - FIXME("stub, %p (%p)\n", This, psiRoot); - return E_NOTIMPL; + nstc_root *cursor, *root = NULL; + TRACE("%p (%p)\n", This, psiRoot); + + if(!psiRoot) + return E_NOINTERFACE; + + LIST_FOR_EACH_ENTRY(cursor, &This->roots, nstc_root, entry) + { + HRESULT hr; + int order; + hr = IShellItem_Compare(psiRoot, cursor->psi, SICHINT_DISPLAY, &order); + if(hr == S_OK) + { + root = cursor; + break; + } + } + + TRACE("root %p\n", root); + if(root) + { + SendMessageW(This->hwnd_tv, TVM_DELETEITEM, 0, (LPARAM)root->htreeitem); + events_OnItemDeleted(This, root->psi, TRUE); + list_remove(&root->entry); + HeapFree(GetProcessHeap(), 0, root); + return S_OK; + } + else + { + WARN("No matching root found.\n"); + return E_FAIL; + } }
static HRESULT WINAPI NSTC2_fnRemoveAllRoots(INameSpaceTreeControl2* iface) { NSTC2Impl *This = (NSTC2Impl*)iface; - FIXME("stub, %p\n", This); - return E_NOTIMPL; + nstc_root *cur1, *cur2; + UINT removed = 0; + TRACE("%p\n", This); + + LIST_FOR_EACH_ENTRY_SAFE(cur1, cur2, &This->roots, nstc_root, entry) + { + NSTC2_fnRemoveRoot(iface, cur1->psi); + removed++; + } + + if(removed) + return S_OK; + else + return E_INVALIDARG; }
static HRESULT WINAPI NSTC2_fnGetRootItems(INameSpaceTreeControl2* iface, diff --git a/dlls/explorerframe/tests/nstc.c b/dlls/explorerframe/tests/nstc.c index 2f8caa0..f51698c 100644 --- a/dlls/explorerframe/tests/nstc.c +++ b/dlls/explorerframe/tests/nstc.c @@ -541,6 +541,12 @@ static void test_basics(void) ok(hr == S_OK, "Failed to initialize control (0x%08x)\n", hr);
/* Some tests on an uninitialized control */ + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, NULL); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_NONFOLDERS, 0, NULL); ok(hr == E_FAIL, "Got (0x%08x)\n", hr); process_msgs(); @@ -763,6 +769,9 @@ static void test_basics(void) skip("INameSpaceTreeControl2 missing.\n"); }
+ hr = INameSpaceTreeControl_RemoveRoot(pnstc, NULL); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + /* Append / Insert root */ if(0) { @@ -780,6 +789,23 @@ static void test_basics(void) ok(hr == S_OK, "Got (0x%08x)\n", hr); process_msgs();
+ hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_InsertRoot(pnstc, 0, psidesktop, SHCONTF_FOLDERS, 0, NULL); ok(hr == S_OK, "Got (0x%08x)\n", hr); hr = INameSpaceTreeControl_InsertRoot(pnstc, -1, psidesktop, SHCONTF_FOLDERS, 0, NULL); @@ -791,6 +817,9 @@ static void test_basics(void) hr = INameSpaceTreeControl_InsertRoot(pnstc, 1, psidesktop, SHCONTF_FOLDERS, 0, NULL); ok(hr == S_OK, "Got (0x%08x)\n", hr);
+ hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + IShellItem_Release(psidesktop); IShellItem_Release(psidesktop2);