#pragma once

//! @file Utility/UI/Manager.h
//! @brief マネージャクラスインクルードファイル

#include <set>
#include <list>

namespace Utility{ namespace UI {

	class Dialog;

	//! @class Manager
	//! @brief マネージャクラス
	class Manager
	{
	public:
		//! @enum COLOR_TYPE
		//! @brief カラータイプ列挙定数
		enum COLOR_TYPE
		{
			C_BORDER					= 0,	//!< ボーダー
			C_BACKGROUND				= 1,	//!< バックグラウンド
			C_TEXT						= 2,	//!< テキスト

			C_SELECTED_BACKGROUND		= 3,	//!< 選択されているバックグラウンド
			C_SELECTED_TEXT				= 4,	//!< 選択されているテキスト

			C_DLG_CAPTION_BACKGROUND	= 5,	//!< ダイアログのキャプションのバックグラウンド
			C_DLG_CAPTION_TEXT			= 6,	//!< ダイアログのキャプションのテキスト

			C_CTRL_BACKGROUND			= 7,	//!< コントロールのバックグラウンド１
			C_CTRL_DARK_BACKGROUND		= 8,	//!< コントロールのバックグラウンド２
			C_CTRL_DARK_DARK_BACKGROUND	= 9,	//!< コントロールのバックグラウンド３

			COLOR_TYPE_MAX				= 10,	//!< カラータイプの数
		};

	private:
		typedef std::set<UI::Dialog*> DialogMap;
		typedef std::list<UI::Dialog*> DialogList;

	private:
		Mix::HID::IMouse* m_pMouse;
		Mix::Graphics::Utility::ICanvasRenderer* m_pCanvasRenderer;
		Mix::Graphics::Utility::IFont* m_pFont;

		Mix::Vector4 m_ColorList[Manager::COLOR_TYPE_MAX];

		Manager::DialogMap m_DialogMap;
		Manager::DialogList m_DialogUpdateList;
		Manager::DialogList m_DialogDrawList;

		UI::Dialog* m_pActiveDialog;

	public:
		//! @brief コンストラクタ
		Manager( void );
		//! @brief デストラクタ
		~Manager( void );

	public:
		//! @brief マネージャを初期化します
		//! @param[in] pMosue 操作に使用するマウス
		//! @param[in] pCanvasRenderer 描画に使用するキャンバスレンダラー
		//! @param[in] pFont テキストの描画に使用するフォント
		void Initialize( Mix::HID::IMouse* pMouse, Mix::Graphics::Utility::ICanvasRenderer* pCanvasRenderer, Mix::Graphics::Utility::IFont* pFont );
		//! @brief マネージャを更新します
		void Update( void );
		//! @brief マネージャを破棄します
		//! @note UI::Dialog::OnDispose、UI::Control::OnDispose を呼び出します
		void Dispose( void );

		//! @brief カラーを設定します
		//! @param[in] type カラータイプ
		//! @param[in] color 設定するカラー
		void SetColor( Manager::COLOR_TYPE type, const Mix::Vector4& color );
		//! @brief カラーを取得します
		//! @param[in] type カラータイプ
		//! @return カラーを返します
		const Mix::Vector4& GetColor( Manager::COLOR_TYPE type ) const;

	private:
		void AddDialog( UI::Dialog* pDialog );
		void RemoveDialog( UI::Dialog* pDialog );

		friend class Dialog;
	};

}}
