/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/* ***************************************************** */
/********************************************************************/
/**
 * @file GLCommandFactory.h
 * @brief ドキュメントコマンドのファクトリークラス。
 */
#pragma once
#include <map>

class fugenDoc;
class MGCommandBase;

/// @class CGLCommandFactory Common/GLCommandFactory.h
///
/// ドキュメントコマンドのファクトリークラス。
class CGLCommandFactory
{
	typedef MGCommandBase* (*CreateCommandFunc)(fugenDoc* pDoc, UINT nCmdID);
	typedef std::map<UINT, CreateCommandFunc> CommandMap;
	typedef bool (*UpdateUIFunc)(fugenDoc* pDoc, UINT nCmdID);
	typedef std::map<UINT, UpdateUIFunc> UpdateUIMap;

	CommandMap m_commandFactoryMap; ///< RegisterCommand() 参照
	UpdateUIMap m_uimap; ///< RegisterUpdateUI() 参照

public:
	/// デフォルトコンストラクター
	CGLCommandFactory();

	/// デストラクター
	~CGLCommandFactory();

	/// コマンドオブジェクトを生成できるか否かテスト。
	/// @note Complexity O(1) で実装したい。
	bool QueryCommand(UINT nCmdID) const;

	/// コマンド ID とドキュメントから生成
	MGCommandBase* CreateCommand(fugenDoc* pDoc, UINT nCmdID) const;

	/// コマンドに対応するメニューアイテムの有効無効テストに利用する。
	bool IsEnabled(fugenDoc* pDoc, UINT nCmdID) const;

	void RegisterCommand(UINT nID, CreateCommandFunc pfn);
	void RegisterUpdateUI(UINT nID, UpdateUIFunc pfn);
};
