/* ==========================================================================
* 파    일 : TextCtrl.h
* 목    적 : 텍스트박스용 전용 자료 구조 클래스 
* 작 성 자 : 김가람
* 작 성 일 : 2007-03-12
* 주의사항 :
*===========================================================================*/
#pragma once
#include "UIWindow.h"
#include "PointerQueue.h"

/// 가로행 데이터
struct sTextData
{
	/// 라인
	unsigned int mLine;

	/// 텍스트 컬러
	unsigned long mColor;

	/// 텍스트
	cStringT mText;

	/// 아이템 관련정보 저장
	unsigned long mItemIndex;
	unsigned int mSlotIndex;

	bool mUseInven;
	sTextData()
	{
		mLine = 0;
		mColor = 0;
		mItemIndex = 0;
		mSlotIndex = UINT_MAX;
		mUseInven = false;
	}
};

struct sInvenData : sTextData
{
	sInventory	mInventory;
	sInvenData()
	{
		::memset( &mInventory, 0, sizeof(mInventory) );
	}
};


/// 세로행 데이터
struct sRowTextData
{
	/// sTextData
	tPointerArray<sTextData*>		mColumes;
};

class cTextCtrl : public cUIWindow
{
public:
	cTextCtrl( eUINodeType type = eUINODE_TEXTBOX );
	virtual ~cTextCtrl();

protected:
	/// 데이터를 모두 지움 
	void Clear();

	/// 빈 라인 추가 
	void AddEmptyRow( unsigned int line );

	/// 새로운 라인에 데이터 추가
	void AddNewRow( LPCTSTR str, unsigned long color, unsigned long itemIndex = 0, unsigned int slotIndex = UINT_MAX );

	/// 기존 라인에 연결하여 데이터 추가 ( autoNewline: 자동 뉴라인 증가 )
	void AddPasteRow( bool autoNewline, LPCTSTR str, unsigned long color, unsigned long itemIndex = 0, unsigned int slotIndex = UINT_MAX );
	void AddPasteRowInven( LPCTSTR str, unsigned long color, sInventory inventory );
	
	/// 전체 열 수 정보
	unsigned int		GetRowCount();

	/// 해당 라인 정보 
	sRowTextData*		GetRowData( unsigned int rowIdx );

private:
	void InsertRow( LPCTSTR str, unsigned long color, unsigned long itemIndex, unsigned int slotIndex );
	void InsertColumn( bool autoNewline, LPCTSTR str, unsigned long color, unsigned long itemIndex, unsigned int slotIndex );

	void InsertRowInven( LPCTSTR str, unsigned long color, sInventory inventory );
	void InsertColumnInven( LPCTSTR str, unsigned long color, sInventory inventory );
	
	//	void AddPasteRow( bool func, LPCTSTR str, unsigned long color, unsigned long itemIndex = 0, unsigned int slotIndex = UINT_MAX );
	//	void InsertColumn( LPCTSTR str, unsigned long color, unsigned long itemIndex, unsigned int slotIndex );
	//  void InsertFuncColumn( LPCTSTR str, unsigned long color );

protected:
	/// 문자열 리스트
	typedef tPointerQueue<void*> cTextQueue;
	cTextQueue	mTextQueue;

	/// 한줄에수용하는 문자 폭 
	unsigned int mMaxTextWidth;

	/// 삽입 시 인덱스
	unsigned int mLine;

	/// 리스트가 총 수용하는 라인 수
	unsigned int mTotalMaxNum;

	/// 너비
	unsigned int mLineWidth;

	/// 지워낸갯수
	unsigned int mDelCount;
};

inline unsigned int cTextCtrl::GetRowCount()
{
	return mTextQueue.GetSize();
}