#ifndef _dkutil_CommonControl__
#define _dkutil_CommonControl__



#include <windows.h>


#include <dkutil/macro.hpp>

#include <dkutil/dll.hpp>

namespace dkutil{

/*!
☆IME表示設定IME表示の設定をします。
@param wnd[in] Windowのハンドル。(NULLだと、IMEが落ちるかもしれないので失敗する。
@param flag[in] 使用するならtrue
@return wndがNULLだとfalse 成功したら true
*/
inline bool SetShowIME(HWND wnd, bool flag )
{
	typedef int (PASCAL *SETIME_TYPE)(HWND,int);
	if(wnd==NULL) return false;

	{
		const int num = 4;
		const char *dlltbl[num]={
			"WINNLS32.DLL","winnls.dll",
			"user32.dll","win32nls.dll"
		};
		const char *prctbl[num]={
			"WINNLSEnableIME","WINNLSEnableIME",
			"WINNLSEnableIME","　WINNLS32EnableIME"
		};
		SETIME_TYPE SetIME=NULL;
		DLLManager f;
		for(int i=0;i<num;i++){
			f.reset(dlltbl[i]);
			
			SetIME = (SETIME_TYPE)f.find(prctbl[i]);
			if(SetIME){
				SetIME(wnd,flag);
				return true;
			}
		}
	}
	return false;
}

class FolderSelector{
public:
	/*!
	@param GetPath[out] フォルダの文字列を入れるバッファ(MAX_PATH)以上にすること！！
	@param BuffSize[in] GetPathバッファのサイズ（保険ですね。
	@param folder[in] 初期フォルダ指定
	@param Title[in] このダイアログのタイトル
	@param Flag[in] BIF_EDITBOXのようなフラグ指定（詳しくはBROWSEINFO
	@param WindowHandle[in] オーナーウインドウのハンドル
	*/
	int FolderSelectLogic(char *GetPath,size_t BuffSize,
		const char *folder,const char *Title,
		UINT Flag,HWND WindowHandle);
	/*int FolderSelectLogic(char *GetPath,size_t BuffSize,
		const char *folder=NULL,const char *Title=NULL,
		UINT Flag=BIF_EDITBOX,HWND WindowHandle=NULL);
	*/
	int FolderSelect(char *GetPath,size_t BuffSize,const char *folder =NULL);
	///ファイルと一緒に //IE Version 4.71.以上？
	int select_with_file(std::string &buff,const char *folder = NULL,
		const char *title="select folder or file",HWND handle = NULL);
	//エディットボックスと一緒に
	//int select_with_editbox(
	FolderSelector(char *GetPath,size_t BuffSize,const char *folder,bool *flag);
	//何もしないコンストラクタ。
	FolderSelector(){}
	/*!
	@param GetPath[out] フォルダのパス
	@note
	GetPathがemptyだったら選択されていない。
	*/
	FolderSelector(std::string &GetPath,const char *folder=NULL);
	// コールバーク関数
	static int CALLBACK BrowseCallbackProc( HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData );

};

inline bool EasyFolderSelect(char *buff,size_t buffsize){
	FolderSelector sel;
	return DKUTIL_SUCCEEDED(sel.FolderSelect(buff,buffsize));
}
inline bool EasyFolderSelect(std::string &buff){
	char a[MAX_PATH * 2];
	int r = EasyFolderSelect(a,sizeof(a));
	buff = a;
	return DKUTIL_SUCCEEDED_BOOL(r);
}
inline bool EasyFolderSelectAndFile(std::string &buff){
	FolderSelector sel;
	return DKUTIL_SUCCEEDED(sel.select_with_file(buff));
}
/*
inline bool FolderSelect(char *buff,size_t buffsize,const char *Title){
	FolderSelector sel;
	return DKUTIL_SUCCEEDED(sel.FolderSelect(buff,buffsize,NULL,Title));
}
*/
}//end of dkutil namespace



#endif//end of include once
