/*-----------------------------------------------------------------------------
[名称]	EmphasisLine.h
[概要]	色付き文字列クラスのヘッダ
[備考]	なし
[履歴]	2003-02-03	NC		コメント付加(moralog)
		2004-05-27 (3344)	共通設定のユニコード文字で追加のボタンを押すと強制終了(moralog)
-----------------------------------------------------------------------------*/
// please! 行インデクスを渡す関数がいっぱいあるが、
// ＥＯＦかＥＯＬかなんて描画するときにだけつかえばいいんじゃないか？
#if !defined(AFX_EMPHASISLINE_H_INCLUDED_)
#define AFX_EMPHASISLINE_H_INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//-----------------------------------------------------------------------------
// インクルード・不完全定義
//-----------------------------------------------------------------------------
#include <afxtempl.h>
class CEmphasisDefine;

/*-----------------------------------------------------------------------------
[名称]	文字コード種別
[用途]	表示ルーチンの切り替えに使用する。
[備考]	なし
-----------------------------------------------------------------------------*/
enum ECharCodeType{
	TypeShiftJis,		// ShiftJIS
	TypeUnicode,		// Unicode
	TypeEOL,			// 行末尾
	TypeEOF,			// ファイル末尾
};

/*-----------------------------------------------------------------------------
[名称]	強調表示文字情報
[用途]	１文字の表示情報を保持する。
[備考]	ShiftJisコードの文字の場合、バイト数1〜２、カラム数１となる。
						キャラクタコードにはShiftJisコードが入る。
						１バイト文字の時、２バイト目は不定。
		Unicodeの場合、バイト数（複数）＝カラム数（複数）
						キャラクタコードにはUnicodeが入る。
-----------------------------------------------------------------------------*/
typedef struct
{
	ECharCodeType	eType;			// 文字コード種別 [-] (-)
// ▼ (3344) BGN 2004.05.27 (moralog) 違う文字コードを表示しようとする不具合
	UCHAR			aiCode[2];		// キャラクタコード [-] (-)
// ▽ original BGN
//	char			aiCode[2];		// キャラクタコード [-] (-)
// △ original END
// ▲ (3344) END
	WORD			idxEmphasis;	// 強調表示種類 [CEmphasisDefine::GetItemz()のインデクス] (-)
	WORD			iWidth;			// 表示幅 [-] (0〜)
	char			nByte;			// バイト数 [-] (1〜)
	char			nColumn;		// カラム数 [-] (1〜)
	BOOL			bBox;			// BOX表示する [-] (TRUE:する、FALSE:しない)
} TEmphasisChar;


/*-----------------------------------------------------------------------------
[名称]	色付き文字列クラス
[用途]	強調表示設定を反映した文字列の情報を格納する。
[備考]	強調表示定義を反映する。
表示色解析の流れ。
	・Doc読み込み時に AnalizeStringMultiLineEmphasis() される。
		→複数行表示色の連結情報が構築される。
	・表示時に Analize() される。
		→文字列すべての表示色情報が構築される。
-----------------------------------------------------------------------------*/
class CEmphasisLine  
{
public:
	// 生成・破棄
	CEmphasisLine();
	virtual ~CEmphasisLine();

// アトリビュート
	// 文字列設定・取得
	void		SetString( const char* pstrSrc );
	CString*	GetString(){ return( &m_strLine ); };
	// マーク有無設定・取得
	void		SetMark( BOOL bMark ){ m_bMark = bMark; };
	BOOL		IsMark(){ return( m_bMark ); };
	// 更新有無設定・取得
	void		SetModify( BOOL bModify ){ m_bModify = bModify; };
	BOOL		IsModify(){ return( m_bModify ); };

// オペレーション
	// 複製
	BOOL Copy( CEmphasisLine& Src );
	CEmphasisLine& operator = ( CEmphasisLine& Src ){ Copy(Src); return(*this); };

	// 描画
	void Draw(
		CDC*				pDstDC,
		long				lStartX,
		long				lStartY,
		int					iLeftX,
		int					iWidthX,
		BOOL				bCareEmphasis,
		CEmphasisDefine*	pEmphasisDefine,
		BOOL				bCareSelection,
		CShitarabianDoc*	pDoc,
		int					iRow
	);

// 表示色解析系
	// 表示設定すべての初期化
	void	ResetWholeEmphasis();
	// 表示設定詳細（複数行表示色繰越設定以外）の初期化
	void	ResetDetailEmphasis();

