// ★コメント未記入
/********************************************************************************/
// FILENAME   : CEditDrawer.h
// VERSION    : NC
// ABSTRACT   : したらびあん　文字削除コマンドクラス
// AUTHOR     : モラログ＠(新)ビデオ棚
// HISTORY    : 02-05-31	NC	:新規作成(モラログ)
/*
		2003-12-22	b031228 (moralog) 等幅フォントの時はルーラを文字数に
		2003-12-28  b040111 (3632)キャレット位置の強調(moralog)
*/
// NOTE       : なし
// COPYRIGHT  : C2002 (新)モララーのビデオ棚 All Right Reserved.
/********************************************************************************/
#if !defined(AFX_EDITDRAWER_H__26287C73_9E84_45FA_A499_6BB0DF1E1C0A__INCLUDED_)
#define AFX_EDITDRAWER_H__26287C73_9E84_45FA_A499_6BB0DF1E1C0A__INCLUDED_

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


//////////////////////////////////////////////////////////////////////
// インクルード・不完全定義
#include "LogFont.h"
#include "ShitarabianDoc.h"
class CLine;
class CEmphasisDefine;

/********************************************************************************/
// TAG        : CEditDrawer
// ABSTRACT   : 文字描画クラス
// DESCRIPTION: 文字列描画機能を提供する。
// NOTE       : 使用方法：ICommandの使用方法を参照。
//				CGeneralSettingが存在すること。
// HISTORY    : 02-05-31	NC	:新規作成(モラログ)
/********************************************************************************/
class CEditDrawer  
{
public:
	// 生成・破棄
	virtual ~CEditDrawer();
	static CEditDrawer*	GetInstance();

	static void ReflectFont( CDC* pDC );
	static void RestoreFont( CDC* pDC );

	// フォントの変更を反映
	void RecalcFontSize();

	// 座標計算関数群
		// プレーンＸ→拡大Ｘ
		long PixelToZoomedPixel( long iPixel ){ return( iPixel*m_iZoom );};
		// 拡大Ｘ→プレーンＸ
		long ZoomedPixelToPixel( long iZoomedPixel ){ return( iZoomedPixel/m_iZoom );};

		// ウィンドウＹ→カラム
		long WindowPixelToCaretRowZoomed(
			long				iY,
			CShitarabianDoc*	pDoc
		);

		// カラム→ウィンドウＹ
		long CaretRowToWindowPixelZoomed(
			long				iY
		);

		// Ｙピクセル→文字列群の行
		long PixelToCaretRowZoomed(
			long				iY,
			CShitarabianDoc*	pDoc
		);

		// 文字列群の行→Ｙピクセル
		long CaretRowToPixelZoomed(
			long				iRow
		);

		// 文字列→Ｘピクセル
		long	StringToPixelXZoomed(
			const char*		pstrSrc,	// 文字列 [マルチバイト判別] (-)
			CDC*			pDstDC
		){ return( StringToPixelX(pstrSrc, pDstDC)*m_iZoom );};


		// Ｙピクセル→文字列群の行
		long PixelToCaretRow(
			long				iY,
			CShitarabianDoc*	pDoc
		);

		// 文字列群の行→Ｙピクセル
		long CaretRowToPixel(
			long				iRow
		);

		// 文字列→Ｘピクセル
		long	StringToPixelX(
			const char*		pstrSrc,	// 文字列 [マルチバイト判別] (-)
			CDC*			pDstDC
		);



	// ルーラー表示
	void DrawRuler(
		CDC*			pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
		CShitarabianDoc*	pDoc,
// ▲ (3632) END
		int				iDstX,
		int				iDstY
	);
// ▼ (3181) BGN 2003.12.22 (moralog) 等幅フォントの時はルーラを文字数に
	void	DrawRulerUnitPixel(
		CDC*			pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
		CShitarabianDoc*	pDoc,
// ▲ (3632) END
		int				iDstX,
		int				iDstY,
		long			lLeftMargin,
		long			lTopMargin
	);
	void	DrawRulerUnitColumn(
		CDC*			pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
		CShitarabianDoc*	pDoc,
// ▲ (3632) END
		int				iDstX,
		int				iDstY,
		long			lLeftMargin,
		long			lTopMargin
	);
// ▲ (3181) END

