10 typedef struct W_TreeNode
{
13 //unsigned int uflags:16;
19 struct W_TreeNode
*parent
;
21 WMFreeDataProc
*destructor
;
27 destroyNode(void *data
)
29 WMTreeNode
*node
= (WMTreeNode
*) data
;
31 if (node
->destructor
) {
32 (*node
->destructor
)(node
->data
);
35 WMFreeArray(node
->leaves
);
42 WMCreateTreeNode(void *data
)
44 return WMCreateTreeNodeWithDestructor(data
, NULL
);
49 WMCreateTreeNodeWithDestructor(void *data
, WMFreeDataProc
*destructor
)
53 node
= (WMTreeNode
*) wmalloc(sizeof(W_TreeNode
));
54 memset(node
, 0, sizeof(W_TreeNode
));
56 node
->destructor
= destructor
;
61 node
->leaves
= WMCreateArrayWithDestructor(1, destroyNode
);
68 WMInsertItemInTree(WMTreeNode
*parent
, int index
, void *item
)
72 wassertrv(parent
!=NULL
, NULL
);
74 node
= WMCreateTreeNodeWithDestructor(item
, parent
->destructor
);
75 node
->parent
= parent
;
76 node
->depth
= parent
->depth
+1;
77 if (index
< 0 || index
> WMGetArrayItemCount(parent
->leaves
)) {
78 WMAddToArray(parent
->leaves
, node
);
80 WMInsertInArray(parent
->leaves
, index
, node
);
88 WMAddItemToTree(WMTreeNode
*parent
, void *item
)
92 wassertrv(parent
!=NULL
, NULL
);
94 node
= WMCreateTreeNodeWithDestructor(item
, parent
->destructor
);
95 node
->parent
= parent
;
96 node
->depth
= parent
->depth
+1;
97 WMAddToArray(parent
->leaves
, node
);
104 updateNodeDepth(WMTreeNode
*node
, int depth
)
109 for (i
=0; i
<WMGetArrayItemCount(node
->leaves
); i
++) {
110 updateNodeDepth(WMGetFromArray(node
->leaves
, i
), depth
+1);
116 WMInsertNodeInTree(WMTreeNode
*parent
, int index
, WMTreeNode
*node
)
118 wassertrv(parent
!=NULL
, NULL
);
119 wassertrv(node
!=NULL
, NULL
);
121 node
->parent
= parent
;
122 updateNodeDepth(node
, parent
->depth
+1);
123 if (index
< 0 || index
> WMGetArrayItemCount(parent
->leaves
)) {
124 WMAddToArray(parent
->leaves
, node
);
126 WMInsertInArray(parent
->leaves
, index
, node
);
134 WMAddNodeToTree(WMTreeNode
*parent
, WMTreeNode
*node
)
136 wassertrv(parent
!=NULL
, NULL
);
137 wassertrv(node
!=NULL
, NULL
);
139 node
->parent
= parent
;
140 updateNodeDepth(node
, parent
->depth
+1);
141 WMAddToArray(parent
->leaves
, node
);
148 WMGetTreeNodeDepth(WMTreeNode
*node
)
155 WMDestroyTreeNode(WMTreeNode
*node
)