/*!
 	@file
 	@brief	ＧＵＩパーツボタンクラス
 */
#ifndef CGUIButton_h
#define CGUIButton_h

#include"CGUIParts.h"

namespace Maid
{

	class CGUIButton : public IGUIParts
	{
	public:
		class Listener
		{
			friend CGUIButton;
		public:
			Listener() : m_pOwner(NULL){}
			virtual ~Listener(){}
			virtual bool IsCollision( const POINT2DI& pos )const{return false;}//!<	ボタンの範囲内にカーソルがあるか

			virtual void OnMouseIn(){}						//!<	マウスが範囲内に来た時に呼ばれる
			virtual void OnMouseOut(){}						//!<	マウスが範囲内から離れた時に呼ばれる
			virtual void OnMouseDown(){}					//!<	マウスが範囲内で押された時に呼ばれる
			virtual void OnMouseUp(){}						//!<	マウスが範囲内で離された時に呼ばれる
			virtual void OnMouseClick(){}					//!<	このボタンがクリックされたときに起こる
			virtual void OnChengeState( bool NewStateEnable, bool NewStateVisible ){}	//!<	状態が変更されたときに呼ばれる
			virtual void OnMove(){}
			virtual void OnDraw( const POINT2DI& pos, CGraphic& Render ){}
			virtual void OnFocusIn(){}
			virtual void OnFocusOut(){}

		protected:
			CGUIButton*	GetOwner() { return m_pOwner; }

		private:
			CGUIButton*	m_pOwner;
		};

	public:
		CGUIButton();
		void	SetListener( const boost::shared_ptr<Listener>& pListener );
		const boost::shared_ptr<Listener>&	GetListener() const;

	protected:
		virtual void OnLocalMove();
		virtual void OnLocalDraw( const POINT2DI& pos, CGraphic& Render );
		virtual bool IsLocalCollision( const POINT2DI& pos ) const;

		virtual void OnLocalMouseIn  ( const POINT2DI& pos );
		virtual void OnLocalMouseOut ( const POINT2DI& pos );
		virtual void OnLocalMouseDown( const POINT2DI& pos );
		virtual void OnLocalMouseUp  ( const POINT2DI& pos );
		virtual void OnLocalMouseMove( const POINT2DI& pos );
		virtual void OnLocalKeyDown( unt08 KeyCode );
		virtual void OnLocalKeyUp( unt08 KeyCode );
		virtual void OnLocalCharCode( const mstring& CharCode ){};
		virtual void OnLocalChangeState( bool NewStateEnable, bool NewStateVisible );
		virtual void OnLocalFocusIn ();
		virtual void OnLocalFocusOut();

	private:
		boost::shared_ptr<Listener>		m_pListener;

		enum STATE
		{
			STATE_NORMAL,	//!<	初期状態
			STATE_DOWN,		//!<	マウスを押している
		};
		STATE	m_State;
		bool	m_IsCollisionIn;	//!<	範囲内に入っているか？
	};

	typedef boost::shared_ptr<CGUIButton::Listener> SPGUIBUTTONLISTENER;
}

#endif