#include"CXMLNode.h"
#include"../Debug/CAssert.h"
#include"../CString.h"



namespace Maid
{
	/*!
	 	@class	CXMLValue CXMLNode.h
	 	@brief	XMLの値を表すテキスト
	\n			テキスト→数値変換のラッパです
	 */

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 */
CXMLText::CXMLText()
{
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 	@param	Text	[i ]	テキスト。これが<a>XXX</a> の XXXの部分です
 */
CXMLText::CXMLText( const mstring& Text ) : m_Text(Text)
{
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 持っているテキストをint型として取得する
/*!
 	@return int整数。テキストがおかしかったら謎
 */
int CXMLText::GetInt() const
{
	return CString::AtoI(m_Text);
}


float CXMLText::GetFloat() const
{
	return CString::AtoF(m_Text);
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 持っているテキストを取得する
/*!
 	@return テキスト
 */
const mstring& CXMLText::GetStr() const
{
	return m_Text;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! テキストを持っていないか？
/*!
 	@return ないなら true
 */
bool CXMLText::IsEmpty() const
{
	return m_Text.empty();
}



	/*!
	 	@class	CXMLNode CXMLNode.h
	 	@brief	XMLのノード
	\n			CXMLDocument にぶら下がっているノードです。
	 */

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 */
CXMLNode::CXMLNode()
{
	m_Type   = TYPE_EMPTY;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! ノードの名前の取得
/*!
 	@return ノード名
 */
mstring CXMLNode::GetName() const
{
	return m_Name;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! ノードの種類の取得
/*!
 	@return ノードタイプ
 */
CXMLNode::TYPE CXMLNode::GetType() const
{
	return m_Type;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 何個の属性を持っているか？
/*!
 	@return 属性の個数
 */
int CXMLNode::GetAttributeLength()const
{
	return (int)m_AttributeList.size();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 指定した属性の取得
/*!
 	@return 属性。指定したものがないならNULL
 */
CXMLText CXMLNode::GetAttribute( const mstring& Name )const
{
	ATTRIBUTELIST::const_iterator ite = m_AttributeList.find(Name);

	if( ite==m_AttributeList.end() ) { return CXMLText(); }
	return (ite->second);
}

const CXMLNode::ATTRIBUTELIST& CXMLNode::GetAttributeTable() const
{
	return m_AttributeList;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! テキストの取得
/*!
 	@return テキスト
 */
CXMLText	CXMLNode::GetText() const
{
	MAID_ASSERT( m_Type!=TYPE_TEXT, "このノードはテキストタイプではありません" );
	return m_Text;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! タグ名の取得
/*!
 	@return タグ名
 */
mstring CXMLNode::GetElementName() const
{
	MAID_ASSERT( m_Type!=TYPE_ELEMENT, "このノードはタグタイプではありません" );
	return m_Name;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コメントの取得
/*!
 	@return コメント
 */
mstring CXMLNode::GetComment() const
{
	MAID_ASSERT( m_Type!=TYPE_COMMENT, "このノードはコメントタイプではありません" );
	return m_Text.GetStr();
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このノードは空っぽか？
/*!
 	@return 空ならtrue
 */
bool CXMLNode::IsEmpty() const
{
	return m_Type == TYPE_EMPTY;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 子ノードが何個あるか？
/*!
 *	\return 子ノードの個数
 */
int  CXMLNode::GetChildLength() const
{
	MAID_ASSERT( m_Type!=TYPE_ELEMENT, "このノードは要素タイプではありません" );
	return (int)m_ChildList.size();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 子ノードの取得
/*!
 	@return 子ノード。
 */
CXMLNode&	CXMLNode::GetChildNode( int index ) const
{
	MAID_ASSERT( m_Type!=TYPE_ELEMENT, "このノードは要素タイプではありません" );
	MAID_ASSERT( !(index<(int)m_ChildList.size()), "範囲外です " << index );
	return *(m_ChildList[index]);
}


void CXMLNode::SetElementName( const mstring& Name )
{
	m_Name = Name;
	m_Type = TYPE_ELEMENT;
}

void CXMLNode::SetText( const mstring& Text )
{
	m_ChildList.clear();
	m_Text = CXMLText(Text);
	m_Type = TYPE_TEXT;
}

void CXMLNode::SetComment( const mstring& Text )
{
	m_ChildList.clear();
	m_Text = CXMLText(Text);
	m_Type = TYPE_COMMENT;
}

void CXMLNode::SetAttribute( const mstring& Name, const CXMLText& Value )
{
	m_AttributeList[Name] = Value;
}

void CXMLNode::DeleteAttribute( const mstring& Name )
{
	m_AttributeList.erase( m_AttributeList.find(Name) );
}


void CXMLNode::AddChildNode( const SPXMLNODE& pNode )
{
	m_ChildList.push_back( pNode );
}


void CXMLNode::InsertChildNode( int Index, const SPXMLNODE& pNode )
{
	m_ChildList.insert( m_ChildList.begin()+Index, pNode );
}

void CXMLNode::DeleteChildNode( int Index )
{
	m_ChildList.erase( m_ChildList.begin()+Index );
}

void CXMLNode::SetChildNode( int Index, const SPXMLNODE& pNode )
{
	MAID_ASSERT( (int)m_ChildList.size()>=Index, "範囲外です" );
	m_ChildList[Index] = pNode;
}

}

