#pragma once

#include "SortArray.h"

class CWorkspaceNode;
typedef CSortArray<CWorkspaceNode,CWorkspaceNode&>	CWorkspaceNodeArray;


/*!
	ワークスペースのノード保持クラス
*/
class CWorkspaceNode
{
	friend class CWorkspaceXMLReader;
	friend class CWorkspaceXMLWriter;

public:
	CWorkspaceNode(void);
	CWorkspaceNode(CString name);
	~CWorkspaceNode(void);

	/*********************************************************
		初期化など
	**********************************************************/
	//!	CArrayで利用するための、コピー演算子
	void operator=(const CWorkspaceNode &other);

	//!	全データクリア
	void Clear(void);

	//!	ノード名の設定
	void SetNodeName(CString name) { m_nodeName = name; };

	//!	ノード名の取得
	CString GetNodeName() { return(m_nodeName); };


	/*********************************************************
		Keyに関する処理
	**********************************************************/
	//!	データの設定
	void SetKeyData(CString &key, CString &data,int noCase);

	//!	データの取得
	CString GetKeyData(CString &key, CString &defaultData, int noCase);

	//!	キーの存在を確認
	virtual int KeyIsExist(CString &key,int noCase=FALSE);

	//!	データの削除
	void DeleteKey(CString &key,int noCase=FALSE);

	//!	キー数を取得
	int GetKeyCount();

	//!	全てのキー名を文字列として取得
	int GetAllKey(CStringArray &list);

	//!	全てのキーをコピーする
	void CopyAllKeys(CKeyDataArray &keyData);

	//!	文字列中のキー名をデータに置き換えた文字列を取得する
	CString GetKeySwapString(CString str,CString noData);

	//!	キーを検索
	int FindKeyData(CString sData, int noCase = FALSE);

	//!	キーを検索
	int FindKeyDataPath(CString path, int eqPath = FALSE);

	/******************************************************
		サブノードに関する処理
	*******************************************************/
	//!	サブノードを検索する
	CWorkspaceNode *GetSubNode(CString path, CString &key);

	//!	サブノードを追加する
	void AddSubNode(CString path, CString &key);

	//!	ノードを削除する
	void DeleteNode(CString name);

	//!	サブノード数を得る
	int GetSubNodeCount();

	//!	全てのサブノード名を文字列として取得
	int GetAllSubNode(CStringArray &list);


protected:
	/******************************************************
		入出力に関する処理
	*******************************************************/
	//!	サブノードを作成する
	CWorkspaceNode *AddNewSubNode(CString name);

	//!	サブノードをインデックスで取得する
	CWorkspaceNode *GetSubNodeByIndex(int index);

	//!	キーをインデックスで取得する
	CKeyData *GetKeyByIndex(int index);

protected:
	/******************************************************
		Keyに関する処理
	*******************************************************/
	//!	Keyの検索
	int FindKeyIndex(CString &key,int noCase);

	/******************************************************
		サブノードに関する処理
	*******************************************************/
	//!	サブノードを検索する
	int FindSubNodeIndex(CString name);

	/******************************************************
		その他の関数
	*******************************************************/
	//!	パスの解析
	int ParsePath(CString path, CString & topPath, CString & subPath);


protected:
	//!	このノードの持つデータ
	CKeyDataArray			m_keyData;

	//!	サブノート
	CWorkspaceNodeArray		m_subNode;

	//!	このノードの名前
	CString					m_nodeName;
};

