Mercurial > dwindows
changeset 291:70480069392b
Fixed memory leak in the tree control on Windows.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sun, 23 Mar 2003 16:05:32 +0000 |
parents | 8ea5b2c35bfe |
children | 651b70046c6a |
files | win/dw.c |
diffstat | 1 files changed, 42 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/win/dw.c Sun Mar 23 15:35:03 2003 +0000 +++ b/win/dw.c Sun Mar 23 16:05:32 2003 +0000 @@ -366,6 +366,10 @@ if(data) free(data); } + else if(strnicmp(tmpbuf, WC_TREEVIEW, strlen(WC_TREEVIEW)+1)==0) + { + dw_tree_clear(handle); + } else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL)+1)==0) /* Notebook */ { NotebookPage **array = (NotebookPage **)dw_window_get_data(handle, "_dw_array"); @@ -5857,6 +5861,23 @@ TreeView_SelectItem(handle, (HTREEITEM)item); } +/* Delete all tree subitems */ +void _dw_tree_delete_recursive(HWND handle, HTREEITEM node) +{ + HTREEITEM hti; + + hti = TreeView_GetChild(handle, node); + + while(hti) + { + HTREEITEM lastitem = hti; + + _dw_tree_delete_recursive(handle, hti); + hti = TreeView_GetNextSibling(handle, hti); + dw_tree_delete(handle, (HWND)lastitem); + } +} + /* * Removes all nodes from a tree. * Parameters: @@ -5864,7 +5885,16 @@ */ void API dw_tree_clear(HWND handle) { - TreeView_DeleteAllItems(handle); + HTREEITEM hti = TreeView_GetRoot(handle); + + while(hti) + { + HTREEITEM lastitem = hti; + + _dw_tree_delete_recursive(handle, hti); + hti = TreeView_GetNextSibling(handle, hti); + dw_tree_delete(handle, (HWND)lastitem); + } } /* @@ -5897,10 +5927,21 @@ */ void API dw_tree_delete(HWND handle, HWND item) { + TVITEM tvi; + void **ptrs; + if((HTREEITEM)item == TVI_ROOT || !item) return; + tvi.mask = TVIF_HANDLE; + tvi.hItem = (HTREEITEM)item; + + if(TreeView_GetItem(handle, &tvi)) + ptrs = (void **)tvi.lParam; + TreeView_DeleteItem(handle, (HTREEITEM)item); + if(ptrs) + free(ptrs); } /*