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);
 }
 
 /*