/*-----------------------------------------------------------------------------
[名称]	BoxCharListCtrl.cpp
[概要]	BOX表示文字定義リストコントロールクラスの実装
[備考]	なし
[履歴]	2003-02-24	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "BoxCharListCtrl.h"
#include "EditDrawer.h"
#include "GeneralSetting.h"

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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBoxCharListCtrl::CBoxCharListCtrl()
{
}


/*-----------------------------------------------------------------------------
[名称]	デストラクタ
[機能]	インスタンスの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBoxCharListCtrl::~CBoxCharListCtrl()
{
}


BEGIN_MESSAGE_MAP(CBoxCharListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CBoxCharListCtrl)
		// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
	ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/*-----------------------------------------------------------------------------
[名称]	（描画ハンドラ）
[機能]	行の描画処理。
[戻値]	なし
[備考]	引数についてはCListBox::DrawItem() のヘルプを参照。
-----------------------------------------------------------------------------*/
void CBoxCharListCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

	COLORREF	colBack = RGB(255,255,255);
	COLORREF	colFore = RGB(0,0,0);

	// 選択状態取得
	BOOL	bSelected = ( lpDrawItemStruct->itemState & ODS_SELECTED );
	if ( bSelected )
	{
		colBack = RGB(64,128,128);
		colFore = RGB(255,255,255);
	}

	// 背景塗りつぶし
	pDC->FillSolidRect(
		&(lpDrawItemStruct->rcItem),
		colBack
	);

	// 前景色取得
	int	iLeft = lpDrawItemStruct->rcItem.left;
	pDC->SetTextColor( colFore );

	// 描画データ
	CBoxCharArray& Itemz = m_BoxCharDefine.GetItemz();
	TBoxChar&	tBoxChar = Itemz[ lpDrawItemStruct->itemID ];

	// 有効無効チェック
	{
		CRect rcClient(
			iLeft+2,
			lpDrawItemStruct->rcItem.top,
			iLeft+GetColumnWidth(0),
			lpDrawItemStruct->rcItem.bottom
		);
		if( tBoxChar.bEnable )
		{
			pDC->DrawText(
				"■",
				&rcClient,
				DT_CENTER
			);
		}
		else
		{
			pDC->DrawText(
				"□",
				&rcClient,
				DT_CENTER
			);
		}
	}
	iLeft += GetColumnWidth(0);

	// パターン
	{
		CRect rcClient(
			iLeft+2,
			lpDrawItemStruct->rcItem.top,
			iLeft+GetColumnWidth(1),
			lpDrawItemStruct->rcItem.bottom
		);

		CRgn	rgn;
		rgn.CreateRectRgn(
			rcClient.left,
			rcClient.top,
			rcClient.right,
			rcClient.bottom
		);
		pDC->SelectClipRgn( NULL );
		pDC->SelectClipRgn(
			&rgn,
			RGN_AND
		);

		{
			CString	str;
			if ( tBoxChar.strChar.GetLength() == 0 )
			{
				str.Format( "\"\"" );
			}
			else
			if ( tBoxChar.strChar.GetLength() <= 1 )
			{
				str.Format( "\"%s\"(0x%02x)", tBoxChar.strChar, tBoxChar.strChar[0] );
			}
			else
			{
				str.Format( "\"%s\"", tBoxChar.strChar );
			}

			pDC->TextOut(
				rcClient.left,
				rcClient.top,
				str
			);
		}
		pDC->SelectClipRgn( NULL );
		rgn.DeleteObject();
	}
	iLeft += GetColumnWidth(1);

	// 枠線
	CPen	pen;
	pen.CreatePen( PS_SOLID, 1, RGB(200,200,200 ) );
	CPen*	ppenOld = (CPen*)pDC->SelectObject( &pen );
	pDC->MoveTo( lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom-1 );
	pDC->LineTo( iLeft-1, lpDrawItemStruct->rcItem.bottom-1 );

	iLeft = 0;
	for( int idxColumn=0 ; idxColumn<2 ; idxColumn++ )
	{
		iLeft += GetColumnWidth( idxColumn );
		pDC->MoveTo( iLeft-1, lpDrawItemStruct->rcItem.top );
		pDC->LineTo( iLeft-1, lpDrawItemStruct->rcItem.bottom-1 );
	}

	pDC->SelectObject( ppenOld );
}


/*-----------------------------------------------------------------------------
[名称]	（クリックハンドラ）
[機能]	チェックボックス欄のトグル処理。
[戻値]	なし
[備考]	引数についてはヘルプを参照。
-----------------------------------------------------------------------------*/
void CBoxCharListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// warning C4100:警告の無視
	pNMHDR;

	// チェック部分をクリックした場合、有効無効を切り替える
	CPoint	ptCursor;
	::GetCursorPos( &ptCursor );
	ScreenToClient( &ptCursor );
	int	idxItem = HitTest( ptCursor );
	if ( idxItem != -1 )
	{
		// チェック部分のクリック
		if ( ptCursor.x < GetColumnWidth(0) )
		{
			// 有効無効をトグルする
			CBoxCharArray& Itemz = m_BoxCharDefine.GetItemz();
			Itemz[idxItem].bEnable = !Itemz[idxItem].bEnable;

			Update( idxItem );
		}
	}

	*pResult = 0;
}
