/* ==========================================================================
* 작 성 자 : 이순규
* 작 성 일 : 2007.06.14
* 내    용 : 
* 주의사항 : 
*===========================================================================*/
#pragma once
#include "UINode.h"
#include "UINodeData.h"
#include "UIImage.h"
#include "UIImageFont.h"
#include "UITransformImage.h"
#include "UIRoundGauge.h"

class cPlaneObject;
enum eTooltipType;
enum eAniType
{
	eANI_AURA,		/// 오라스킬의 테두리
	eANI_FLASH,		/// 쿨타임 종료후 반짝임
	eANI_COUNT,		/// 쿨타임 카운트 용
		
	eANI_MAX,
};

enum eIconType
{
	eICON_NORMAL = 0,	/// 일반타입
	eICON_ITEM,
	eICON_SKILL,
	eICON_COMMUNITY,

	eICON_MAX,
	eICON_NULL,
};

/// 애니메이션 인자
struct sAniParam
{
	short			mFrame;				/// 프레임수
	unsigned int	mTexX, mTexY;		/// 텍스쳐 좌표
	unsigned int	mWidth, mHeight;	/// 이미지 사이즈
	short			mCurFrame;			/// 현재 프레임
	bool			mAniOn;				/// 애니사용여부
	bool			mReturn;			/// 애니메이션 한바퀴 돌리기

	/// 타이머
	unsigned long	mTimeOut;			/// 애니메이션 갱신 시간
	unsigned long	mAccumTime;
	unsigned long	mLastAccumTime;

	sAniParam()
	{
		::memset( this, 0, sizeof(sAniParam) );
	}
	~sAniParam(){}
};

/// 아이콘 인자
class cIconParam
{
public:
	/// 텍스처
	NiTexture* mpTexture;

	/// 텍스처 위치 좌표
	cUIPos mTexPos;
};

/// 아이콘
class cIcon : public cUINode
{
public:
	cIcon( eUINodeType type = eUINODE_ICON );
	virtual ~cIcon();

	/// 아이콘 활성화 (이벤트는 받되, 비활성화 )
	void SetUsedFlag( bool enable, bool colorchange = true );
	bool IsEnableUse();

	/// 드래그중이면 게이지 안보임
	void ShowGauge( bool show );
	void ChangeGauge( cUIRoundGauge& gauge );
	cUIRoundGauge& GetGauge() { return mGauge; }

	///
	bool IsActive();
	void StartDelay( unsigned long delayTime );
	void StopDelay();
	void SetElapsedTime( unsigned long delta );

	/// 이미지
	void ShowImage( bool show );
	void ChangeImage( cIconParam* param, unsigned int texW = 0, unsigned int texH = 0 );

	/// 색상
	void SetColor( const NiColorA& color );
	void SetColor( float r, float g, float b, float a );
	const NiColorA& GetColor() const;

	/// 아이콘 인자
	cIconParam* GetIconParam() const;

	/// 번호
	unsigned int GetNumber() { return mNumber; }
	void SetNumber( unsigned int num );

	/// 갯수 보기 여부 
	void ShowNumber( bool show );
	bool IsShowNumber() const;

	void SetTipType( unsigned int type );
	unsigned int GetTipType() { return mTipType; }
	
	/// 아이콘에 애니메이션 적용 여부 세팅
	void SetAniEnable( bool enable );

	/// 애니메이션 세팅
	void SetAuraOn( bool set );
	bool IsAuraOn();

	void SetAniParam( sAniParam* param );
	sAniParam* GetAniParam() { return mAniParam; }

	void SetIconType( eIconType type );
	unsigned int GetIconType();

protected:
	virtual bool IsValid() const;
	virtual bool SetSkin( const cUINodeSkin* skin );
	virtual void UpdateRect();

