/*!
 	@file
 	@brief ウィンドウクラス
 */


#ifndef CWindow_h
#define CWindow_h

#include"../../Setup/CompileMode.h"
#include"../../Setup/Win32.h"
#include"../../Auxiliary/Macro.h"
#include"../../Auxiliary/mstring.h"
#include"../../template/Mathematics/Point.h"
#include"../../template/Mathematics/Size.h"

#include"CMessageHook.h"
#include<boost/function.hpp>
#include<boost/bind.hpp>
#include<map>

namespace Maid
{ 
	class CWindow : public IMessageHook
	{
	public:
		enum CALLBACKCODE
		{
			CALLBACKCODE_EXIT=0,
			CALLBACKCODE_CONTINUE,
		};
		typedef boost::function1<CALLBACKCODE, CWindowsMessage& >	MESSAGEFUNCTION;

		enum WINDOWSTYLE
		{
			WINDOWSTYLE_NORMAL,		//!<	タイトルバー、システムボックス、サイズ変更不可フレーム付き
			WINDOWSTYLE_OVERLAP,	//!<	タイトルバー、システムボックス、サイズ変更可フレーム付き
			WINDOWSTYLE_POPUP,		//!<	平面だけ（フルスクリーン向き）
			WINDOWSTYLE_CONSOLE,	//!<	コンソール（ログ取り向け）
		};

	public:
		CWindow();
		virtual ~CWindow();

		void RegistCallBack( UINT Msg, const MESSAGEFUNCTION& Function );
		void DeleteCallBack( UINT Msg );

		void Show();
		void Hide();

		void SetPosition( const POINT2DI& pos );
		void SetSize( const SIZE2DI& pos );
		void SetStyle( WINDOWSTYLE Style );
		void SetDragDropMode( bool IsAccept );
		void SetCaption( const mstring& Name );


		HWND GetHWND();
		SIZE2DI GetSize();


		void Create();
		void Destory();


		virtual IMessageHook::RETURNCODE OnMessage( CWindowsMessage& Param );

	private:
		DWORD	_GetWindowStyle( WINDOWSTYLE Style );

	private:
		mstring		m_Caption;	//!<	ウィンドウキャプション
		POINT2DI	m_Pos;		//!<	ウィンドウの現在座標
		SIZE2DI		m_Size;		//!<	クライアント領域の大きさ
		WINDOWSTYLE	m_Style;

		HWND	m_hWnd;		//!< m_hWnd==NULL まだウィンドウを作ってない

		bool	m_IsDandD;	//!<	Drag&Drop を許可するか？
		bool	m_IsShow;	//!<	表示中か？
		MySTL::map<UINT,MESSAGEFUNCTION>	m_MessageMap;	//!<	メッセージマップ

	};

	//!	省略的な書き方
	#define MakeCallBackObject(pFunc,pObject) boost::bind( pFunc, pObject, _1 )



}

#endif
