/////////////////////////////
// ECCSkelton
// CHISTORYクラス定義ファイル
// Copyright (c) August, 2022
//        By Ysama
/////////////////////////////
// ①インスタンスを作成
// ②SetPathでiniファイルを設定
// ③Initで過去履歴を読み込み
// ④Addで追加
// 注：ユーザーは検索、削除は使えない。
/*
typedef struct tagMENUITEMINFO {
    UINT    cbSize; 
    UINT    fMask; 
    UINT    fType; 
    UINT    fState; 
    UINT    wID; 
    HMENU   hSubMenu;
    HBITMAP hbmpChecked; 
    HBITMAP hbmpUnchecked; 
    DWORD   dwItemData; 
    LPTSTR  dwTypeData; 
    UINT    cch; 
} MENUITEMINFO, FAR *LPMENUITEMINFO;
*/
//--------------------------------------------
#define		IDM_HISTORY	59900
#define		ITEM_MAX	32

class CHISTORY
{
private:
	//変数
	WCHAR m_InitPath[MAX_PATH];	//iniファイルパス名
	int	 m_ItemNum;				//履歴数
	WCHAR *m_Item[ITEM_MAX];	//履歴データ（文字列）
	HMENU m_hMenu;				//表示用ポップアップメニューハンドル
	//関数
	int DelItem(int num);		//項目削除
	int SrchItem(WCHAR* item);	//項目検索（Found－num、Failed－-1）
public:
	//関数
	CHISTORY();					//コンストラクター（Initファイルデフォルト＝".\Init.ini"）
	CHISTORY(WCHAR* InitName);	//コンストラクター（iniファイル指定）
	~CHISTORY();				//デストラクター（文字列解放）
	void SetPath(WCHAR* path);	//iniファイルパス名の設定
	void SetMenu(HMENU menu);	//m_hMenuの設定
	int Init();					//過去履歴初期化
	int AddItem(WCHAR* item);	//項目追加
	void WriteIni();			//iniファイル書き込み
};

//コンストラクター（Initファイルデフォルト＝".\Init.ini"）
CHISTORY::CHISTORY() {

	lstrcpyW(m_InitPath, L".\\Init.ini");	//iniファイルパス名保存
	m_ItemNum = 0;
	m_Item[0] = 0;
	m_hMenu = 0;
}

//コンストラクター（Initファイル指定）
CHISTORY::CHISTORY(WCHAR* InitName) {

	lstrcpyW(m_InitPath, InitName);			//iniファイルパス名保存
	m_ItemNum = 0;
	m_Item[0] = 0;
	m_hMenu = 0;
}

//デストラクター（文字列解放）
CHISTORY::~CHISTORY() {

	for(int i = m_ItemNum - 1; i >= 0; i--)
		delete [] m_Item[i];
}

//iniファイルパス名の設定
void CHISTORY::SetPath(WCHAR* path) {

	lstrcpyW(m_InitPath, path);				//iniファイルパス名設定
}

//m_hMenuの設定
void CHISTORY::SetMenu(HMENU menu) {

	m_hMenu = menu;
}

//過去履歴初期化
int CHISTORY::Init() {

	WCHAR buff[MAX_PATH];
	wsprintfW(buff, L"Item%d", m_ItemNum);
	//ファイルの読み込み
	while(GetPrivateProfileStringW(L"History", buff, L"", buff, MAX_PATH, m_InitPath)) {
		m_Item[m_ItemNum] = new WCHAR[lstrlen(buff) + 1];
		lstrcpyW(m_Item[m_ItemNum], buff);
		if(m_hMenu) {		//メニュー設定があればitem項目を追加
			if(!m_ItemNum)	//m_ItemNumが0であれば既存の"（None）"を削除
				DeleteMenu(m_hMenu, 0, MF_BYPOSITION);
			MENUITEMINFOW mii = {0};
			mii.cbSize		= sizeof(MENUITEMINFO);
			mii.fMask		= MIIM_ID | MIIM_STRING;
			mii.wID			= IDM_HISTORY + m_ItemNum;
			mii.dwTypeData	= m_Item[m_ItemNum];
			InsertMenuItemW(m_hMenu, m_ItemNum, TRUE, &mii);
		}
		m_ItemNum++;
		wsprintfW(buff, L"Item%d", m_ItemNum);
	}
	return m_ItemNum;
}

//項目追加
int CHISTORY::AddItem(WCHAR* item) {

	if(m_ItemNum == ITEM_MAX)		//項目数限度を超えたら
		DelItem(0);					//一番旧いものを削除
	int i;
	if((i = SrchItem(item)) > -1)	//既に履歴がある項目があれば
		DelItem(i);					//旧い方を削除
	m_Item[m_ItemNum] = new WCHAR[lstrlenW(item) + 1];
	lstrcpyW(m_Item[m_ItemNum], item);
	if(m_hMenu) {		//メニュー設定があればitem項目を追加
		if(!m_ItemNum)	//m_ItemNumが0であれば既存の（None）を削除
			DeleteMenu(m_hMenu, 0, MF_BYPOSITION);
		MENUITEMINFOW mii = {0};
		mii.cbSize		= sizeof(MENUITEMINFO);
		mii.fMask		= MIIM_ID | MIIM_STRING;
		mii.wID			= IDM_HISTORY + m_ItemNum;
		mii.dwTypeData	= m_Item[m_ItemNum];
		InsertMenuItemW(m_hMenu, m_ItemNum, TRUE, &mii);
	}
	return m_ItemNum++;
}

//項目削除（Done－New m_ItemNum、Failed－-1）
int CHISTORY::DelItem(int num) {

	if(!m_ItemNum) return -1;		//項目数が0ならFailedで戻る
	if(num >= m_ItemNum) return -1;	//項目数を超えた項目の削除ならFailedで戻る
	delete [] m_Item[num];
	if(m_hMenu)		//メニュー設定があればnum番目の項目を削除
		DeleteMenu(m_hMenu, num, MF_BYPOSITION);
	m_ItemNum--;
	for(int i = num; i < m_ItemNum; i++) {
		m_Item[i] = m_Item[i + 1];
		MENUITEMINFOW mii = {0};
		mii.cbSize	= sizeof(MENUITEMINFO);
		mii.fMask	= MIIM_ID;
		mii.wID	= IDM_HISTORY + i;
		SetMenuItemInfoW(m_hMenu, i, TRUE, &mii);
	}
	m_Item[m_ItemNum] = NULL;
	return m_ItemNum;
}

//項目検索（Found－num、Failed－-1）
int CHISTORY::SrchItem(WCHAR* item) {

	for(int i = 0; i < m_ItemNum; i++) {
		if(!lstrcmpW(m_Item[i], item))
			return i;
	}
	return -1;
}

//iniファイル書き込み
void CHISTORY::WriteIni() {

	WCHAR buff[MAX_PATH];
	for(int i = 0; i < m_ItemNum; i++) {
			//ファイルの書き込み
			wsprintfW(buff, L"Item%d", i);
			WritePrivateProfileStringW(L"History", buff, m_Item[i], m_InitPath);
	}
}
