// LineData.h: LineData クラスのインターフェイス
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_LINEDATA_H__750BC0E2_7E3B_426D_B2DE_7C4E99519203__INCLUDED_)
#define AFX_LINEDATA_H__750BC0E2_7E3B_426D_B2DE_7C4E99519203__INCLUDED_

#include "TaEdit_std.h"
#include "DrawCharPos.h"

// 一文字を保持する構造体
typedef struct tagTA_CHAR
{
	tagTA_CHAR( wchar_t argMoji, unsigned char argIro ) {
		moji = argMoji;
		iro = argIro;
	};

	wchar_t moji;
	unsigned char iro;
} TA_CHAR;

class CTaEditDraw;

class CLineData  
{
public:
	CLineData();
	CLineData( const CLineData &r );
	CLineData( const wchar_t *pStr );

	virtual ~CLineData();

	void push_back( TA_CHAR c );

	TA_CHAR operator []( size_t idx ) const;

	unsigned char getIro( int idx ) const;
	void setIro( int idx, unsigned char c );

	const CLineData& operator =( const CLineData &r );

	void set( size_t idx, TA_CHAR c );

	size_t length() const;

	const wstring& getString() const;

	void clear();

	bool InsertBlank( size_t pos, size_t length );

	void Delete( size_t s, size_t e );

	const CTimeSpec& GetModifiedTime() const;

	// 描画位置情報が利用可能か否か
	bool IsEnableDrawCharPos() const;

	const CDrawCharPos& GetDrawCharPos() const;

	// 描画位置を更新
	bool UpdateDrawCharPos( const CTaEditDraw *pDraw ) const;

	// 拡張情報の取得
	bool GetExtendInfo( int idx ) const;

	// 拡張情報の設定
	void SetExtendInfo( int idx, bool f );

protected:
	// 更新された
	void OnUpdate();

	// vIroには改行コードの文の色情報を保持するために
	// 常にvMoji+1の長さとなる。
	wstring vMoji;	// 文字
	vector< unsigned char > vIro;		// 色

	vector< bool > ExtendInfo;	// 行ごとの拡張情報

	CTimeSpec ModifiedTime;	// 最後に変更されたときの時間

	mutable CDrawCharPos DrawCharPos;	// 各文字が描画された位置
};

// 行を保持するデータ型
typedef vector< CLineData > T_LineData;

// T_LineDataのイテレータ
typedef T_LineData::iterator T_LineDataItr;

// T_LineDataのconstなイテレータ
typedef T_LineData::const_iterator T_LineDataItr_c;

#endif // !defined(AFX_LINEDATA_H__750BC0E2_7E3B_426D_B2DE_7C4E99519203__INCLUDED_)
