#ifndef __SFJP_MYU__AGH_CONTROL_Window_H__
#define __SFJP_MYU__AGH_CONTROL_Window_H__

//	ウインドウ位置を画面中心に
#define AGH_WINDOW_POS_CENTER	(0x7fffffff)


//	ulFlags用
#define AGH_WINDOW_SHOW_TITLE_BAR			(0x00000001)	//	タイトルバーを表示する
#define AGH_WINDOW_HIDE_TITLE_BAR			(0x00000000)	//	タイトルバーを非表示

#define AGH_WINDOW_RESIZABLE				(0x00000010)	//	ウインドウのサイズの変更を可能に
#define AGH_WINDOW_NO_RESIZABLE				(0x00000000)	//	ウインドウのサイズの変更が不可能

#define AGH_WINDOW_ENABLE_MINIMIZE_BUTTON	(0x00000020)	//	ウインドウの最小化ボタンが有効
#define AGH_WINDOW_DISABLE_MINIMIZE_BUTTON	(0x00000000)	//	ウインドウの最小化ボタンが無効

#define AGH_WINDOW_ENABLE_MAXIMIZE_BUTTON	(0x00000040)	//	ウインドウの最大化ボタンが有効
#define AGH_WINDOW_DISABLE_MAXIMIZE_BUTTON	(0x00000000)	//	ウインドウの最大化ボタンが無効

#define AGH_WINDOW_ENABLE_CLOSE_BUTTON		(0x00000080)	//	ウインドウの閉じるボタンが有効
#define AGH_WINDOW_DISABLE_CLOSE_BUTTON		(0x00000000)	//	ウインドウの閉じるボタンが無効

#define AGH_WINDOW_SIZE_INCLUDE_FRAME		(0x08000000)	//	ウインドウのサイズ（nWinWidthSize/nWinHeightSize）として指定する値はフレームやタイトルバーも含んだ値
#define AGH_WINDOW_SIZE_NOT_INCLUDE_FRAME	(0x00000000)	//	ウインドウのサイズ（nWinWidthSize/nWinHeightSize）として指定する値はフレームやタイトルバーも含まない値



//class CCreateWindowInfoExtendBase {};
typedef struct {} CREATE_WINDOW_EXTEND_BASE;
typedef struct {
	_agh_string strWindowTitle;	//	ウインドウのタイトル
	_agh_string strWindowClass;//	ウインドウクラス（Windows用）
	_agh_string strReserved1;	//	予約

	int nWinXPos;				//	ウインドウの左上の位置X。AGH_WINDOW_POS_CENTER : 画面の中心
	int nWinYPos;				//	ウインドウの左上の位置Y。AGH_WINDOW_POS_CENTER : 画面の中心
	int nWinWidthSize;			//	ウインドウの幅
	int nWinHeightSize;			//	ウインドウの高さ

	//CCreateWindowInfoExtendBase* pExtendStructure;
	CREATE_WINDOW_EXTEND_BASE* pExtendStructure;

	unsigned long ulFlags;		//	フラグ群。当ヘッダ上部で宣言
	int nIcon;					//	アイコン。現在未実装

	int reserved[30];			//	予約
} CREATE_WINDOW_INFO;



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

//	CWindowBase
//class CWindowBase : public CScreenBase {	//	2008/11/13  こっちじゃないか・・・？
class CWindowBase : public CVisualControlBase {	//	2008/11/16  んまぁこっちが正解なんだけどね。
_AGH_EVENT_ACCESS_MODIFIER:
	virtual void OnCreateWindow(CREATE_WINDOW_INFO *pWindowInfo){}
	virtual void OnCreateWindowEx(void *pWindowInfoEx){}

	virtual void OnCreatedWindow(){}
	virtual bool OnClose(){ return true; }	//	falseを返すと閉じるのをキャンセル出来る
	virtual void OnClosedWindow(){}

	virtual bool OnDropFiles(std::vector<std::string> &files){ return false; }	//	何か処理をした

public:
	CWindowBase(){}
	virtual ~CWindowBase(){}	//	デストラクタちゃんと呼ばれるための対策

	virtual void Start(){}
	virtual void SetWindowTitle(const char* szTitle){}
	//virtual void SetCursol(int nCursor){}
	virtual void ExitWindow(){}

	virtual void EnableDropFiles(){}
	virtual void DisableDropFiles(){}
};

typedef CWindowBase IWindow;

typedef class CWindowPlatImplBase : public CWindowBase
{} IWindowPlatImpl;

typedef class CWindowUserImplBase : public CWindowBase
{} IWindowUserImpl;


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

class CWindow : public CWindowBase
{
protected:
	agh::IWindow *pImpl;
_AGH_EVENT_ACCESS_MODIFIER:
	//virtual void OnCreateWindow(CREATE_WINDOW_INFO *pWindowInfo){}
	//virtual bool OnClose(){ return true; }	//	falseを返すと閉じるのをキャンセル出来る
	//virtual void OnDropFiles(std::vector<std::string> files){}

public:
	//CWindow(){ pImpl = NULL; }
	CWindow(agh::IImplFactory *pFactory){ pImpl = pFactory->CreateWindow(this); }
	virtual ~CWindow(){}	//	デストラクタちゃんと呼ばれるための対策

	virtual void Start(){ pImpl->Start(); }
	virtual void SetWindowTitle(const char* szTitle){ pImpl->SetWindowTitle(szTitle); }
	//virtual void SetCursol(int nCursor){}
};

#endif//__SFJP_MYU__AGH_CONTROL_Window_H__
