/*-----------------------------------------------------------------------------
[名称]	CommandManager.h
[概要]	コマンド管理クラスのヘッダ
[備考]	なし
[履歴]	2003-04-23	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/
#if !defined(AFX_COMMANDMANAGER_H_INCLUDED_)
#define AFX_COMMANDMANAGER_H_INCLUDED_

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


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


/*-----------------------------------------------------------------------------
[名称]	コマンド管理クラス
[用途]	Undo／ReDoのためのコマンド保存。
[備考]	Singletonパターン。
		使用方法：
		(1) CCommandManager::GetInstance() でインスタンスを取得する。
		(2) CCommandManager::Attach() で操作対象のドキュメントを指定する。
		(3) CCommandManager::Add() でコマンドを追加してゆく。
		(4) CCommandManager::UnDo() でUnDo操作を行うことが可能。
		(5) CCommandManager::ReDo() でReDo操作を行うことが可能。
		(6) 利用後、インスタンスの明示的な破棄の必要はない。
-----------------------------------------------------------------------------*/
class CCommandManager
{
public:
	// 破棄
	virtual ~CCommandManager();

	// インスタンスの取得
	static CCommandManager*	GetInstance();

	// コマンドリストの破棄
	void RemoveAll();

	// 使用開始時に、作業用ドキュメントを関連付ける
	void Attach( CShitarabianDoc* pDoc ){ m_pDoc = pDoc; };

	// 新しいコマンドの登録
	void Add(
		ICommand& cmdNew
	);

	// 既存のコマンドの復元
	void UnDo();

	// 既存のコマンドの実行
	void ReDo();

	// Undo可能判定
	BOOL CanUnDo(){ return( m_posIterator != NULL ); };

	// ReDo可能判定
	BOOL CanReDo(){ return( m_posIterator != m_lstpCommandz.GetTailPosition() ); };

protected:
	CList<ICommand*, ICommand*>		m_lstpCommandz;	// コマンド群 [-] (-)
	POSITION						m_posIterator;	// UnDo,ReDo用現在位置 [-] (-)
	CShitarabianDoc*				m_pDoc;			// 操作対象のドキュメント [-] (-)

private:
	// コンストラクタ
	CCommandManager();
};
#endif // !defined(AFX_COMMANDMANAGER_H_INCLUDED_)
