#include "stdafx.h"
#include "../res/ResExtractData.h"
#include "DataBase.h"
#include "DBListView.h"

// データベースリストの値をセットするメソッド
void CDBListView::Create(HWND hWnd, OPTION& option)
{
	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 = 45;
	lvcol.pszText = _T("No.");
	lvcols.push_back(lvcol);

	lvcol.fmt = LVCFMT_LEFT;
	lvcol.cx = 305;
	lvcol.pszText = _T("Path");
	lvcols.push_back(lvcol);

	lvcol.fmt = LVCFMT_RIGHT;
	lvcol.cx = 90;
	lvcol.pszText = _T("File Count");
	lvcols.push_back(lvcol);

	CListView::Create(idsDataBaseList, lvcols);
}

void CDBListView::Show(NMLVDISPINFO* pDispInfo)
{
	switch (pDispInfo->item.iSubItem) {
		case 0: // No.表示
			wsprintf(pDispInfo->item.pszText, _T("%6d."), pDispInfo->item.iItem + 1);
			break;
		case 1: // パス表示
			_tcscpy_s(pDispInfo->item.pszText, pDispInfo->item.cchTextMax, m_entDB[pDispInfo->item.iItem].path.c_str());
			break;
		case 2: // ファイル数表示
			_tcscpy_s(pDispInfo->item.pszText, pDispInfo->item.cchTextMax, m_entDB[pDispInfo->item.iItem].sCtFile.c_str());
			break;
	}
}

// ソート用の比較関数
BOOL CDBListView::CompareFunc(const FILEINFODB& a, const FILEINFODB& b)
{
	static SORTPARAM* pSort = m_s_pSort;
	switch (pSort->column) {
		case 1:
			return (retCompare(a.path, b.path));
		case 2:
			return (retCompare(a.ctFile, b.ctFile));
	}
	return FALSE;
}

void CDBListView::Sort()
{
	// 静的メンバ変数にコピー
	m_s_pSort = &m_sort;
	// ソート
	std::sort(m_entDB.begin(), m_entDB.end(), CompareFunc);
	InvalidateRect(m_hList, NULL, FALSE);
}

// データベースリストをソートする関数
void CDBListView::Sort(int column)
{
	// 静的メンバ変数にコピー
	m_s_pSort = &m_sort;
	// No.をクリック、または前回ソートした項目と同じだったら逆順にする
	if ((column == 0) || (m_sort.column == column)) {
		m_sort.direct ^= 1;
		std::reverse(m_entDB.begin(), m_entDB.end());
	}
	else {
		m_sort.direct = 0;
		std::sort(m_entDB.begin(), m_entDB.end(), CompareFunc);
	}
	InvalidateRect(m_hList, NULL, FALSE);
}

// データベースリストを再描画する関数
void CDBListView::Update(int StartItem)
{
	// 項目数更新
	ListView_SetItemCountEx(m_hList, m_entDB.size(), LVSICF_NOINVALIDATEALL | LVSICF_NOSCROLL);

	// 0個になると選択状態で再描画されないので、ちゃんと再描画
	if (m_entDB.empty())
		ListView_Update(m_hList, 0);

	else {
		int nCountPerPage = ListView_GetCountPerPage(m_hList);
		int nVisibleLast = StartItem + nCountPerPage;

		// リストビュー再描画(選択状態にすると再描画される。かなり強引技ｗ)
		for (int i = StartItem; i <= nVisibleLast; i++)
			ListView_SetItemState(m_hList, i, LVIS_SELECTED, LVIS_SELECTED);
		ListView_SetItemState(m_hList, -1, 0, LVIS_SELECTED);
	}
}