//--------------------------------------------
// CHISTORY Class - File Historyユーティリティ
// 作成し（SetPathで）iniファイルを設定し、
// Initで過去履歴を読み込んでからAddで追加。
// （ユーザーは検索、削除不使用。）
// Copyright (c) 2020, K. Yoshida
/*
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:
	//変数
	char m_InitPath[MAX_PATH];	//iniファイルパス名
	int	 m_ItemNum;				//履歴数
	char *m_Item[ITEM_MAX];		//履歴データ（文字列）
	HMENU m_hMenu;				//表示用ポップアップメニューハンドル
	//関数
	int DelItem(int num);		//項目削除
	int SrchItem(char* item);	//項目検索（Found−num、Failed−-1）
public:
	//関数
	CHISTORY();			//コンストラクター（Initファイルデフォルト＝".\Init.ini"）
	CHISTORY(char* InitName);	//コンストラクター（iniファイル指定）
	~CHISTORY();				//デコンストラクター（文字列解放）
	void SetPath(char* path);		//iniファイルパス名の設定
	void SetMenu(HMENU menu);		//m_hMenuの設定
	int Init();					//過去履歴初期化
	int AddItem(char* item);	//項目追加
	void WriteIni();			//iniファイル書き込み
};

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

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

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

	lstrcpy(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(char* path) {

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

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

	m_hMenu = menu;
}

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

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

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

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

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

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

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

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