	// 複数行表示色連結設定・取得
	short		GetEmphasisNextContinue(){ return( m_idxNextContinueEmphasis ); };
	void		SetEmphasisNextContinue( short idxNextContinueEmphasis ){ m_idxNextContinueEmphasis = idxNextContinueEmphasis; };
	short		GetEmphasisPrevRelation(){ return( m_idxPrevRelationEmphasis ); };
	void		SetEmphasisPrevRelation( short idxPrevRelationEmphasis );

	// 表示色解析済みフラグ設定・取得
	BOOL GetMultiLineEmphasisAnalized(){return(m_bMultiLineEmphasisAnalized);};
	void SetMultiLineEmphasisAnalized( BOOL bAnalized ){ m_bMultiLineEmphasisAnalized = bAnalized; };

	// 表示色情報構築
	BOOL Analize();
	BOOL Analize(
		CDC*				pDstDC,
		CEmphasisDefine*	pEmphasisDefine
	);

	// 複数行表示色の解析をするか
	static void SetAnalizeMultiLineEmphasisEnable( BOOL bEnable ){ m_bEmphasisAnalizeEnable = bEnable; };
	static BOOL	GetAnalizeMultiLineEmphasisEnable(){ return( m_bEmphasisAnalizeEnable ); };

	BOOL AnalizeStringMultiLineEmphasis(
		CDC*				pDstDC,
		CEmphasisDefine*	pEmphasisDefine
	);

	// 複数行表示色設定の終端を検索
	int	SerchEmphasisTerminator(
		CEmphasisDefine*	pEmphasisDefine,
		short				iContinueEmphasis
	);

// サイズ計算系
	// カラム→Ｘピクセル（プレーン）
	long CaretColumnToPixel(
		long			idxChar
	);
	// カラム→Ｘピクセル（表示設定）
	long CaretColumnToPixelZoomed(
		long			idxChar
	);
	// カラム→Ｘピクセル（スクロールアリ？please!）
	long CaretColumnToWindowPixelZoomed(
		long			idxChar
	);
	// Ｘピクセル→カラム（プレーン）
	long PixelToCaretColumn(
		long			iX,
		BOOL			bAbsolute = FALSE
	);
	// Ｘピクセル→カラム（表示設定）
	long PixelToCaretColumnZoomed(
		long			iX,
		BOOL			bAbsolute = FALSE
	);

	// カラム数取得
	long	GetColumnCount();

	// 描画幅取得
	long	GetWidth();


protected:

	// 表示色ブロック情報
	typedef struct{
		int		iStartColumn;		// 開始カラム [-] (-)
		int		nColumn;			// カラム数 [-] (-)
		WORD	idxEmphasisType;	// 強調表示インデクス [-] (-)
		BOOL	bTerminated;		// 終端有無 [-] (-)
	} TEmphasisHit;

	// 行としての情報
	CString		m_strLine;			// 行文字列 [-] (-)
	BOOL		m_bMark;			// マーク有無 [-] (-)
	BOOL		m_bModify;			// 更新有無 [-] (-)

	// 文字列情報
	long		m_lAllWidth;		// 文字列全体のピクセル数 [-] (-)
	long		m_nColumn;			// 文字列全体のカラム数 [-] (-)

	// 表示情報（複数行表示色のみ）
	BOOL		m_bMultiLineEmphasisAnalized;	// 複数行強調表示解析済みフラグ [-] (-)
	short		m_idxPrevRelationEmphasis;		// 前行から繰り越した強調表示種別 [インデクス] (-)
	short		m_idxNextContinueEmphasis;		// 後行へ繰り越す強調表示種別 [インデクス] (-)

	// 表示情報
	BOOL		m_bInitialized;		// 表示色情報構築済みフラグ ｢-] (-)
	CList<TEmphasisChar, TEmphasisChar&>
				m_listCharz;		// 強調表示文字情報リスト ｢-] (-)
	static BOOL	m_bEmphasisAnalizeEnable;
									// 複数行強調表示処理許可フラグ [-] (TRUE:解析ON、FALSE:解析OFF)
									// フローティング貼り付け中は解析を一時的にOFFにし、
									// 表示時に解析する。

	// 表示色解析
	long AnalizeString(
		CDC*				pDstDC,
		CEmphasisDefine*	pEmphasisDefine
	);
	long AnalizeString(
		CEmphasisDefine*	pEmphasisDefine,
		CList< TEmphasisHit, TEmphasisHit& >*	plstEmphasisHitz,
		long				iRelatedColumn
	);
};

#endif // !defined(AFX_EMPHASISLINE_H_INCLUDED_)
