#ifndef __GTEXTFIELD_H__
#define __GTEXTFIELD_H__

#include "cocos2d.h"
#include "FairyGUIMacros.h"
#include "GObject.h"
#include "display/FUILabel.h"

NS_FGUI_BEGIN

class GTextField : public GObject
{
public:
    GTextField();
    virtual ~GTextField();

    virtual const std::string& getText() const override { return _text; }
    void setText(const std::string& value) override;

    bool isUBBEnabled() const { return _ubbEnabled; }
    virtual void setUBBEnabled(bool value);

    AutoSizeType getAutoSize() const { return _autoSize; }
    virtual void setAutoSize(AutoSizeType value) {};

    virtual bool isSingleLine() const { return false; }
    virtual void setSingleLine(bool value) {};

    virtual TextFormat* getTextFormat() const = 0;
    virtual void applyTextFormat() = 0;

    virtual const ax::Size& getTextSize() { return _displayObject->getContentSize(); }

    ax::Color3B getColor() const { return getTextFormat()->color; }
    void setColor(const ax::Color3B& value);

    float getFontSize() const { return getTextFormat()->fontSize; }
    void setFontSize(float value);

    ax::Color3B getOutlineColor() const { return getTextFormat()->outlineColor; }
    void setOutlineColor(const ax::Color3B& value);

    ax::ValueMap* getTemplateVars() { return _templateVars; }
    void setTemplateVars(ax::ValueMap* value);

    GTextField* setVar(const std::string& name, const ax::Value& value);
    void flushVars();

    virtual ax::Value getProp(ObjectPropID propId) override;
    virtual void setProp(ObjectPropID propId, const ax::Value& value) override;

protected:
    virtual void setTextFieldText() = 0;
    virtual void updateSize();

    virtual void setup_beforeAdd(ByteBuffer* buffer, int beginPos) override;
    virtual void setup_afterAdd(ByteBuffer* buffer, int beginPos) override;

    std::string parseTemplate(const char* text);

    std::string _text;
    bool _ubbEnabled;
    AutoSizeType _autoSize;
    ax::ValueMap* _templateVars;
};

class GBasicTextField : public GTextField
{
public:
    GBasicTextField();
    virtual ~GBasicTextField();

    CREATE_FUNC(GBasicTextField);

    virtual void setAutoSize(AutoSizeType value) override;

    virtual bool isSingleLine() const override { return _label->isWrapEnabled(); }
    virtual void setSingleLine(bool value) override;

    virtual TextFormat* getTextFormat() const override { return _label->getTextFormat(); }
    virtual void applyTextFormat() override;

protected:
    virtual void handleInit() override;
    virtual void handleSizeChanged() override;
    virtual void handleGrayedChanged() override;

    virtual void setTextFieldText() override;
    virtual void updateSize() override;

private:
    FUILabel* _label;
    bool _updatingSize;
};

NS_FGUI_END

#endif