#include"CGUIParts.h"
#include"CGUIManager.h"

namespace Maid
{
	/*!
	 *	\class	IGUIParts CGUIParts.h
	 *	\brief	ＧＵＩパーツ基本クラス
	 */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 *
 */
IGUIParts::IGUIParts()
{
	m_PartsID = GUIID_NONE;
	m_pOwner  = NULL;
	m_Position = VECTOR2DI(0,0);

	m_IsEnable  = true;
	m_IsVisible = true;
	m_IsFocus   = false;
	m_IsMouseIn = false;
}

IGUIParts::IGUIParts( const IGUIParts& parts )
{
	m_PartsID = parts.m_PartsID;
	m_pOwner  = NULL;
	m_Position = parts.m_Position;

	m_IsEnable  = parts.m_IsEnable;
	m_IsVisible = parts.m_IsVisible;
	m_IsFocus   = false;
	m_IsMouseIn = false;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! デストラクタ
/*!
 *
 */
IGUIParts::~IGUIParts()
{
	if( m_pOwner!=NULL )
	{
		m_pOwner->DeleteGUIParts( m_PartsID );
		m_pOwner = NULL;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このパーツの設置座標の設定
/*!	このパーツを管理している CGUIManager からの相対座標になります
 *
 *	\param	x	[i ]	新しい座標Ｘ
 *	\param	y	[i ]	新しい座標Ｙ
 *
 */
void   IGUIParts::SetPos( int32 x, int32 y )
{
	m_Position.x = x;
	m_Position.y = y;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 状態の変更
/*!	SetEnable(), SetVisible() を同時に行う関数です
 *
 *	\param	IsEnable	[i ]	処理を行うか？
 *	\param	IsVisible	[i ]	描画を行うか？
 *
 */
void IGUIParts::SetState( bool IsEnable, bool IsVisible )
{
	m_IsEnable = IsEnable;
	m_IsVisible = IsVisible;
	OnLocalChangeState( m_IsEnable, m_IsVisible);
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 状態の変更
/*!	OnLocalMove() が呼ばれるかの設定
 *
 *	\param	IsEnable	[i ]	処理を行うか？
 */
void IGUIParts::SetEnable( bool IsEnable )
{
	m_IsEnable = IsEnable;
	OnLocalChangeState( m_IsEnable, m_IsVisible);
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 状態の変更
/*!	OnLocalDraw() が呼ばれるかの設定
 *
 *	\param	IsVisible	[i ]	描画を行うか？
 */
void IGUIParts::SetVisible( bool IsVisible )
{
	m_IsVisible = IsVisible;
	OnLocalChangeState( m_IsEnable, m_IsVisible);
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コールバック関数の設定
/*!	
 *	\param	CallBack	[i ]	設定する関数
 */
void IGUIParts::SetCallBack( const GUIMESSAGEFUNCTION& CallBack )
{
	m_Function = CallBack;
}

void IGUIParts::ClearCallBack()
{
	m_Function.clear();
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! パーツＩＤの設定
/*!	
 *	\param	PartsID	[i ]	新しいパーツＩＤ
 */
void IGUIParts::SetID( unt32 PartsID )
{
	m_PartsID = PartsID;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 現在のパーツ座標の取得
/*!	このパーツを管理している CGUIManager からの相対座標になります
 *
 *	\return	Ｘ座標
 */
int32 IGUIParts::GetPosX() const
{
	return m_Position.x;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 現在のパーツ座標の取得
/*!	このパーツを管理している CGUIManager からの相対座標になります
 *
 *	\return	Ｙ座標
 */
int32 IGUIParts::GetPosY() const
{
	return m_Position.y;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! パーツＩＤの取得
/*!	
 *	\return	パーツＩＤ
 */
unt32 IGUIParts::GetID() const
{
	return m_PartsID;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の処理を行えるか？
/*!
 *	\return	行えるなら true
 */
bool IGUIParts::IsEnable() const
{
	return m_IsEnable;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の描画を行えるか？
/*!
 *	\return	行えるなら true
 */
bool IGUIParts::IsVisible()const
{
	return m_IsVisible;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の処理
/*!
 */
void IGUIParts::OnMove()
{
	if( !IsEnable() ) { return ; }
	OnLocalMove();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の描画
/*!
 *	\param	Offset	[i ]	このパーツを管理している CGUImanager の座標
 *	\param	Render	[i ]	レンダラ
 *	\param	Dst		[i ]	描画先
 */
void IGUIParts::OnDraw( const POINT2DI& Offset, CGraphic& Render )
{
	if( !IsVisible() ) { return ; }
	OnLocalDraw( Offset+m_Position, Render );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このパーツ内にカーソルがあるか？
/*!
 *	\param	pos	[i ]	カーソル座標
 */
bool IGUIParts::IsCollision( const POINT2DI& pos ) const
{
	if( !IsEnable() ) { return false; }
	return IsLocalCollision( pos-m_Position );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスカーソルがパーツ内に入った時に呼ばれる
/*!
 *	\param	pos	[i ]	カーソル座標
 */
void IGUIParts::OnMouseIn  ( const POINT2DI& pos )
{
	if( !IsEnable() ) { return; }
	m_IsMouseIn = true;
	OnLocalMouseIn( pos-m_Position );
	CallBack( GUIMESSAGE_PARTS_MOUSEIN  );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスカーソルがパーツ内から出た時に呼ばれる
/*!
 *	\param	pos	[i ]	カーソル座標
 */
void IGUIParts::OnMouseOut ( const POINT2DI& pos )
{
	if( !IsEnable() ) { return; }
	if( !m_IsMouseIn ) { return ; }
	OnLocalMouseOut( pos-m_Position );
	m_IsMouseIn = false;
	CallBack( GUIMESSAGE_PARTS_MOUSEOUT  );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのボタンが押された時に呼ばれる
/*!
 *	\param	pos	[i ]	カーソル座標
 */
void IGUIParts::OnMouseDown( const POINT2DI& pos )
{
	if( !IsEnable() ) { return; }
	OnLocalMouseDown( pos-m_Position );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのボタンが離された時に呼ばれる
/*!
 *	\param	pos	[i ]	カーソル座標
 */
void IGUIParts::OnMouseUp  ( const POINT2DI& pos )
{
	if( !IsEnable() ) { return ; }
	OnLocalMouseUp( pos-m_Position );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスのカーソルが動いた時に呼ばれる
/*!
 *	\param	pos	[i ]	カーソル座標
 */
void IGUIParts::OnMouseMove( const POINT2DI& pos )
{
	if( !IsEnable() ) { return ; }
	OnLocalMouseMove( pos-m_Position );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードのキーが押された時に呼ばれる
/*!
 *	\param	KeyCode	[i ]	キーコード
 */
void IGUIParts::OnKeyDown( unt08 KeyCode )
{
	if( !IsEnable() ) { return ; }
	OnLocalKeyDown( KeyCode );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードのキーがはなされた時に呼ばれる
/*!
 *	\param	KeyCode	[i ]	キーコード
 */
void IGUIParts::OnKeyUp( unt08 KeyCode )
{
	if( !IsEnable() ) { return ; }
	OnLocalKeyUp( KeyCode );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 文字コードが入力された時に呼ばれる
/*!
 *	\param	CharCode	[i ]	文字コード
 */
void IGUIParts::OnCharCode( const mstring& CharCode )
{
	if( !IsEnable() ) { return ; }
	OnLocalCharCode( CharCode );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このクラスにフォーカスが来たoときに呼ばれる
/*!
 */
void IGUIParts::OnFocusIn()
{
	if( !IsEnable() ) { return ; }

	m_IsFocus = true;
	OnLocalFocusIn();

	CallBack( GUIMESSAGE_PARTS_FOCUSIN  );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このクラスからフォーカスが去ったときに呼ばれる
/*!
 */
void IGUIParts::OnFocusOut()
{
	if( !IsEnable() ) { return ; }

	m_IsFocus = false;
	OnLocalFocusOut();
	CallBack( GUIMESSAGE_PARTS_FOCUSOUT );
}



/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! メッセージを発行する
/*!
 *	\param	msg	[i ]	メッセージ内容
 */
void IGUIParts::CallBack( GUIMESSAGE msg )
{
	MAID_ASSERT( !m_Function, "コールバックの設定がされていません" );
	if( !m_Function ) { return ; }
	m_Function( m_PartsID, msg );
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 現在フォーカスを持っているか？
/*!
 *	\return 持っているなら true
 */
bool IGUIParts::IsFocusIn() const
{
	return m_IsFocus;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 現在エディットモードか？
/*!
 *	\return エディットモードなら true
 */
bool IGUIParts::IsMouseIn() const
{
	return m_IsMouseIn;
}

}
