#include"CGUIButton.h"


namespace Maid
{
	/*!
	 *	\class	CGUIButton CGUIButton.h
	 *	\brief	ボタンクラス
	\n			挙動は Windows のボタンといっしょ
	 */

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 *
 */
CGUIButton::CGUIButton()
{
	m_State = STATE_NORMAL;
	m_IsCollisionIn = false;
}

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

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



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

	m_pListener->OnMove();
}

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

	m_pListener->OnDraw( pos, Render );

}

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


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスが範囲内に来た時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseIn を参照すること
 */
void CGUIButton::OnLocalMouseIn  ( const POINT2DI& pos )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	return m_pListener->OnMouseIn();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスが範囲内から離れた時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseOut を参照すること
 */
void CGUIButton::OnLocalMouseOut ( const POINT2DI& pos )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	return m_pListener->OnMouseOut();
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのボタンが押された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseDown を参照すること
 */
void CGUIButton::OnLocalMouseDown( const POINT2DI& pos )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );

	switch( m_State )
	{
	case STATE_NORMAL:
		{
			m_pListener->OnMouseDown();
			CallBack(GUIMESSAGE_BUTTON_MOUSEDOWN);
			m_State = STATE_DOWN;
		}break;

	case STATE_DOWN:		{ }break;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのボタンが離された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseUp を参照すること
 */
void CGUIButton::OnLocalMouseUp  ( const POINT2DI& pos )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );

	const bool IsIn = m_pListener->IsCollision(pos);

	switch( m_State )
	{
	case STATE_NORMAL:  { }break;
	case STATE_DOWN:
		{
			m_pListener->OnMouseUp();
			CallBack(GUIMESSAGE_BUTTON_MOUSEUP);
			if( IsIn )
			{
				m_pListener->OnMouseClick();
				CallBack( GUIMESSAGE_BUTTON_CLICK );
			}
			m_State = STATE_NORMAL;
		}break;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードのキーが押された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalKeyDown を参照すること
 */
void CGUIButton::OnLocalKeyDown( unt08 KeyCode )
{
	switch( KeyCode )
	{
	case CKeybord::BUTTON_ENTER:
		{
			m_pListener->OnMouseDown();
			CallBack(GUIMESSAGE_BUTTON_MOUSEDOWN);
			m_State = STATE_DOWN;
		}break;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードのキーが押された時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalKeyUp を参照すること
 */
void CGUIButton::OnLocalKeyUp( unt08 KeyCode )
{
	switch( KeyCode )
	{
	case CKeybord::BUTTON_ENTER:
		{
			m_pListener->OnMouseUp();
			CallBack(GUIMESSAGE_BUTTON_MOUSEUP);
			m_pListener->OnMouseClick();
			CallBack( GUIMESSAGE_BUTTON_CLICK );
			m_State = STATE_NORMAL;
		}break;
	}
}

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

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フォーカスがきたときに呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalFocusIn を参照すること
 */
void CGUIButton::OnLocalFocusIn()
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	m_pListener->OnFocusIn();

	if( m_State==STATE_DOWN )
	{
		m_pListener->OnMouseUp(); 
		CallBack(GUIMESSAGE_BUTTON_MOUSEUP);
		m_State = STATE_NORMAL;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フォーカスがさったときに呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalFocusOut を参照すること
 */
void CGUIButton::OnLocalFocusOut()
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );
	m_pListener->OnFocusOut();

	if( m_State==STATE_DOWN )
	{
		m_pListener->OnMouseUp(); 
		CallBack(GUIMESSAGE_BUTTON_MOUSEUP);
		m_State = STATE_NORMAL;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのカーソルが動いた時に呼ばれる
/*!
 *	引数などは IGUIParts::OnLocalMouseMove を参照すること
 */
void CGUIButton::OnLocalMouseMove( const POINT2DI& pos )
{
	MAID_ASSERT( m_pListener.get()==NULL, "リスナの設定がされていません" );

	switch( m_State )
	{
	case STATE_NORMAL:	{	}break;
	case STATE_DOWN:	{	}break;
	}
}


}