#include"COpenFileName.h"
#include"CShell.h"
#include"../CString.h"

static char s_FullPath[MAX_PATH];		
static char s_FileTitle[MAX_PATH];

namespace Maid
{



/*!
 *	\class COpenFileName COpenFileName.h
 *	\brief GetOpenFileName() or GetSaveFileName()　のラッパークラス
 *
 *			当然ですが Windows 専用です
 *
*/

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!	
 *
 */
COpenFileName::COpenFileName()
{
	//m_ofnの初期化
	ZeroMemory( &m_ofn, sizeof(m_ofn) );
//	m_ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;	//Win2000以外でも使えるようにする
	m_ofn.lStructSize = sizeof(m_ofn);	
	m_ofn.nMaxFile		 = MAX_PATH;
	m_ofn.nMaxFileTitle  = MAX_PATH;

	SetDefaultDirectory( CShell::GetCurrentDirectory() );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! デストラクタ
/*!	
 *
 */
COpenFileName::~COpenFileName()
{
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! ダイアログが開いたときにデフォルトで開いているディレクトリの設定
/*!
 *
 *	\param  _strDirectry	[i ]	ディレクトリ名
 *
 */
void COpenFileName::SetDefaultDirectory( const mstring& _strDirectry )
{
	m_DefaultDirectry = CString::ConvertMAIDtoSJIS(_strDirectry);
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 選択できる拡張子の設定
/*!
 *	\param  _szFilter	[i ]	拡張子名
 */
void COpenFileName::SetFileFilter( char* _szFilter )
{
	// フィルターは区切り文字に '\0' を使用しているため、stringは使えないので自分で計算する
	int i=2;
	while( true )
	{
		if( (_szFilter[i-2]=='\0') && (_szFilter[i-1]=='\0') ) { break; }
		i++;
	}

	m_pFilter.reset( new char[i] );
	memcpy( m_pFilter.get(), _szFilter, i );
}



/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 「ファイルを開く」ダイアログボックスを出す
/*!
 	@param  hWnd		[i ]	オーナーハンドル
 	@param  Title		[i ]	ダイアログボックスのタイトルバーに表示される文字列
 	@param  DefExt		[i ]	ダイアログができたときにデフォルトで入っている文字列
 	@param  DefaultName	[i ]	最初からエディットボックスに入っているファイル名
 
	@return ファイルを指定して［OK］ボタンを押すと、trueが返ります
 			ダイアログボックスをキャンセルしたり閉じたりした場合は、false が返ります	
*/
bool COpenFileName::ShowOpenDialog( HWND hWnd, const mstring& Title, const mstring& DefExt, const mstring& DefaultName )
{
	BOOL ret;

	const MySTL::string sjis_tittle = CString::ConvertMAIDtoSJIS(Title);
	const MySTL::string sjis_ext    = CString::ConvertMAIDtoSJIS(DefExt);
	const MySTL::string sjis_name   = CString::ConvertMAIDtoSJIS(DefaultName);

	::lstrcpy( s_FileTitle, sjis_name.c_str() );

	m_ofn.hwndOwner			= hWnd;
	m_ofn.lpstrFilter		= m_pFilter.get();
	m_ofn.nFilterIndex		= 1;				// フィルターの初期位置
	m_ofn.lpstrFile			= s_FullPath;		// ファイル名用文字列バッファ
	m_ofn.lpstrFileTitle	= s_FileTitle;		// ファイルのタイトル用文字列バッファ
	m_ofn.lpstrDefExt		= sjis_ext.c_str();
	m_ofn.lpstrInitialDir	= m_DefaultDirectry.c_str();
	m_ofn.Flags				= OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
	m_ofn.lpstrTitle		= sjis_tittle.c_str(); // タイトル

	{
		const mstring dir = CShell::GetCurrentDirectory();
		ret = ::GetOpenFileName( &m_ofn );

		CShell::SetCurrentDirectory(dir);
	}

	if( ret==0 )
	{
		const DWORD d = ::CommDlgExtendedError();

		//	GetSaveFileName() はエラーだけど、 CommDlgExtendedError() はエラーでない
		//	== キャンセルが押された
		if( d==0 ) { return false; }

	}else
	{
		m_FullPath = CString::ConvertSJIStoMAID(s_FullPath);
		m_FileName = CString::ConvertSJIStoMAID(s_FileTitle);
		return true;
	}

	return false;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 「ファイルを保存する」ダイアログボックスを出す
/*!
 	@param  hWnd		[i ]	オーナーハンドル
 	@param  Title		[i ]	ダイアログボックスのタイトルバーに表示される文字列
 	@param  DefExt		[i ]	ダイアログができたときにデフォルトで入っている文字列
 	@param  DefaultName	[i ]	最初からエディットボックスに入っているファイル名
 
	@return ファイルを指定して［OK］ボタンを押すと、trueが返ります
 			ダイアログボックスをキャンセルしたり閉じたりした場合は、false が返ります	
*/
bool COpenFileName::ShowSaveDialog( HWND hWnd, const mstring& Title, const mstring& DefExt, const mstring& DefaultName )
{
	BOOL ret;

	const MySTL::string sjis_tittle = CString::ConvertMAIDtoSJIS(Title);
	const MySTL::string sjis_ext    = CString::ConvertMAIDtoSJIS(DefExt);
	const MySTL::string sjis_name   = CString::ConvertMAIDtoSJIS(DefaultName);

	::lstrcpy( s_FileTitle, sjis_name.c_str() );
	m_ofn.hwndOwner			= hWnd;
	m_ofn.lpstrFilter		= m_pFilter.get();
	m_ofn.nFilterIndex		= 1;				// フィルターの初期位置
	m_ofn.lpstrFile			= s_FullPath;		// ファイル名用文字列バッファ
	m_ofn.lpstrFileTitle	= s_FileTitle;	// ファイルのタイトル用文字列バッファ
	m_ofn.lpstrDefExt		= sjis_ext.c_str();
	m_ofn.lpstrInitialDir	= m_DefaultDirectry.c_str();
	m_ofn.Flags				= OFN_FILEMUSTEXIST;
	m_ofn.lpstrTitle		= sjis_tittle.c_str(); // タイトル

	{
		const mstring dir = CShell::GetCurrentDirectory();
		ret = ::GetSaveFileName( &m_ofn );
		CShell::SetCurrentDirectory(dir);
	}


	if( ret==0 )
	{
		const DWORD d = ::CommDlgExtendedError();

		//	GetSaveFileName() はエラーだけど、 CommDlgExtendedError() はエラーでない
		//	== キャンセルが押された
		if( d==0 ) { return false; }

	}else
	{
		m_FullPath = CString::ConvertSJIStoMAID(s_FullPath);
		m_FileName = CString::ConvertSJIStoMAID(s_FileTitle);

		if( IsFlag(m_ofn.Flags,OFN_EXTENSIONDIFFERENT) )
		{
			//	拡張子が違う

		}

		return true;
	}

	return ret==TRUE;
}

}