#ifndef __TreeList__H
#define __TreeList__H

#include "WimpLib:Template.h"
#include "WimpLib:WListCore.h"

#define EWTreeItemArea_ExpandOrCollapse     (EWItemArea_User + 0)
#define EWTreeItemArea_ExplodeOrCollapse    (EWItemArea_User + 1)
#define EWTreeItemArea_ExplodeAllOrCollapse (EWItemArea_User + 2)
#define EWTreeItemArea_User                 (EWItemArea_User + 3)

typedef struct TreeNode TreeNode;
typedef struct TreeList TreeList;

const void* TreeNode_GetData(const TreeNode*);
TreeNode* TreeNode_GetParent(const TreeNode*);
TreeNode* TreeNode_GetFirstChild(const TreeNode*);
TreeNode* TreeNode_GetLastChild(const TreeNode*);
TreeNode* TreeNode_GetPredecessor(const TreeNode*);
TreeNode* TreeNode_GetSuccessor(const TreeNode*);
int TreeNode_GetLevel(const TreeNode*);
bool TreeNode_AllowExpand(const TreeNode*);
bool TreeNode_IsExpanded(const TreeNode*);
void TreeNode_SetExpanded(TreeNode* This, bool bExpanded);
TreeNode* throw_TreeList_InsertChild(TreeList* pList
	  			, TreeNode* pParent
				, TreeNode* pLeftBrother
				, const char* pSprite
				, const char* pString
				, void* pData);

TreeList* throw_New_TreeList(unsigned int flags, CTemplate* t, TreeNode* pRootNode);
void Delete_TreeList(TreeList*);

HWind TreeList_GetWindow(const TreeList*);
WListCore* TreeList_GetWListCore(TreeList*);
int TreeList_Expand(TreeList* This, int index, int mode, bool bShow);
int TreeList_ExpandParents(TreeList*, const TreeNode* pNode);

TreeNode* TreeList_GetWListItem(const TreeList*, int index);
TreeNode* TreeList_GetRootNode(const TreeList*);
void TreeList_Remove(TreeList*, TreeNode* pNode);

#define TreeList_SetParent(This, ...) WListCore_SetParent(TreeList_GetWListCore(This), __VA_ARGS__)
#define throw_TreeList_SetPane(This, ...) throw_WListCore_SetPane(TreeList_GetWListCore(This), __VA_ARGS__)

#endif