	/// 이벤트
	virtual bool HandleEvent( const cUIEvent& event );
	virtual bool OnCreate( cUINodeProperty* pproperty );
	virtual void OnProcess( unsigned long deltaTime, unsigned long accumTime );
	virtual void OnRender( cUIFontItemKeeper* pKeeper );
	virtual void OnMouseHovered(const cUIPos& pos );
	virtual void OnMouseMove( const cUIPos& pos );
	virtual void OnMouseLeft(const cUIPos& pos );
	virtual void OnLButtonDown( const cUIPos& pos, bool ctrl, bool alt, bool shift );
	virtual void OnLButtonUp( const cUIPos& pos );
	virtual void OnLButtonDoubleClick( const cUIPos& pos );
	virtual void OnRButtonDown( const cUIPos& pos, bool ctrl, bool alt, bool shift );
	
	/// 각 타이머
	void OnTimer( unsigned int type );
	void SetAniOn( eAniType type, short frame = 0 );

protected:
	/// 아이콘 타입 
	int mIconType;

	/// 이미지
	bool mShowImage;
	
	/// 원형 게이지
	cUIRoundGauge mGauge;

	/// 아이콘 인자
	cIconParam* mParam;

	/// 이미지 폰트
	cUIImageFont* mImageFont;

	/// 번호 (아이템 개수)
	unsigned int mNumber;
	cString mNumText;

	/// 쉬프트 눌림
	bool mShiftDown;

	/// 드래그 여부에 따른 게이지 쇼 여부
	bool mShowGauge;

	/// 
	bool mShowNumber;

	/// 아이콘활성화 여부 (이동가능)
	bool mEnableUse;

	NiColorA mColor;

protected:
	/// 애니메이션을 사용하는 아이콘인지 설정
	bool		mAniEnable;

	/// 카운트용 이미지 ( 애니메이션 )
	cPlaneObject*	mpCountImage;

	/// 반짝이는 이미지 ( 애니메이션 )
	cPlaneObject*	mpFlashImage;

	/// 오라스킬용 테두리 이미지( 애니메이션 )
	cPlaneObject*	mpEdgeImage;

	/// 애니메이션 정보 저장
	sAniParam	mAniParam[ eANI_MAX ];

	/// 툴팁색상에 따른 이미지 보기 여부 (레어도 관련)
	cUIImage*		mpTipImage;
	eTooltipType	mTipType;		/// 팁 컬러 타입
};


inline
void cIcon::SetIconType( eIconType type )
{
	mIconType = type;
}

inline
unsigned int cIcon::GetIconType()
{
	return mIconType;
}

inline
bool cIcon::IsEnableUse()
{
	return mEnableUse;
}

inline
void cIcon::ShowImage( bool show )
{
	mShowImage = show;
}

inline
void cIcon::SetColor( const NiColorA& color )
{
	mColor = color;

	if( mpImage )
		mpImage->SetColor( color );
}

inline
void cIcon::SetColor( float r, float g, float b, float a )
{
	mColor = NiColorA(r,g,b,a);

	if( mpImage )
		mpImage->SetColor( NiColorA(r,g,b,a) );
}

inline
const NiColorA& cIcon::GetColor() const
{
	if( mpImage )
		return mpImage->GetColor();

	return NiColorA::WHITE;
}

inline
cIconParam* cIcon::GetIconParam() const
{
	return mParam;
}

inline
void cIcon::SetNumber( unsigned int num )
{
	mNumber = num;
	mNumText.Format( "%d", num );
}

inline
void cIcon::ShowNumber( bool show )
{
	mShowNumber = show;
}

inline
bool cIcon::IsShowNumber() const
{
	return mShowNumber;
}

inline
void cIcon::SetAniEnable( bool enable )
{
	mAniEnable = enable;
}

////////////////////////////////////////////////////////////////////////////////
/// 아이콘 스킨
class cIconSkin : public cUINodeSkin
{
public:
	cIconSkin( eUINodeType type = eUINODE_ICON );
	virtual ~cIconSkin();

	/// 로딩
	virtual bool Load( cParser& parser );
};
