#include"CGUICheckButton.h"

namespace Maid
{
	/*!
	 *	\class	CGUICheckButton CGUICheckButton.h
	 *	\brief	チェックボタンの内部で使用しているボタンリスナ
	 */
	class ButtonListener : public CGUIButton::Listener
	{
	public:
		ButtonListener( const CGUICheckButton* p ) : m_pOwner(p){}
		virtual bool IsCollision( const POINT2DI& pos ) const
		{
			return m_pOwner->GetListener()->IsCollision( pos );
		}
	private:
		const CGUICheckButton*	m_pOwner;
	};

	/*!
	 *	\class	CGUICheckButton CGUICheckButton.h
	 *	\brief	チェックボタンクラス
	\n			挙動は Windows のチェックボタンといっしょ
	 */
enum PARTSID
{
	PARTSID_BUTTON=0,
};
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 *
 */
CGUICheckButton::CGUICheckButton()
{
	m_IsCheck = false;

	m_Button.SetID(PARTSID_BUTTON);
	m_Button.SetCallBack( MakeGUICallBackObject(&CGUICheckButton::GUICallBack,this) );
	m_Button.SetListener( SPGUIBUTTONLISTENER( new ButtonListener(this) ) );
}

CGUICheckButton::CGUICheckButton( const CGUICheckButton& button ) : IGUIParts( button )
{
	m_IsCheck = button.m_IsCheck;

	m_Button.SetID(PARTSID_BUTTON);
	m_Button.SetCallBack( MakeGUICallBackObject(&CGUICheckButton::GUICallBack,this) );
	m_Button.SetListener( SPGUIBUTTONLISTENER( new ButtonListener(this) ) );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! リスナの登録
/*!	リスナを登録しない場合、まったく動かないので注意！
 *
 *	\param	pListener	[i ]	新しいリスナ
 */
void	CGUICheckButton::SetListener( const SPGUICHECKBUTTONLISTENER& pListener )
{
	m_pListener = pListener;
	m_pListener->m_pOwner = this;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! リスナの取得
/*!
 *	\return すでに設定されているリスナ
 */
const SPGUICHECKBUTTONLISTENER&	CGUICheckButton::GetListener() const
{
	return m_pListener;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! チェックされているか？
/*!
 *	\return チェックされているなら true
 */
bool CGUICheckButton::IsCheck() const
{
	return m_IsCheck;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! チェック状態の変更
/*!
 *	\param	IsCheck	[i ]	チェック状態にするなら true
 */
void CGUICheckButton::SetCheck( bool IsCheck )
{
	m_IsCheck = IsCheck;
}



CGUICheckButton& CGUICheckButton::operator = ( const CGUICheckButton& rha )
{
	m_Button	= rha.m_Button;
	m_pListener = rha.m_pListener;
	m_IsCheck	= rha.m_IsCheck;
	m_Button.SetCallBack( MakeGUICallBackObject(&CGUICheckButton::GUICallBack,this) );
	m_Button.SetListener( SPGUIBUTTONLISTENER( new ButtonListener(this) ) );

	return *this;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の処理
/*!
 *	引数などは IGUIParts::OnLocalMove を参照すること
 */
void CGUICheckButton::OnLocalMove()
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	m_pListener->OnMove();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の描画
/*!
 *	引数などは IGUIParts::OnLocalDraw を参照すること
 */
void CGUICheckButton::OnLocalDraw( const POINT2DI& pos, CGraphic& Render )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );

	m_pListener->OnDraw( pos, Render );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このパーツ内にカーソルがあるか？
/*!
 *	引数などは IGUIParts::IsLocalCollision を参照すること
 */
bool CGUICheckButton::IsLocalCollision( const POINT2DI& pos ) const
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	return m_pListener->IsCollision( pos );
}

void CGUICheckButton::OnLocalMouseIn  ( const POINT2DI& pos )
{
	m_Button.OnMouseIn( pos );
}

void CGUICheckButton::OnLocalMouseOut ( const POINT2DI& pos )
{
	m_Button.OnMouseOut( pos );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのボタンが押された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseDown を参照すること
 */
void CGUICheckButton::OnLocalMouseDown( const POINT2DI& pos )
{
	m_Button.OnMouseDown( pos );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのボタンが離された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseUp を参照すること
 */
void CGUICheckButton::OnLocalMouseUp  ( const POINT2DI& pos )
{
	m_Button.OnMouseUp( pos );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのカーソルが動いた時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseMove を参照すること
 */
void CGUICheckButton::OnLocalMouseMove( const POINT2DI& pos )
{
	m_Button.OnMouseMove( pos );
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードのキーが押された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalKeyDown を参照すること
 */
void CGUICheckButton::OnLocalKeyDown( unt08 KeyCode )
{
	m_Button.OnKeyDown( KeyCode );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードのキーが押された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalKeyUp を参照すること
 */
void CGUICheckButton::OnLocalKeyUp( unt08 KeyCode )
{
	m_Button.OnKeyUp( KeyCode );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フォーカスがきたとき・さったときに呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalFocusIn を参照すること
 */
void CGUICheckButton::OnLocalFocusIn()
{
	m_Button.OnFocusIn();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フォーカスがきたとき・さったときに呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalFocusOut を参照すること
 */
void CGUICheckButton::OnLocalFocusOut()
{
	m_Button.OnFocusOut();
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 状態が変わった時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalChangeState を参照すること
 */
void CGUICheckButton::OnLocalChangeState( bool NewStateEnable, bool NewStateVisible )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	m_pListener->OnChengeState( NewStateEnable, NewStateVisible );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! メンバに持っているＧＵＩパーツからコールバックされる関数
/*!
 *	\param	GUIParts	[i ]	ＧＵＩパーツ
 *	\param	Message		[i ]	送られてくるメッセージ
 */
void CGUICheckButton::GUICallBack( unt32 GUIParts, GUIMESSAGE Message )
{
	switch( GUIParts )
	{
	case PARTSID_BUTTON:
		{
			switch( Message )
			{
			case GUIMESSAGE_PARTS_FOCUSIN:
				{
					m_pListener->OnFocusIn();
					CallBack(GUIMESSAGE_PARTS_FOCUSIN);
				}break;

			case GUIMESSAGE_PARTS_FOCUSOUT:
				{
					m_pListener->OnFocusOut();
					CallBack(GUIMESSAGE_PARTS_FOCUSOUT);
				}break;

			case GUIMESSAGE_BUTTON_MOUSEDOWN:
				{
					m_pListener->OnMouseDown();
					CallBack(GUIMESSAGE_BUTTON_MOUSEDOWN);
				}break;

			case GUIMESSAGE_BUTTON_MOUSEUP:
				{
					m_pListener->OnMouseUp();
					CallBack(GUIMESSAGE_BUTTON_MOUSEUP);
				}break;

			case GUIMESSAGE_PARTS_MOUSEIN:
				{
					m_pListener->OnMouseIn();
					CallBack(GUIMESSAGE_PARTS_MOUSEIN);
				}break;

			case GUIMESSAGE_PARTS_MOUSEOUT:
				{
					m_pListener->OnMouseOut();
					CallBack(GUIMESSAGE_PARTS_MOUSEOUT);
				}break;

			case GUIMESSAGE_BUTTON_CLICK:
				{
					m_IsCheck = !m_IsCheck;
					m_pListener->OnMouseClick();

					CallBack(GUIMESSAGE_CHECK_CHANGESTATE);
				}break;
			}
		}break;
	}
}


}
