////////////////////////////////////////////////////////////////////////////////
//
//	注意：このクラスはダイアログのメンバ変数として使用しなければならず、
//	　　　グローバル変数や、一時変数として定義する事は出来ない。
//
//	１．Setup()にて各種設定を行う
//	２．AttachDdx〜()メソッドにて、INIファイル上の項目（"セクション名::値名"で指定）と、
//	　　ダイアログ上の各DDX変数（または直接コントロール）を関連付けさせる。
//	３．必要に応じてRead()、Write()メソッドを呼び出し、
//	　　INIファイルからの読み込み、INIファイルへの書き込みを行う。
//
////////////////////////////////////////////////////////////////////////////////

#ifndef __DdxAttachedIni_H__
#define __DdxAttachedIni_H__

#pragma warning( disable : 4786 ) // VC での警告を取り除きます。

//#include "IniReader.h"
//#include "SpecialIniReader.h"
#include "MyuIniWriter.h"

//	DDX種別
#define DDXTYPE_INT		(1)
#define DDXTYPE_UINT	(2)
#define DDXTYPE_INTBOOL	(10)	//	BOOL
#define DDXTYPE_CSTR	(30)	//	CString(MFC)
#define DDXTYPE_CSTRING	(30)	//	CString(MFC)
#define DDXTYPE_CTRLID	(100)	//	コントロールID（SetWindowText()/GetWindowText()）
#define DDXTYPE_CHKBOX	(101)	//	CheckBoxのコントロールID

//#define DDXTYPE_BOOL	(5)		//	bool -> あんま無くネ…？
//#define DDXTYPE_STLSTR(20)	//	std::string -> あんま無くネ…？

namespace mwlmfc{

typedef struct
{
	void* ptr;
	int type;
	string strDefault;
} MFC_INI_MGR_ITEM;

#define INI_IO_BUF_SIZE	(1024*2)	//	INIファイル読み書き時に使用のバッファサイズ（最大バイト数）

//	クラス宣言
class CDdxAttachedIni : public CMyuIniWriter
//class CDdxAttachedIni : public CIniReader
//class CDdxAttachedIni : public CSpecialIniReader
{
private:
	map<string,MFC_INI_MGR_ITEM> m_mapMfc;	//	<Secion::INI上名前,>
	typedef map<string,MFC_INI_MGR_ITEM>::iterator ITEM_ITR;

protected:
	CDialog* m_pThisDlg;
	void AddDdxEntry( const char* szIniItemName, void* ptr, int type, const char* szDefault="" );

public:
	//	コンストラクタ・デストラクタd
	CDdxAttachedIni(){ m_pThisDlg = NULL; }
	//CDdxAttachedIni( CDialog* pThisDlg ){ SetDialogPtr(pThisDlg); }
	virtual ~CDdxAttachedIni(){}

/*	const char* GetStr( const char* szName );
	const char* operator[]( const char* szName ){ return szName; }*/

	//	設定
	BOOL Setup( const char* szIniFile, CDialog* pThisDlgPtr );
	//void SetDialogPtr( CDialog* pThisDlg ){ m_pThisDlg = pThisDlg; } 

	//	DDX変数へAttachする
	void AttachDdxCtrl( const char* szIniItemName, int nControlId, const char* szDefault="" ){
		AddDdxEntry( szIniItemName, (void*)nControlId, DDXTYPE_CTRLID, szDefault ); }
	void AttachDdxCString( const char* szIniItemName, CString* pcstrValue, const char* szDefault="" ){
		AddDdxEntry( szIniItemName, pcstrValue, DDXTYPE_CSTR, szDefault ); }

	void AttachDdxBOOL( const char* szIniItemName, BOOL* pValue, BOOL bDefault=FALSE ){
		char work[32];
		AddDdxEntry( szIniItemName, pValue, DDXTYPE_INTBOOL, dectostr(bDefault,work) ); }
	void AttachDdxInt( const char* szIniItemName, int* pValue, int nDefault=0 ){
		char work[32];
		AddDdxEntry( szIniItemName, pValue, DDXTYPE_INT, dectostr(nDefault,work) ); }
	void AttachDdxChkbox( const char* szIniItemName, int nControlId, int nDefault=0 ){
		char work[32];
		AddDdxEntry( szIniItemName, (void*)nControlId, DDXTYPE_CHKBOX, dectostr(nDefault,work) ); }

	//	読み込み・書き込み（Attach後呼び出し）
	/*BOOL LoadIniToDdx( const char* szIniFile ){
		CIniReader::Setup( szIniFile );
		return LoadIniToDdx();
	}*/
	BOOL LoadIniToDdx( const char* szIniFile, CDialog* pThisDlgPtr ){
		CMyuIniReader::Setup( szIniFile );
		m_pThisDlg = pThisDlgPtr;
		return LoadIniToDdx();
	}
	BOOL LoadIniToDdx();	//	Setup()済の場合
	BOOL ReadIniToDdx(){ return LoadIniToDdx(); }
	BOOL Read(){ return LoadIniToDdx(); }
	//BOOL ReloadFromDdx();	-> 何のために…？
	BOOL WriteToIni();
	BOOL Write(){ return WriteToIni(); }
};

}//namespace mwlmfc

#endif//__DdxAttachedIni_H__
