#include "stdafx.h"
#include "res/ResExtractData.h"
#include "Susie.h"
#include "SusieListView.h"

void CSusieListView::Create(HWND hWnd, SOption& option, int x, int y, int cx, int cy)
{
	Init(hWnd, option);

	std::vector<LVCOLUMN> lvcols;
	LVCOLUMN lvcol;

	lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	lvcol.fmt = LVCFMT_LEFT;
	lvcol.cx = 102;
	lvcol.pszText = _T("Plugin Name");
	lvcols.push_back(lvcol);

	lvcol.fmt = LVCFMT_LEFT;
	lvcol.cx = 207;
	lvcol.pszText = _T("Info");
	lvcols.push_back(lvcol);

	lvcol.fmt = LVCFMT_LEFT;
	lvcol.cx = 62;
	lvcol.pszText = _T("Support");
	lvcols.push_back(lvcol);

	lvcol.fmt = LVCFMT_LEFT;
	lvcol.cx = 54;
	lvcol.pszText = _T("Version");
	lvcols.push_back(lvcol);

	// リストビュー作成
	HWND hList = CListView::Create(idsSusieList, lvcols, x, y, cx, cy);

	// リストビューにチェックボックス追加
	DWORD dwStyle = ListView_GetExtendedListViewStyle(hList);
	dwStyle |= LVS_EX_CHECKBOXES;
	ListView_SetExtendedListViewStyle(hList, dwStyle);

	ListView_SetCallbackMask(hList, LVIS_STATEIMAGEMASK);
}

void CSusieListView::Show()
{
	CSusie susie;
	ListView_SetItemCountEx(m_hList, susie.GetSusieTmp().size(), LVSICF_NOINVALIDATEALL);
}

void CSusieListView::Show(NMLVDISPINFO* pDispInfo)
{
	CSusie				clSusie;

	static std::vector<SSusieInfo>&	rvcSusieInfos = clSusie.GetSusieTmp();

	if( pDispInfo->item.mask & LVIF_TEXT )
	{
		switch( pDispInfo->item.iSubItem )
		{
			case	0:
				// プラグイン名表示

				lstrcpy( pDispInfo->item.pszText, rvcSusieInfos[pDispInfo->item.iItem].clsName );
				break;

			case	1:
				// プラグイン情報表示

				lstrcpy( pDispInfo->item.pszText, rvcSusieInfos[pDispInfo->item.iItem].clsInfo );
				break;

			case	2:
				// サポートフォーマット表示

				lstrcpy( pDispInfo->item.pszText, rvcSusieInfos[pDispInfo->item.iItem].clsSupportFormat );
				break;

			case	3:
				// バージョン情報表示

				lstrcpy( pDispInfo->item.pszText, rvcSusieInfos[pDispInfo->item.iItem].clsVersion );
				break;
		}
	}

	if( pDispInfo->item.mask & LVIF_STATE )
	{
		pDispInfo->item.state = m_pOption->bSusieUse ? INDEXTOSTATEIMAGEMASK( rvcSusieInfos[pDispInfo->item.iItem].bValidity + 1 ) : 0;
	}
}

void CSusieListView::ShowTip(LPNMLVGETINFOTIP ptip)
{
	CSusie				clSusie;

	static std::vector<SSusieInfo>&	rvcSusieInfos = clSusie.GetSusieTmp();

	switch( ptip->iSubItem )
	{
		case	0:
			// dwFlagsが0のとき(文字が隠れているとき)に表示する
			// dwFlagsが1のときは文字が隠れていないときである(左端のカラムは隠れていないときでも表示してしまう)

			if( ptip->dwFlags == 0 )
			{
				lstrcpy( ptip->pszText, rvcSusieInfos[ptip->iItem].clsName );
			}
			break;

		case	1:

			lstrcpy( ptip->pszText, rvcSusieInfos[ptip->iItem].clsInfo );
			break;

		case	2:

			lstrcpy( ptip->pszText, rvcSusieInfos[ptip->iItem].clsSupportFormat );
			break;

		case	3:

			lstrcpy( ptip->pszText, rvcSusieInfos[ptip->iItem].clsVersion );
			break;
	}
}

BOOL CSusieListView::CustomDraw(LPNMLVCUSTOMDRAW plvcd)
{
	CSusie				clSusie;

	static std::vector<SSusieInfo>&	rvcSusieInfos = clSusie.GetSusieTmp();
	static SOption* pOption = m_pOption;

	switch( plvcd->nmcd.dwDrawStage )
	{
		case	CDDS_PREPAINT:
			// 描画前

			SetWindowLongPtr( m_hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW );
			return	TRUE;


		case	CDDS_ITEMPREPAINT:
			// アイテム描画前

			if( rvcSusieInfos[plvcd->nmcd.dwItemSpec].bConfig && pOption->bSusieUse )
			{
				// ConfigurationDlgが定義されている

				plvcd->clrText = RGB( 0, 0, 255 );
				SetWindowLong( m_hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW );

				return	TRUE;
			}
			break;
	}

	return	FALSE;
}

void CSusieListView::CreateMenu(LPARAM lp)
{
	int					nItem = GetFocusItem();

	if( nItem == -1 )
	{
		return;
	}

	CSusie				clSusie;

	m_SusieInfo = clSusie.GetSusieTmp()[nItem];

	if( !m_SusieInfo.bConfig )
	{
		return;
	}

	POINT pt;
	pt.x = LOWORD(lp);
	pt.y = HIWORD(lp);
	HMENU rMenu = LoadMenu(m_hInst, _T("SUSIEMENU"));
	HMENU rSubMenu = GetSubMenu(rMenu, 0);
	TrackPopupMenu(rSubMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, m_hWnd, NULL);
	DestroyMenu(rMenu);
}

BOOL CSusieListView::SetCheck()
{
	// リストビュー上におけるマウスカーソル位置取得
	LVHITTESTINFO htInfo;
	GetCursorPos(&htInfo.pt);
	ScreenToClient(m_hList, &htInfo.pt);

	// マウスカーソル位置にあるアイテム番号とサブアイテム番号取得
	htInfo.flags = LVHT_ONITEMLABEL;
	ListView_SubItemHitTest(m_hList, &htInfo);

	// アイテム番号が-1(範囲外)、またはサブアイテム番号が0以外(左端じゃない)場合はチェックボックスではない
	if (htInfo.iItem == -1 || htInfo.iSubItem != 0)
		return FALSE;

	// チェックボックスの座標領域取得
	RECT rc;
	ListView_GetSubItemRect(m_hList, htInfo.iItem, htInfo.iSubItem, LVIR_BOUNDS, &rc);
	rc.left = 0;
	rc.right = 18;

	// マウスカーソルのX座標がチェックボックスの座標領域内ならチェック処理を行う
	if (htInfo.pt.x >= rc.left && htInfo.pt.x <= rc.right) {
		CSusie susie;
		susie.GetSusieTmp()[htInfo.iItem].bValidity ^= 1;
		InvalidateRect(m_hList, &rc, FALSE);
		return TRUE;
	}

	return FALSE;
}

void CSusieListView::SetCheckAll(BOOL flag)
{
	CSusie susie;
	std::vector<SSusieInfo>& SusieInfos = susie.GetSusieTmp();
	for (int i = 0; i < (int)SusieInfos.size(); i++)
		SusieInfos[i].bValidity = flag;

	RECT rc;
	GetClientRect(m_hList, &rc);
	rc.left = 0, rc.right = 18;
	InvalidateRect(m_hList, &rc, FALSE);
}