#ifndef __GTREENODE_H__
#define __GTREENODE_H__

#include "FairyGUIMacros.h"
#include "cocos2d.h"

NS_FGUI_BEGIN

class GTree;
class GComponent;

class GTreeNode : public cocos2d::Ref
{
public:
    static GTreeNode* create(bool isFolder = false, const std::string& resURL = cocos2d::STD_STRING_EMPTY);

    GTreeNode();
    virtual ~GTreeNode();

    GTreeNode* getParent() const { return _parent; }
    GTree* getTree() const { return _tree; }
    GComponent* getCell() const { return _cell; }
    const cocos2d::Value& getData() const { return _data; }
    void setData(const cocos2d::Value& value) { _data = value; }
    bool isExpanded() const { return _expanded; }
    void setExpaned(bool value);
    bool isFolder() const { return _isFolder; }
    const std::string& getText() const;
    void setText(const std::string& value);
    const std::string& getIcon() const;
    void setIcon(const std::string& value);

    GTreeNode* addChild(GTreeNode* child);
    GTreeNode* addChildAt(GTreeNode* child, int index);

    void removeChild(GTreeNode* child);
    void removeChildAt(int index);
    void removeChildren() { removeChildren(0, -1); }
    void removeChildren(int beginIndex, int endIndex);

    GTreeNode* getChildAt(int index) const;
    GTreeNode* getPrevSibling() const;
    GTreeNode* getNextSibling() const;

    int getChildIndex(const GTreeNode* child) const;
    void setChildIndex(GTreeNode* child, int index);
    int setChildIndexBefore(GTreeNode* child, int index);
    void swapChildren(GTreeNode* child1, GTreeNode* child2);
    void swapChildrenAt(int index1, int index2);

    int numChildren() const;

private:
    bool init(bool isFolder, const std::string& resURL);
    int moveChild(GTreeNode* child, int oldIndex, int index);
    void setTree(GTree* value);
    void setCell(GComponent* value);

    GTree* _tree;
    GTreeNode* _parent;
    GComponent* _cell;
    int _level;
    bool _expanded;
    bool _isFolder;
    cocos2d::Value _data;
    cocos2d::Vector<GTreeNode*> _children;
    std::string _resURL;

    friend class GTree;
};

NS_FGUI_END

#endif