#include"CMouseCursor.h"
#include"../Auxiliary/Debug/CAssert.h"

#include"../Auxiliary/CString.h"


namespace Maid
{

/*!
 *	\class	CMouseCursor CMouseCursor.h
 *	\brief	マウスカーソル
\n			マウスカーソルの表示、ウィンドウ外に出たときにシステムカーソルの表示
\n			などを行います。
\n			カーソルはスプライトアニメーションデータを利用します
 */

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 */
CMouseCursor::CMouseCursor()
{

}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の処理
/*!
 */
void CMouseCursor::Update()
{
	m_Cursor.CountInc();


}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! フレーム毎の描画
/*!
 *	\param	Render	[i ]	レンダラ
 */
void CMouseCursor::OnDraw( CGraphic& Render, const CMouse& mouse )
{
	if( m_CursorStack.top()!=-1 && mouse.IsClipIn() )
	{
		SPRITE& data = m_Cursor.GetNowSprite();

		Render.BltSprite( POINT2DI(mouse.GetX(),mouse.GetY()), data );
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスカーソルの読み込み
/*!
 *	\param	FileName	[i ]	新しく使うスプライトファイル
 */
void CMouseCursor::LoadCursor( const mstring& FileName )
{
	StackReset();
	m_Cursor.Load( FileName );
	PushCursor(0);
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスカーソルの変更
/*!
 *	\param	No	[i ]	新しいカーソル番号(-1で非表示されます)
 */
void CMouseCursor::ChangeCursor( int No )
{
	MAID_ASSERT( No!=-1 && No<0, MAIDTEXT("負数を指定する場合は-1を指定すること ") << No );
	if( No!=-1 )
	{
		m_Cursor.ChangePattern( No );
	}
	m_CursorStack.top() = No;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 現在のカーソルパターン番号を取得する
/*!
 *	\return 現在の番号
 */
unt CMouseCursor::GetNowPatern() const
{
	return m_CursorStack.top();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! マウスアニメーションがおわったか？
/*!
 */
bool CMouseCursor::IsAnimEnd() const
{
	return m_Cursor.IsEnd();
}

bool CMouseCursor::IsNowLoading()
{
	return m_Cursor.IsNowLoading();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! カーソルを一時的に変更する
/*!
 *	この関数でカーソルを変更した場合、PopCursor で元に戻すことができます
 *
 *	\param	No [i ]	新しいカーソル(-1で非表示されます)
 */
void CMouseCursor::PushCursor( int No )
{
	m_CursorStack.push( No );
	ChangeCursor( No );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! PushCursor で変更していたカーソルを元に戻します
/*!
 */
void CMouseCursor::PopCursor()
{
	m_CursorStack.pop();
	if( !m_CursorStack.empty() )
	{
		const int no = m_CursorStack.top();
		ChangeCursor( no );
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! PushCursor, PopCursor で使用しているスタックを空にする
/*!
 */
void CMouseCursor::StackReset()
{
	m_CursorStack = MySTL::stack<int>();
}

}
