comparison win/dw.c @ 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 3431e445d831
children 651b70046c6a
comparison
equal deleted inserted replaced
290:8ea5b2c35bfe 291:70480069392b
363 { 363 {
364 void *data = dw_window_get_data(handle, "_dw_percent"); 364 void *data = dw_window_get_data(handle, "_dw_percent");
365 365
366 if(data) 366 if(data)
367 free(data); 367 free(data);
368 }
369 else if(strnicmp(tmpbuf, WC_TREEVIEW, strlen(WC_TREEVIEW)+1)==0)
370 {
371 dw_tree_clear(handle);
368 } 372 }
369 else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL)+1)==0) /* Notebook */ 373 else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL)+1)==0) /* Notebook */
370 { 374 {
371 NotebookPage **array = (NotebookPage **)dw_window_get_data(handle, "_dw_array"); 375 NotebookPage **array = (NotebookPage **)dw_window_get_data(handle, "_dw_array");
372 376
5855 void API dw_tree_item_select(HWND handle, HWND item) 5859 void API dw_tree_item_select(HWND handle, HWND item)
5856 { 5860 {
5857 TreeView_SelectItem(handle, (HTREEITEM)item); 5861 TreeView_SelectItem(handle, (HTREEITEM)item);
5858 } 5862 }
5859 5863
5864 /* Delete all tree subitems */
5865 void _dw_tree_delete_recursive(HWND handle, HTREEITEM node)
5866 {
5867 HTREEITEM hti;
5868
5869 hti = TreeView_GetChild(handle, node);
5870
5871 while(hti)
5872 {
5873 HTREEITEM lastitem = hti;
5874
5875 _dw_tree_delete_recursive(handle, hti);
5876 hti = TreeView_GetNextSibling(handle, hti);
5877 dw_tree_delete(handle, (HWND)lastitem);
5878 }
5879 }
5880
5860 /* 5881 /*
5861 * Removes all nodes from a tree. 5882 * Removes all nodes from a tree.
5862 * Parameters: 5883 * Parameters:
5863 * handle: Handle to the window (widget) to be cleared. 5884 * handle: Handle to the window (widget) to be cleared.
5864 */ 5885 */
5865 void API dw_tree_clear(HWND handle) 5886 void API dw_tree_clear(HWND handle)
5866 { 5887 {
5867 TreeView_DeleteAllItems(handle); 5888 HTREEITEM hti = TreeView_GetRoot(handle);
5889
5890 while(hti)
5891 {
5892 HTREEITEM lastitem = hti;
5893
5894 _dw_tree_delete_recursive(handle, hti);
5895 hti = TreeView_GetNextSibling(handle, hti);
5896 dw_tree_delete(handle, (HWND)lastitem);
5897 }
5868 } 5898 }
5869 5899
5870 /* 5900 /*
5871 * Expands a node on a tree. 5901 * Expands a node on a tree.
5872 * Parameters: 5902 * Parameters:
5895 * handle: Handle to the window (widget) to be cleared. 5925 * handle: Handle to the window (widget) to be cleared.
5896 * item: Handle to node to be deleted. 5926 * item: Handle to node to be deleted.
5897 */ 5927 */
5898 void API dw_tree_delete(HWND handle, HWND item) 5928 void API dw_tree_delete(HWND handle, HWND item)
5899 { 5929 {
5930 TVITEM tvi;
5931 void **ptrs;
5932
5900 if((HTREEITEM)item == TVI_ROOT || !item) 5933 if((HTREEITEM)item == TVI_ROOT || !item)
5901 return; 5934 return;
5902 5935
5936 tvi.mask = TVIF_HANDLE;
5937 tvi.hItem = (HTREEITEM)item;
5938
5939 if(TreeView_GetItem(handle, &tvi))
5940 ptrs = (void **)tvi.lParam;
5941
5903 TreeView_DeleteItem(handle, (HTREEITEM)item); 5942 TreeView_DeleteItem(handle, (HTREEITEM)item);
5943 if(ptrs)
5944 free(ptrs);
5904 } 5945 }
5905 5946
5906 /* 5947 /*
5907 * Sets up the container columns. 5948 * Sets up the container columns.
5908 * Parameters: 5949 * Parameters: