/*-----------------------------------------------------------------------------
[名称]	CategoryNode.h
[概要]	カテゴリノードのヘッダ
[備考]	カテゴリツリーのノード。
[履歴]	2003-03-14	NC		新規作成(moralog)
-----------------------------------------------------------------------------*/
#if !defined(AFX_CATEGORYNODE_H_INCLUDED_)
#define AFX_CATEGORYNODE_H_INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


//-----------------------------------------------------------------------------
// インクルード・不完全定義
//-----------------------------------------------------------------------------
#include <afxtempl.h>
class CCategoryNode;


/*-----------------------------------------------------------------------------
[名称]	カテゴリノードリスト
[用途]	カテゴリツリーのいわば枝。ノードが属性として持つ。
[備考]	単に型名が長かったので省略したかっただけ。
-----------------------------------------------------------------------------*/
typedef CList<CCategoryNode*, CCategoryNode*> CCategoryNodePtrList;


/*-----------------------------------------------------------------------------
[名称]	AAインデクスリスト
[用途]	末端の目的データを指すインデクスを複数保持する。ノードが属性として持つ。
[備考]	単に型名が長かったので省略したかっただけ。
-----------------------------------------------------------------------------*/
typedef CList<long, long> CIndexList;


/*-----------------------------------------------------------------------------
[名称]	カテゴリノード
[用途]	カテゴリツリーのノード。AAデータへのインデクス情報と下位ノードを持つ。
[備考]	compositパターン。
-----------------------------------------------------------------------------*/
class CCategoryNode
{
public:
	// 生成
	CCategoryNode();

	// 破棄
	virtual ~CCategoryNode();

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

	// ノード名称の設定
	void	SetNodeName( CString strNodeName );

	// ツリービューのノードに反映
	void Reflect(
		CTreeCtrl*	pTree,
		HTREEITEM	RootNode
	);

	// インデクスの振りなおし
	BOOL	Renumbering( CList<long, long>& listlIndexz );

// 下位ノード
	// 下位ノードの追加
	CCategoryNode* AddNode(
		CString&	strNodeName,
		BOOL		bForceCreate = TRUE
	);

	// 下位ノードの追加
	CCategoryNode* AddNode( CCategoryNode& Src, CCategoryNode* After );

	// 下位ノードの削除
	BOOL DeleteNode( CCategoryNode* pDeleteNode );

	// 下位ノードの破棄
	void RemoveAllNode();

	// 親ノードの取得
	CCategoryNode* GetParent(){ return( m_pParent ); };

	// 下位ノードの取得
	CCategoryNode* GetNode( long idxNode );
	long GetNodeCount(){ return( m_listpNodez.GetCount() ); };

	// 以下の階層のインデクスを全て列挙する
	long	GetIndexz( CList<long, long>* plistlIndexz );

// インデクス
	// AAインデクスの追加
	void AddIndex( long iIndex ){ m_listIndexz.AddTail( iIndex ); };

	// AAインデクスの取得
	long GetIndex( long idxIndex );

	// AAインデクスの設定
	BOOL SetIndex(
		long idxIndex,
		long idxAA
	);

	// AAインデクス個数の取得
	long GetIndexCount(){ return( m_listIndexz.GetCount() ); };

	// インデクス情報の破棄
	void RemoveAllIndex(){ m_listIndexz.RemoveAll(); };

	// インデクス情報の削除
	void DeleteIndex( long lIndex );

// シリアライズ
	// 保存
	BOOL Write(CArchive& ar);
	// 読み込み
	BOOL Read(CArchive& ar);

protected:

protected:
	CCategoryNodePtrList	m_listpNodez;		// 下位ノード群 [ポインタのリスト] (-)
	CIndexList				m_listIndexz;		// AAのインデクス群 [-] (-)
	CString					m_strNodeName;		// ノード名称 [-] (-)
	CCategoryNode*			m_pParent;			// 親ノード [-] (-)
};

#endif // !defined(AFX_CATEGORYNODE_H_INCLUDED_)