	// 行の描画
	long DrawZoomedLine(
		CShitarabianDoc*	pDoc,
		CDC*				pDstDC,
		int					iRow,
		int					iScrollBoxLeft,
		int					iScrollBoxTop
	);

	long DrawPlaneLine(
		CShitarabianDoc*	pDoc,
		CDC*				pDstDC,
		int					iRow,
		BOOL				bCareSelection = TRUE
	);

	long DrawString(
		const char*			pstrSrc,
		CDC*				pDstDC,
		CEmphasisDefine*	pEmphasisDefine,
		BOOL				bCareEmphasis = TRUE
	);

	CSize ExtentEOFCharactor(
		CDC*			pDstDC
	);
	CSize ExtentCharactor(
		const char*		pstrSrc,
		CDC*			pDstDC,
		int*			pnPrintedByte,		// 処理バイト数
		int*			pnPrintedColumn,	// 処理カラム数
		int				iStartX				// 表示開始X座標（-方向のオフセット）
	);

	void DrawCharactor(
		const char*		pstrSrc,
		CDC*			pDstDC,
		int*			pnPrintedByte,		// 処理バイト数
		int				iExtentChar,
		BOOL			bBox
	);

	void DrawSJisCharactor(
		const char*		pstrSrc,
		CDC*			pDstDC,
		int*			pnPrintedByte,		// 処理バイト数
		int				iExtentChar,
		BOOL			bBox
	);


	// 選択範囲関数群
		// 選択範囲設定
		void SetSelected(
			int	idxSelcted,
			int	nSelected
		){ m_idxSelected=idxSelcted; m_nSelected = nSelected; };

	// 描画ウィンドウ大きさ設定
	void SetUpdateRect(
		CRect&	rcUpdate
	){ m_rcUpdate = rcUpdate; };

	int	GetZoom(){ return( m_iZoom ); };
	void SetZoom( int iZoom ){ if ( iZoom>0 ){m_iZoom = iZoom;} };

	// 基準サイズ取得
	long GetBlankWidth();
	long GetBlankHeight();
	long GetEOFWidth();

	long GetBlankWidthZoomed(){ return(GetBlankWidth()*m_iZoom); };
	long GetBlankHeightZoomed(){ return(GetBlankHeight()*m_iZoom); };


	long GetCharWidth( CDC* pDC, CString str );

	// 描画先
	inline long	GetDstX(){ return(m_iDstX); };
	inline long	GetDstY(){ return(m_iDstY); };
	inline void	SetDstX( long iDstX ){ m_iDstX = iDstX; };
	inline void	SetDstY( long iDstY ){ m_iDstY = iDstY; };

	// 末尾文字の描画
	void DrawEOL(
		CDC*	pDstDC,
		BOOL	bEOF,
		BOOL	bSelected
	);

protected:
	int				m_idxSelected;
	int				m_nSelected;

	int				m_iZoom;

	CRect			m_rcUpdate;			// 更新要求矩形[スクロールしたボックス内] (-)

	int				m_iDstX;
	int				m_iDstY;

	CLogFont		m_LogFont;

	static CString	m_strBlank;

	int				m_iBlankWidth;
	int				m_iBlankHeight;

	int				m_iEOFWidth;
	CString			m_strEOF;

protected:


	void QuickStretchBlt(
		CBitmap*	pbmpSrc,
		CBitmap*	pbmpDst
	);

private:
	CEditDrawer();

};

#endif // !defined(AFX_EDITDRAWER_H__26287C73_9E84_45FA_A499_6BB0DF1E1C0A__INCLUDED_)
