#if !defined(AFX_COMBOBOXEX2_H__75711519_94A9_4B25_8F1C_DA0C1BE3CEA2__INCLUDED_)
#define AFX_COMBOBOXEX2_H__75711519_94A9_4B25_8F1C_DA0C1BE3CEA2__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// comboboxex2.h : ヘッダー ファイル
//

#include "MfcExtSingleData.h"
#include "MyuIniReader.h"

/////////////////////////////////////////////////////////////////////////////
// CComboBoxEx2 ウィンドウ

namespace mwlmfc{

//class CComboBoxEx2 : public CComboBox
class CComboBoxEx2 : public CMfcExtSingleData<CComboBox>
{
// コンストラクション
public:
	CComboBoxEx2();

// アトリビュート
public:

// オペレーション
public:

// オーバーライド
	// ClassWizard は仮想関数のオーバーライドを生成します。
	//{{AFX_VIRTUAL(CComboBoxEx2)
	//}}AFX_VIRTUAL

// インプリメンテーション
public:
	virtual ~CComboBoxEx2();

	//operator =(const char* s){ CMfcExtSingleData<CComboBox>::operator =(s); }

	MESD_OPERATOR_EQ;

	//	全部削除
	void DeleteAllItem( BOOL bTextClear=TRUE );

	//	staticなので注意！ -> staticじゃなくした
	/*
	const char* operator[] ( int i ){
		/*static CString cstrWork;
		CComboBox::GetLBText(i,cstrWork);
		return cstrWork;*//*
		CComboBox::GetLBText(i,m_operator_affix_cstrWork);
		return m_operator_affix_cstrWork;
	}*/
	CString operator[] (int i){
		CString cstrWork;
		CComboBox::GetLBText(i,cstrWork);
		return cstrWork;
	}

	//	ForceCurSelUpdate()を実行する - 2007/01/23
	operator LPCTSTR(){
		ForceCurSelUpdate();	
		return CMfcExtSingleData<CComboBox>::operator LPCTSTR();
	}

	//	モード設定
	void EnableRememberText(){ m_bRememberText = TRUE; }
	void DisableRememberText(){ m_bRememberText = FALSE; }

	//	INIファイルへの読み書き
	BOOL ExportToIni( const char* szIni, const char* szSection );
	BOOL ImportFromIni( const char* szIni, const char* szSection );

	//	AddString()をオーバーライド
	int AddString( LPCTSTR lpszString )
	{
		if ( m_bRememberText )
		{
			//	空文字はスキップ
			if ( *lpszString == '\0' )
				return CB_ERR;

			//	既にあるならスキップ
			if ( CComboBox::FindString( 0, lpszString ) >= 0 )
				return CB_ERR;
		}

		return CComboBox::AddString( lpszString );
	}

	//	強制反映
	void ForceCurSelUpdate(){
		if ( CComboBox::GetCurSel() == -1 )
			return;
		//CWnd::SetWindowText( operator[](CComboBox::GetCurSel()) );
		CComboBoxEx2::SetWindowText( operator[](CComboBox::GetCurSel()) );
	}

	/*
	//	2007/02/09 外部からも呼び出せるように
	void SetWindowText(LPCTSTR lpszString)
	{
		VirtualSetWindowText( lpszString );
	}
	*/

	// 生成されたメッセージ マップ関数
protected:
	//{{AFX_MSG(CComboBoxEx2)
	afx_msg void OnKillfocus();
	afx_msg void OnDropdown();
	//}}AFX_MSG

	//	仮想関数のオーバーライド
	void VirtualSetWindowText( const char* szText )
	{
		if ( m_bRememberText )
		{
			//	追加（無い時のみ＆空文字ではない）
			if ( *szText != '\0' && CComboBox::FindStringExact( 0, szText ) == CB_ERR )
				CComboBox::AddString( szText );
		}
		
		CWnd::SetWindowText( szText );
	}

	DECLARE_MESSAGE_MAP()

private:
	BOOL m_bRememberText;

	//	staticは本当にクラス間でstaticになるので駄目ー！
	//CString m_operator_affix_cstrWork;
};

/////////////////////////////////////////////////////////////////////////////

template <typename T, typename TREF=T> class CGenericComboBox : public CComboBoxEx2, public CGenericControlBase<T,TREF>
{
private:

public:
	MESD_OPERATOR_EQ;
	
	//	AddString()をオーバーライド
	int AddString( LPCTSTR lpszString, TREF val )
	{
		//m_cenericList[++m_indexCounter] = val;
		int gIndex = CGenericComboBox::AddGeneric(val);
		int ctrlIndex = CComboBoxEx2::AddString( lpszString );
		CComboBoxEx2::SetItemData(ctrlIndex, gIndex);
		return ctrlIndex;
	}
	//	AddString()をオーバーライド
	/*int AddString( LPCTSTR lpszString )
	{
		return CComboBoxEx2::AddString( lpszString );
	}*/
	
	//	AddString()をオーバーライド
	T& GetItemGeneric( int index )
	{
		return CGenericComboBox::GetGenericByIndex( CComboBoxEx2::GetItemData(index) );
	}

	//	AddString()をオーバーライド
	T& GetSelectedItemGeneric()
	{
		return GetItemGeneric( CComboBoxEx2::GetCurSel() );
	}

};


}//namespace mwlmfc

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。

#endif // !defined(AFX_COMBOBOXEX2_H__75711519_94A9_4B25_8F1C_DA0C1BE3CEA2__INCLUDED_)
