// -*- mode: c++ -*-

#ifndef MiX_TEXT_H_
#define MiX_TEXT_H_

#include "classes.h"
#include "misc.h"
#include "XMLString.h"
#include "NodeList.h"
#include "extern/noncopyable.hpp"

namespace MiX{
  template <class charT,class char_traits,class xml_traits>
  class Text : boost::noncopyable,
	       public Value<charT,char_traits,xml_traits>{
  public:
    MiX_Template_Typedef(charT,char_traits,xml_traits);
    typedef Text<charT,char_traits,xml_traits> this_type;
    typedef NodeContainer<charT,char_traits,xml_traits> nodecontainer_type;
    typedef typename nodelist_type::iterator nodelist_iter; 
  protected:
    const static typename NodeList<charT,char_traits,xml_traits>::iterator dmy_it;
    /**
     * コンストラクタ
     *
     * Textのコンストラクタは直接呼べません<br>
     * Text<...>::createで生成してください
     */
    Text(const string_type& val) : Value<charT,char_traits,xml_traits>(val){ };
  public:
    ///デストラクタ
    virtual ~Text()throw(){ };
    ///このノードのタイプを得ます
    virtual NodeType getType()const{ return Node_Text; };
    /**
     * 静的にクラスからNodeTypeを得ます
     *
     * 常にNode_Textを返します
     */
    static NodeType type(){ return Node_Text; };
    /**
     * このTextの文字列表現を得ます
     *
     * bIndentが真なら文字列のiIndentOffsetに指定された数だけ
     * XMLTraits::tab()が戻り値の先頭につきます。
     */
    virtual string_type toString(bool indent=false,int indent_off=0)const;
    /**
     * このTextを複製します
     *
     *  \param parent 複製先の親ノード
     *  \param it 挿入する場所(parent.getChilds()内の要素を示すイテレータでなくてはなりません)
     */
    node_type& clone(nodecontainer_type& parent,const nodelist_iter& it = dmy_it) const 
      { return create(getValue(),dynamic_cast<element_type&>(parent),it); }

    /**
     * Textを生成します
     *
     * \param str 生成するTextの値
     * \param parent 生成するTextの親エレメント
     * \param it 挿入する場所(parent.getChilds()の要素を示すイテレータでなければなりません)
     */
    static this_type& create(const string_type& str,element_type& parent,const typename nodelist_type::iterator& it = dmy_it);

    friend class DOM_Parser<charT,char_traits,xml_traits>;
  };
}

#ifndef MiX_TEXT_CPP_
#include "Text.cpp"
#endif

#endif
