text: // Windows/Control/Dialog.h
  
  #ifndef __WINDOWS_CONTROL_DIALOG_H
  #define __WINDOWS_CONTROL_DIALOG_H
  
  #include "Windows/Window.h"
  
  #ifndef _WIN32
  
  #define WM_SETTEXT (6000) // wxID_HIGHEST + 1
  #define WM_USER    (6999) // wxID_HIGHEST + 1000
  #define WM_APP     (26999) // wxID_HIGHEST + 22000
  
  #endif
  
  #ifndef _WIN32
  #define CBN_SELCHANGE       1
  #endif
  
  #define BST_CHECKED 1
  #define BST_UNCHECKED 0
  // #define BST_INDETERMINATE  0x0002
  
  // FIXME #define wsprintf(a,b,c,d,e) swprintf(a,9999,b,c,d,e)  // FIXME
  
  namespace NWindows {
  	namespace NControl {
  
  		class CModalDialogImpl;
  
  		class CDialog
  		{
  		protected:
  			CModalDialogImpl * _window;
  		public:
  			operator HWND() const { return HWND(_window); }
  
  			bool OnInit(CModalDialogImpl * window) { 
  				_window = window;
  				return OnInit();
  		       	}
  			virtual bool OnInit() { return false; }
  			virtual void OnOK() {}
  			virtual void OnCancel() {}
  			virtual void OnHelp() {}
  			virtual bool OnButtonClicked(int buttonID, wxWindow * buttonHWND) { return false; }
  			virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { return false; }
  			virtual bool OnCommand(int code, int itemID, LPARAM lParam) { return false; }
  			virtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; }
  
  			void NormalizeSize(bool fullNormalize = false)  { /* FIXME */ }
  			void NormalizePosition() { /* FIXME */ }
  		};
  
  		class CModalDialog : public CDialog
  		{
  		public:
  
  
  			////////////////// COMPATIBILITY
  
  			bool CheckRadioButton(int firstButtonID, int lastButtonID, int checkButtonID)
  			{
  /*
  				for(int id = firstButtonID; id <= lastButtonID; id++)
  				{
  					CheckButton(id,id == checkButtonID);
  				}
  */
  				this->CheckButton(checkButtonID,true);
  
  				return true;
  			}
  
  
  			bool CheckButton(int buttonID, UINT checkState);
  			bool CheckButton(int buttonID, bool checkState)
  			{
  				return CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED));
  			}
  
  
  			UINT IsButtonChecked(int buttonID) const;
  
  			bool IsButtonCheckedBool(long buttonID) const
  				{ return (IsButtonChecked(buttonID) == BST_CHECKED); }
  
  			void EnableItem(int id, bool state);
  
  			void SetItemText(int id, const TCHAR *txt);
  
  			wxWindow * GetItem(long id) const ;
  
  			void ShowItem(int itemID, int cmdShow) const;
  
  			void ShowItem_Bool(int itemID, bool show) const { ShowItem(itemID, show ? SW_SHOW: SW_HIDE); }
  
  
  			void HideItem(int itemID) const { ShowItem(itemID, SW_HIDE); }
  
  			void End(int result);
  
  			void SetText(const TCHAR *_title); // {  _dialog->SetTitle(_title); }
  
  			bool GetText(CSysString &s);
  
  			INT_PTR Create(int id , HWND parentWindow);
  
  			void PostMsg(UINT message);
  
  			virtual void OnHelp() {}
  
  			UINT_PTR SetTimer(UINT_PTR idEvent , unsigned milliseconds);
  
  			void KillTimer(UINT_PTR idEvent);
  
  			virtual void OnOK() { End(IDOK); }
  			virtual void OnCancel() { End(IDCANCEL); }
  		};
  
  class CDialogChildControl : public NWindows::CWindow
  {
  public:
    CDialogChildControl() {}
  
    int m_ID;
    void Init(const NWindows::NControl::CModalDialog &parentDialog, int id)
    {
      m_ID = id;
      this->Attach(parentDialog.GetItem(id));
    }
    virtual void SetText(LPCWSTR s);
    virtual bool GetText(CSysString &s);
  };
  
  }
  }
  
  struct CStringTable
  {
  	unsigned int id;
  	const wchar_t *str;
  };
  
  struct CDialogInfo
  {
  	int id;
  	NWindows::NControl::CModalDialogImpl * (*createDialog)(NWindows::NControl::CModalDialog * dialog, HWND parentWindow);
  	CStringTable * stringTable;
  };
  
  void RegisterDialog(const CDialogInfo *dialogInfo);
  
  #define REGISTER_DIALOG_NAME(x) CRegister ## x
  
  #define REGISTER_DIALOG(id,x,stringTable) \
  	static NWindows::NControl::CModalDialogImpl * myCreate##x(NWindows::NControl::CModalDialog * dialog,HWND parentWindow) \
  	{ return new x##Impl(dialog,parentWindow,id); } \
  	static struct CDialogInfo g_DialogInfo = { id , myCreate##x, stringTable }; \
  	struct REGISTER_DIALOG_NAME(x) { \
  		REGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \
  	static REGISTER_DIALOG_NAME(x) g_RegisterDialog;
  
  #define REGISTER_STRINGTABLE(stringTable) \
  	static struct CDialogInfo g_DialogInfo = { -1 , 0 , stringTable }; \
  	struct REGISTER_DIALOG_NAME(x) { \
  		REGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \
  	static REGISTER_DIALOG_NAME(x) g_RegisterDialog;
  
  #endif
  
  