// ★コメント未記入
// EditDrawer.cpp: CEditDrawer クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "EditDrawer.h"
#include <string.h>
#include "GeneralSetting.h"
#include "Selection.h"
#include "ROISelection.h"
#include "Common.h"
#include "resource.h"
#include "ShitarabianPlugInManager.h"
#include "ShitarabianPlugIn.h"
#include "ExeCommon.h"
#include "EmphasisLine.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


long CEditDrawer::DrawString(
	const char*			pstrSrc,
	CDC*				pDstDC,
	CEmphasisDefine*	pEmphasisDefine,
	BOOL				bCareEmphasis
)
{
	int			lColumn = 0;
	int			idxByte = 0;

	int			iStartX = GetDstX();

	COLORREF	colForeNatural = ::GetForeColor( EMPHASIS_TEXT );
	COLORREF	colBackNatural = ::GetBackColor( EMPHASIS_TEXT );
	COLORREF	colFore = colForeNatural;
	COLORREF	colBack = colBackNatural;

	// フォントの設定
	ReflectFont( pDstDC );


//　　１文字づつ選択状態を見ながら
//　　　　・必要であればFillSolidRectで塗りつぶす。
//　　　　・選択有無とＸサイズをリストに保存していく。
//	CList<BOOL, BOOL>			abSelectedz;
	CList<COLORREF, COLORREF>	acolForez;
	CList<int, int>				aiWidthz;
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4101
// ▽ original BGN
//	BOOL	bSelected;
// △ original END
// ▲ (ワーニング回避) END

	// 強調表示文字列長さ
	int		nEmphasisByte = 0;
	// 強調表示設定取得
	CArray<CEmphasisItem, CEmphasisItem&>&	aEmphasisz = pEmphasisDefine->GetItemz();

	while( TRUE )
	{
		long	lX = GetDstX();

		if ( nEmphasisByte <= 0 )
		{
			// 表示色初期化
			colFore = colForeNatural;
			colBack = colBackNatural;

			if ( *(pstrSrc+idxByte) != 0x00 )
			{
			// フツーの文字であれば強調表示設定の検索
//				if ( lX <= iWidth )
				if ( bCareEmphasis )
				{
				// 強調表示すべき文字列か？

					int		idxEmphasis;
					for( idxEmphasis=0 ; idxEmphasis<aEmphasisz.GetSize() ; idxEmphasis++ )
					{
						if ( aEmphasisz[idxEmphasis].GetEnable() )
						{
							CString		strEmphasis = aEmphasisz[idxEmphasis].GetPattern();
							if( 0 == memcmp( (LPCTSTR)(strEmphasis), pstrSrc+idxByte, strEmphasis.GetLength() ) )
							{
								nEmphasisByte = strEmphasis.GetLength();
								colFore = aEmphasisz[idxEmphasis].GetForeColor();
								colBack = aEmphasisz[idxEmphasis].GetBackColor();
								break;
							}
						}
					}
				}
			}
		}

		// 文字の大きさ計算
		int		iPrintedByte = 0;
		int		iPrintedColum = 0;
		CSize	sizeExtent;
		{
			sizeExtent = ExtentCharactor(
				pstrSrc + idxByte,
				pDstDC,
				&iPrintedByte,
				&iPrintedColum,
				GetDstX()
			);
		}

		if ( nEmphasisByte >= 0 )
		{
			// 標準の背景色は壁紙表示のためヌキ色とする。
			// 標準の背景色でないときだけ塗りつぶす。
			if ( colBackNatural != colBack )
			{
				pDstDC->FillSolidRect(
					lX,
					GetDstY(),
					sizeExtent.cx,
					sizeExtent.cy,
					colBack
				);
			}
		}

		lX += sizeExtent.cx;
		SetDstX( lX );

		if ( nEmphasisByte >= 0 )
		{
			nEmphasisByte -= iPrintedByte;
		}

		acolForez.AddTail( colFore );
		aiWidthz.AddTail( sizeExtent.cx );

		// 行末判定
		if ( *(pstrSrc+idxByte) == 0x00 )
		{
			break;
		}

		idxByte += iPrintedByte;
		lColumn += iPrintedColum;
	}

	// 横幅確定
	long lWidth = GetDstX() - iStartX;

//　　１文字づつリストの選択有無を見ながら
//　　　　・文字を描画する
	idxByte = 0;
	SetDstX( iStartX );
	POSITION	posForeColor = acolForez.GetHeadPosition();
	POSITION	posWidth = aiWidthz.GetHeadPosition();
	while( *(pstrSrc+idxByte) != 0x00 )
	{
		pDstDC->SetTextColor( acolForez.GetNext(posForeColor) );

		int		iPrintedChar;
		int		iExtentChar = aiWidthz.GetNext( posWidth );
		DrawCharactor(
			pstrSrc + idxByte,
			pDstDC,
			&iPrintedChar,
			iExtentChar,
			CGeneralSetting::GetInstance()->GetBoxCharDefine()->IsBox( pstrSrc + idxByte )
		);

		SetDstX( GetDstX() + iExtentChar );

		idxByte += iPrintedChar;
	}

	// フォントの復帰
	RestoreFont( pDstDC );

	return( lWidth );
}

