Commit b431995c authored by David Hedberg's avatar David Hedberg Committed by Alexandre Julliard

explorerframe: Implement RemoveRoot and RemoveAllRoots.

parent 658ec55a
...@@ -99,6 +99,19 @@ static HRESULT events_OnItemAdded(NSTC2Impl *This, IShellItem *psi, BOOL fIsRoot ...@@ -99,6 +99,19 @@ static HRESULT events_OnItemAdded(NSTC2Impl *This, IShellItem *psi, BOOL fIsRoot
return ret; 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 * NamespaceTree helper functions
*/ */
...@@ -270,11 +283,22 @@ static LRESULT destroy_namespacetree(NSTC2Impl *This) ...@@ -270,11 +283,22 @@ static LRESULT destroy_namespacetree(NSTC2Impl *This)
{ {
TRACE("%p\n", This); TRACE("%p\n", This);
INameSpaceTreeControl_RemoveAllRoots((INameSpaceTreeControl*)This);
/* This reference was added in create_namespacetree */ /* This reference was added in create_namespacetree */
INameSpaceTreeControl_Release((INameSpaceTreeControl*)This); INameSpaceTreeControl_Release((INameSpaceTreeControl*)This);
return TRUE; 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) static LRESULT on_tvn_getdispinfow(NSTC2Impl *This, LPARAM lParam)
{ {
NMTVDISPINFOW *dispinfo = (NMTVDISPINFOW*)lParam; NMTVDISPINFOW *dispinfo = (NMTVDISPINFOW*)lParam;
...@@ -349,6 +373,7 @@ static LRESULT CALLBACK NSTC2_WndProc(HWND hWnd, UINT uMessage, ...@@ -349,6 +373,7 @@ static LRESULT CALLBACK NSTC2_WndProc(HWND hWnd, UINT uMessage,
nmhdr = (NMHDR*)lParam; nmhdr = (NMHDR*)lParam;
switch(nmhdr->code) switch(nmhdr->code)
{ {
case TVN_DELETEITEMW: return on_tvn_deleteitemw(This, lParam);
case TVN_GETDISPINFOW: return on_tvn_getdispinfow(This, lParam); case TVN_GETDISPINFOW: return on_tvn_getdispinfow(This, lParam);
default: break; default: break;
} }
...@@ -601,15 +626,57 @@ static HRESULT WINAPI NSTC2_fnRemoveRoot(INameSpaceTreeControl2* iface, ...@@ -601,15 +626,57 @@ static HRESULT WINAPI NSTC2_fnRemoveRoot(INameSpaceTreeControl2* iface,
IShellItem *psiRoot) IShellItem *psiRoot)
{ {
NSTC2Impl *This = (NSTC2Impl*)iface; NSTC2Impl *This = (NSTC2Impl*)iface;
FIXME("stub, %p (%p)\n", This, psiRoot); nstc_root *cursor, *root = NULL;
return E_NOTIMPL; 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) static HRESULT WINAPI NSTC2_fnRemoveAllRoots(INameSpaceTreeControl2* iface)
{ {
NSTC2Impl *This = (NSTC2Impl*)iface; NSTC2Impl *This = (NSTC2Impl*)iface;
FIXME("stub, %p\n", This); nstc_root *cur1, *cur2;
return E_NOTIMPL; 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, static HRESULT WINAPI NSTC2_fnGetRootItems(INameSpaceTreeControl2* iface,
......
...@@ -541,6 +541,12 @@ static void test_basics(void) ...@@ -541,6 +541,12 @@ static void test_basics(void)
ok(hr == S_OK, "Failed to initialize control (0x%08x)\n", hr); ok(hr == S_OK, "Failed to initialize control (0x%08x)\n", hr);
/* Some tests on an uninitialized control */ /* 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); hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_NONFOLDERS, 0, NULL);
ok(hr == E_FAIL, "Got (0x%08x)\n", hr); ok(hr == E_FAIL, "Got (0x%08x)\n", hr);
process_msgs(); process_msgs();
...@@ -763,6 +769,9 @@ static void test_basics(void) ...@@ -763,6 +769,9 @@ static void test_basics(void)
skip("INameSpaceTreeControl2 missing.\n"); skip("INameSpaceTreeControl2 missing.\n");
} }
hr = INameSpaceTreeControl_RemoveRoot(pnstc, NULL);
ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr);
/* Append / Insert root */ /* Append / Insert root */
if(0) if(0)
{ {
...@@ -780,6 +789,23 @@ static void test_basics(void) ...@@ -780,6 +789,23 @@ static void test_basics(void)
ok(hr == S_OK, "Got (0x%08x)\n", hr); ok(hr == S_OK, "Got (0x%08x)\n", hr);
process_msgs(); 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); hr = INameSpaceTreeControl_InsertRoot(pnstc, 0, psidesktop, SHCONTF_FOLDERS, 0, NULL);
ok(hr == S_OK, "Got (0x%08x)\n", hr); ok(hr == S_OK, "Got (0x%08x)\n", hr);
hr = INameSpaceTreeControl_InsertRoot(pnstc, -1, psidesktop, SHCONTF_FOLDERS, 0, NULL); hr = INameSpaceTreeControl_InsertRoot(pnstc, -1, psidesktop, SHCONTF_FOLDERS, 0, NULL);
...@@ -791,6 +817,9 @@ static void test_basics(void) ...@@ -791,6 +817,9 @@ static void test_basics(void)
hr = INameSpaceTreeControl_InsertRoot(pnstc, 1, psidesktop, SHCONTF_FOLDERS, 0, NULL); hr = INameSpaceTreeControl_InsertRoot(pnstc, 1, psidesktop, SHCONTF_FOLDERS, 0, NULL);
ok(hr == S_OK, "Got (0x%08x)\n", hr); 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(psidesktop);
IShellItem_Release(psidesktop2); IShellItem_Release(psidesktop2);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment