Artifact fa92942f039f4d4bb8734d0b72abc5930913ec22
#ifndef _GREENPAD_OPENSAVEDLG_H_
#define _GREENPAD_OPENSAVEDLG_H_
#include "kilib/ktlarray.h"
#include "kilib/ktlaptr.h"
#include "kilib/string.h"
#include "rsrc/resource.h"
//========================================================================
//@{ @pkg Gp.Dlg //@}
//@{
//	利用可能文字コードリスト
//@}
//========================================================================
class CharSetList
{
public:
	struct CsInfo
	{
		int                 ID;
		const TCHAR*  longName;
		const TCHAR* shortName;
		int               type;
	};
public:
	CharSetList();
	const CsInfo& operator[](size_t i) const { return list_[i]; }
	ulong size() const { return list_.size(); }
	int defaultCs() const;
	ulong defaultCsi() const;
	ulong findCsi( int cs ) const;
private:
	enum { SAVE=1, LOAD=2, BOTH=3 };
	ki::storage<CsInfo> list_;
};
//========================================================================
//@{
//	「ファイルを開く」ダイアログ
//
//	Windows共通のダイアログの下に、文字コードの選択欄を
//	付け加えたものを表示する。
//@}
//========================================================================
class OpenFileDlg
{
public:
	explicit OpenFileDlg( const CharSetList& csl );
	bool DoModal( HWND wnd, const TCHAR* filter, const TCHAR* fnm );
public:
	const TCHAR* filename() const;
	int csi() const;
public:
	static ki::aarr<TCHAR> ConnectWithNull( ki::String lst[], int num );
private:
	const CharSetList& csl_;
	TCHAR filename_[MAX_PATH];
	int   csIndex_;
private:
	static OpenFileDlg* pThis; // マルチスレッド禁止!
	static UINT_PTR CALLBACK OfnHook( HWND, UINT, WPARAM, LPARAM );
};
//------------------------------------------------------------------------
#ifndef __ccdoc__
inline OpenFileDlg::OpenFileDlg( const CharSetList& csl )
	: csl_(csl) {}
inline const TCHAR* OpenFileDlg::filename() const
	{ return filename_; }
inline int OpenFileDlg::csi() const
	{ return csIndex_; }
#endif // __ccdoc__
//========================================================================
//@{
//	「ファイルを保存」ダイアログ
//
//	Windows共通のダイアログの下に、文字コードの選択欄と
//	改行コードの選択欄を付け加えたものを表示する。
//@}
//========================================================================
class SaveFileDlg
{
public:
	explicit SaveFileDlg( const CharSetList& csl, int cs, int lb );
	bool DoModal( HWND wnd, const TCHAR* filter, const TCHAR* fnm );
public:
	const TCHAR* filename() const;
	int csi() const;
	int lb() const;
public:
	static ki::aarr<TCHAR> ConnectWithNull( ki::String lst[], int num );
private:
	const CharSetList& csl_;
	TCHAR filename_[MAX_PATH];
	int   csIndex_;
	int   lb_;
private:
	static SaveFileDlg* pThis; // マルチスレッド禁止!
	static UINT_PTR CALLBACK OfnHook( HWND, UINT, WPARAM, LPARAM );
};
//------------------------------------------------------------------------
#ifndef __ccdoc__
inline SaveFileDlg::SaveFileDlg( const CharSetList& csl, int cs, int lb )
	: csl_(csl), csIndex_(cs), lb_(lb) {}
inline const TCHAR* SaveFileDlg::filename() const
	{ return filename_; }
inline int SaveFileDlg::csi() const
	{ return csIndex_; }
inline int SaveFileDlg::lb() const
	{ return lb_; }
inline ki::aarr<TCHAR> SaveFileDlg::ConnectWithNull
	( ki::String lst[], int num )
	{ return OpenFileDlg::ConnectWithNull( lst, num ); }
#endif // __ccdoc__
//========================================================================
//@{
//	「開き直す」ダイアログ
//
//	文字コード選択欄表示
//@}
//========================================================================
class ReopenDlg : public ki::DlgImpl
{
public:
	ReopenDlg( const CharSetList& csl, int csi );
	int csi() const;
private:
	void on_init();
	bool on_ok();
private:
	const CharSetList& csl_;
	int   csIndex_;
};
//------------------------------------------------------------------------
#ifndef __ccdoc__
inline int ReopenDlg::csi() const
	{ return csIndex_; }
//========================================================================
#endif // __ccdoc__
#endif // _GREENPAD_OPENSAVEDLG_H_