/*!
 	@file
 	@brief	ＧＵＩパーツ基本クラス
 */
#ifndef CGUIParts_h
#define CGUIParts_h

#include"CGUIPartsDefine.h"

namespace Maid
{
	class CGUIManager;
	class IGUIParts
	{
		friend CGUIManager;
	public:
		IGUIParts();
		IGUIParts( const IGUIParts& parts );
		~IGUIParts();


		void   SetPos( const POINT2DI& pos ) { SetPos(pos.x,pos.y); }
		void   SetPos( int32 x, int32 y );
		int32 GetPosX() const;
		int32 GetPosY() const;
		unt32 GetID() const;

		void SetState( bool IsEnable, bool IsVisible );
		void SetEnable( bool IsEnable );
		void SetVisible( bool IsVisible );

		void SetCallBack( const GUIMESSAGEFUNCTION& CallBack );
		void ClearCallBack();
		void SetID( unt32 PartsID );

		bool IsEnable() const;
		bool IsVisible()const;

		void OnMove();
		void OnDraw( const POINT2DI& Offset, CGraphic& Render );

		bool IsCollision( const POINT2DI& pos ) const;


		void OnMouseIn  ( const POINT2DI& pos );
		void OnMouseOut ( const POINT2DI& pos );
		void OnMouseDown( const POINT2DI& pos );
		void OnMouseUp  ( const POINT2DI& pos );
		void OnMouseMove( const POINT2DI& pos );
		void OnKeyUp( unt08 KeyCode );
		void OnKeyDown( unt08 KeyCode );
		void OnCharCode( const mstring& CharCode );
		void OnFocusIn ();
		void OnFocusOut();

		bool IsFocusIn() const;
		bool IsMouseIn() const;

	protected:
		//! フレーム毎の処理
		/*!
		 */
		virtual void OnLocalMove()=0;

		//! フレーム毎の描画
		/*!
		 *	\param	pos		[i ]	描画座標（絶対座標
		 *	\param	Render	[i ]	レンダラ
		 *	\param	Dst		[i ]	描画対象先
		 */
		virtual void OnLocalDraw( const POINT2DI& pos, CGraphic& Render )=0;

		//! このパーツ内にカーソルがあるか？
		/*!
		 *	\param	pos	[i ]	カーソル座標
		 */
		virtual bool IsLocalCollision( const POINT2DI& pos ) const=0;
		//! マウスカーソルがパーツ内に入った時に呼ばれる
		/*!
		 *	\param	pos	[i ]	カーソル座標
		 */
		virtual void OnLocalMouseIn( const POINT2DI& pos )=0;
		//! マウスカーソルがパーツ内から出た時に呼ばれる
		/*!
		 *	\param	pos	[i ]	カーソル座標
		 */
		virtual void OnLocalMouseOut ( const POINT2DI& pos )=0;


		//! マウスのボタンが押された時に呼ばれる
		/*!
		 *	\param	pos	[i ]	カーソル座標
		 */
		virtual void OnLocalMouseDown( const POINT2DI& pos )=0;
		//! マウスのボタンが離された時に呼ばれる
		/*!
		 *	\param	pos	[i ]	カーソル座標
		 */
		virtual void OnLocalMouseUp  ( const POINT2DI& pos )=0;
		//! マウスのカーソルが動いた時に呼ばれる
		/*!
		 *	\param	pos	[i ]	カーソル座標
		 */
		virtual void OnLocalMouseMove( const POINT2DI& pos )=0;

		//! キーボードのキーがはなされた時に呼ばれる
		/*!
		 *	\param	KeyCode	[i ]	キーコード
		 */
		virtual void OnLocalKeyUp( unt08 KeyCode )=0;

		//! キーボードのキーが押された時に呼ばれる
		/*!
		 *	\param	KeyCode	[i ]	キーコード
		 */
		virtual void OnLocalKeyDown( unt08 KeyCode )=0;

		//! 文字コードが入力された時に呼ばれる
		/*!
		 *	\param	CharCode	[i ]	文字コード
		 */
		virtual void OnLocalCharCode( const mstring& CharCode )=0;

		//! 状態が変更されたときに呼ばれる
		/*!
		 *	\param	NewStateEnable	[i ]	新しい状態
		 *	\param	NewStateVisible	[i ]	新しい状態
		 */
		virtual void OnLocalChangeState( bool NewStateEnable, bool NewStateVisible )=0;


		//! このクラスにフォーカスが来たときに呼ばれる
		/*!
		 */
		virtual void OnLocalFocusIn(){};

		//! このクラスからフォーカスが去ったときに呼ばれる
		/*!
		 */
		virtual void OnLocalFocusOut(){};

		void CallBack( GUIMESSAGE msg );

		CGUIManager*	GetOwner() { return m_pOwner; }

	private:
		GUIMESSAGEFUNCTION	m_Function;			//!<	このＧＵＩパーツで起こったメッセージの送信先
		unt32			m_PartsID;				//!<	このＧＵＩパーツのＩＤ
		CGUIManager*	m_pOwner;				//!<	オーナー
		VECTOR2DI		m_Position;				//!<	このＧＵＩがある座標（ m_pOwner からの相対座標 )
		bool			m_IsEnable;				//!<	OnMove() を呼び出していいか
		bool			m_IsVisible;			//!<	OnDraw() を呼び出していいか
		bool			m_IsFocus;				//!<	現在フォーカスを持っているか？
		bool			m_IsMouseIn;			//!<	マウスが来ているか？
	};


}

#endif
