#ifndef AL_WIZARD_H
#define AL_WIZARD_H

#include <WINNT/TaLocale.h>
#include <WINNT/subclass.h>

#ifndef EXPORTED
#define EXPORTED
#endif


/*
 * DEFINITIONS ________________________________________________________________
 *
 */

#ifndef THIS_HINST
#define THIS_HINST   (HINSTANCE)GetModuleHandle(NULL)
#endif

#define IDC_WIZARD   898  // WM_COMMAND,IDC_WIZARD: HIWORD(wp)=WIZARD_COMAMND

typedef class EXPORTED WIZARD WIZARD, *LPWIZARD;


/*
 * WIZARD CLASS _______________________________________________________________
 *
 */

typedef enum
   {
   wcSTATE_ENTER,	// now entering state (even w/o display)
   wcSTATE_LEAVE,	// now leaving state (even w/o display)
   wcIS_STATE_DISABLED,	// return TRUE if state disabled
   } WIZARD_COMMAND;

typedef struct
   {
   int st;	// numeric state identifier
   int idd;	// dialog template for wizard pane
   DLGPROC dlgproc;	// dialog procedure for this state
   LPARAM lp;	// lparam for dialog initialization
   } WIZARD_STATE, *LPWIZARD_STATE;

#define BACK_BUTTON    0x0001
#define NEXT_BUTTON    0x0002

class EXPORTED WIZARD
   {
   public:

      WIZARD (void);
      ~WIZARD (void);

      static LPWIZARD GetWizard (HWND hWnd);
      HWND GetWindow (void);

      void SetDialogTemplate (int iddTemplate, int idcLeftPane, int idcRightPane, int idcBack, int idcNext);
      void SetGraphic (int idbGraphic16, int idbGraphic256);
      void SetStates (LPWIZARD_STATE aStates, size_t cStates);
      void SetGraphicCallback (void (CALLBACK *pfnCallback)(LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal));

      int GetState (void);
      void SetState (int stNew, BOOL fForce = FALSE);
      BOOL Show (BOOL fShow = TRUE);

      void SetBackground (int iddBackground, BOOL fBlue = TRUE, DLGPROC dlgproc = NULL);
      void SetBackgroundText (LPTSTR pszText, HFONT hfText = NULL);
      void SetBackgroundText (int idsText, HFONT hfText = NULL);
      BOOL ShowBackground (BOOL fShow = TRUE);
      HWND GetBackgroundWindow (void);

      void EnableButton (int idcButton, BOOL fEnable);
      void EnableButtons (DWORD dwButtonFlags = BACK_BUTTON | NEXT_BUTTON);
      void SetButtonText (int idcButton, int idsText);
      void SetDefaultControl (int idc);

      BOOL SendStateCommand (int st, WIZARD_COMMAND wc);

   private:

      void Refresh (DWORD dwRefFlags);
      HWND GetRightHandWindow (void);
      void GeneratePalette (RGBQUAD *pargb = NULL);
      LPWIZARD_STATE FindState (int stFind);

      static BOOL CALLBACK Background_DlgProc (HWND hBkg, UINT msg, WPARAM wp, LPARAM lp);
      static BOOL CALLBACK Background_PaintHook (HWND hBkg, UINT msg, WPARAM wp, LPARAM lp);
      void Background_OnInitDialog (HWND hBkg);
      void Background_OnSize (void);
      void Background_OnDestroy (void);
      void Background_OnClose (void);
      BOOL Background_OnPaint (void);

      static BOOL CALLBACK Template_DlgProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
      static BOOL CALLBACK Template_LeftPaneHook (HWND hLHS, UINT msg, WPARAM wp, LPARAM lp);
      BOOL Template_ForwardMessage (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
      void Template_OnInitDialog (HWND hWnd);
      BOOL Template_OnPaintLHS (HWND hLHS);

      int m_iddTemplate;
      int m_idcLeftPane;
      int m_idcRightPane;
      int m_idcBack;
      int m_idcNext;
      int m_idbGraphic16;
      HBITMAP m_bmpGraphic16;
      int m_idbGraphic256;
      HBITMAP m_bmpGraphic256;
      HPALETTE m_palGraphic;
      LPWIZARD_STATE m_aStates;
      size_t m_cStates;
      int m_stCurrent;
      BOOL m_fShowing;
      HWND m_hWnd;

      int m_iddBackground;
      BOOL m_fBlue;
      HWND m_hBkg;
      DLGPROC m_fnBackground;
      TCHAR m_szBackground[ cchRESOURCE ];
      HBITMAP m_bmpBackground;
      HFONT m_hfBackground;
      HBITMAP m_bmpBuffer;
      RECT m_rBuffer;

      void (CALLBACK *m_pfnCallback)(LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal);
   };


#endif

