using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
	/// 
	/// Represents Wizard control.
	/// 
    [ToolboxBitmap(typeof(Wizard), "Wizard.Wizard.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.WizardDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
    public class Wizard : UserControl
    {
        #region Private Variables
        private PanelControl panelHeader;
        private int m_ButtonSpacingMajor = 8;
        private int m_ButtonSpacingMinor = 1;
        private int m_ButtonHeight = 22;
        private FlatStyle m_ButtonFlatStyle = FlatStyle.System;
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public PanelControl panelFooter;
        private ButtonX buttonHelp;
        private ButtonX buttonCancel;
        private ButtonX buttonFinish;
        private ButtonX buttonNext;
        private ButtonX buttonBack;
        private bool m_FinishButtonAlwaysVisible = false;
        private Label labelDescription;
        private Label labelCaption;
        
        private WizardPageCollection m_WizardPages = new WizardPageCollection();
        private Stack m_PagesHistory = new Stack();
        private int m_SelectedPageIndex = 0;
        private bool m_PageChangeDisableButtons = true;
        private bool m_PageChangeWaitCursor = true;
        private eWizardFormAcceptButton m_FormAcceptButton = eWizardFormAcceptButton.FinishAndNext;
        private eWizardFormCancelButton m_FormCancelButton = eWizardFormCancelButton.Cancel;
        private PictureBox pictureHeader;
        private Image m_HeaderImage = null;
        private bool m_HeaderImageChanged = false;
		private bool m_HeaderImageVisible = true;
        private bool m_HelpButtonVisible = true;
        ///  
		/// Required designer variable.
		/// 
		private System.ComponentModel.Container components = null;
        #endregion
        #region Events
        /// 
        /// Occurs when Back button is clicked. You can cancel any default processing performed by Wizard control by setting Cancel=true on event arguments.
        /// 
        [Description("Occurs when Back button is clicked.")]
        public event CancelEventHandler BackButtonClick;
        /// 
        /// Occurs when Next button is clicked. You can cancel any default processing performed by Wizard control by setting Cancel=true on event arguments.
        /// 
        [Description("Occurs when Next button is clicked.")]
        public event CancelEventHandler NextButtonClick;
        /// 
        /// Occurs when Finish button is clicked. You can cancel any default processing performed by Wizard control by setting Cancel=true on event arguments.
        /// 
        [Description("Occurs when Finish button is clicked.")]
        public event CancelEventHandler FinishButtonClick;
        /// 
        /// Occurs when Cancel button is clicked. You can cancel any default processing performed by Wizard control by setting Cancel=true on event arguments.
        /// 
        [Description("Occurs when Cancel button is clicked.")]
        public event CancelEventHandler CancelButtonClick;
        /// 
        /// Occurs when Help button is clicked. You can cancel any default processing performed by Wizard control by setting Cancel=true on event arguments.
        /// 
        [Description("Occurs when Help button is clicked.")]
        public event CancelEventHandler HelpButtonClick;
        /// 
        /// Occurs before wizard page has changed and gives you opportunity to cancel the change.
        /// 
        [Description("Occurs before wizard page has changed and gives you opportunity to cancel the change.")]
        public event WizardCancelPageChangeEventHandler WizardPageChanging;
        /// 
        /// Occurs after wizard page has changed. This event cannot be cancelled. To cancel the page change please use WizardPageChanging event.
        /// 
        [Description("Occurs after wizard page has changed.")]
        public event WizardPageChangeEventHandler WizardPageChanged;
        /// 
        /// Occurs when wizard buttons (Back, Next, Finish etc) are positioned and resized.
        /// 
        [Description("Occurs when wizard buttons (Back, Next, Finish etc) are positioned and resized.")]
        public event WizardButtonsLayoutEventHandler LayoutWizardButtons;
        #endregion
        #region Constructor Dispose
        public Wizard()
		{
			// This call is required by the Windows.Forms Form Designer.
			InitializeComponent();
            m_WizardPages.ParentWizard = this;
            pictureHeader.BackgroundImage = BarFunctions.LoadBitmap("SystemImages.WizardHeaderImage.png");
            panelFooter.Style.StyleChanged += new EventHandler(FooterStyleStyleChanged);
		}
        private void FooterStyleStyleChanged(object sender, EventArgs e)
        {
            if (panelFooter.Style.BackColor == Color.Transparent && panelFooter.Style.BackColor2.IsEmpty && panelFooter.Style.BackColorBlend.Count == 0)
                panelFooter.BackColor = Color.Transparent;
            else if (panelFooter.BackColor != SystemColors.Control)
                panelFooter.BackColor = SystemColors.Control;
        }
		///  
		/// Clean up any resources being used.
		/// 
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if(components != null)
				{
					components.Dispose();
				}
			}
            if (BarUtilities.DisposeItemImages && !this.DesignMode)
            {
                BarUtilities.DisposeImage(ref m_HeaderImage);
            }
			base.Dispose( disposing );
        }
        #endregion
        #region Component Designer generated code
        ///  
		/// Required method for Designer support - do not modify 
		/// the contents of this method with the code editor.
		/// 
		private void InitializeComponent()
		{
            this.panelHeader = new DevComponents.DotNetBar.PanelControl();
            this.pictureHeader = new System.Windows.Forms.PictureBox();
            this.labelDescription = new System.Windows.Forms.Label();
            this.labelCaption = new System.Windows.Forms.Label();
            this.panelFooter = new DevComponents.DotNetBar.PanelControl();
            this.buttonHelp = new ButtonX();
            this.buttonCancel = new ButtonX();
            this.buttonFinish = new ButtonX();
            this.buttonNext = new ButtonX();
            this.buttonBack = new ButtonX();
            this.panelHeader.SuspendLayout();
            this.panelFooter.SuspendLayout();
            this.SuspendLayout();
            // 
            // panelHeader
            // 
            this.panelHeader.AntiAlias=false;
            this.panelHeader.BackColor = Color.Transparent;
			this.panelHeader.CanvasColor = System.Drawing.SystemColors.Control;
            this.panelHeader.Controls.Add(this.pictureHeader);
            this.panelHeader.Controls.Add(this.labelDescription);
            this.panelHeader.Controls.Add(this.labelCaption);
            this.panelHeader.Dock = System.Windows.Forms.DockStyle.Top;
            this.panelHeader.Location = new System.Drawing.Point(0, 0);
            this.panelHeader.Name = "panelHeader";
            this.panelHeader.Size = new System.Drawing.Size(548, 60);
            // 
            // 
            // 
            this.panelHeader.Style.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
            this.panelHeader.Style.BackColorGradientAngle = 90;
            this.panelHeader.Style.BorderBottom = DevComponents.DotNetBar.eStyleBorderType.Etched;
            this.panelHeader.Style.BorderBottomWidth = 1;
            this.panelHeader.Style.BorderColor = System.Drawing.SystemColors.Control;
            this.panelHeader.Style.BorderLeftWidth = 1;
            this.panelHeader.Style.BorderRightWidth = 1;
            this.panelHeader.Style.BorderTopWidth = 1;
            this.panelHeader.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
            this.panelHeader.Style.TextColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelText;
            this.panelHeader.TabIndex = 5;
            // 
            // pictureHeader
            // 
            this.pictureHeader.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.pictureHeader.Location = new System.Drawing.Point(496, 6);
            this.pictureHeader.Name = "pictureHeader";
            this.pictureHeader.Size = new System.Drawing.Size(48, 48);
            this.pictureHeader.TabIndex = 7;
            this.pictureHeader.TabStop = false;
            this.pictureHeader.BackgroundImageLayout = ImageLayout.None;
            // 
            // labelDescription
            // 
            this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.labelDescription.Location = new System.Drawing.Point(44, 22);
            this.labelDescription.Name = "labelDescription";
            this.labelDescription.Size = new System.Drawing.Size(446, 32);
            this.labelDescription.TabIndex = 1;
            // 
            // labelCaption
            // 
            this.labelCaption.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.labelCaption.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.labelCaption.Location = new System.Drawing.Point(16, 5);
            this.labelCaption.Name = "labelCaption";
            this.labelCaption.Size = new System.Drawing.Size(474, 17);
            this.labelCaption.TabIndex = 0;
            // 
            // panelFooter
            // 
			this.panelFooter.BackColor = System.Drawing.SystemColors.Control;
			this.panelFooter.CanvasColor = System.Drawing.SystemColors.Control;
            this.panelFooter.Controls.Add(this.buttonHelp);
            this.panelFooter.Controls.Add(this.buttonCancel);
            this.panelFooter.Controls.Add(this.buttonFinish);
            this.panelFooter.Controls.Add(this.buttonNext);
            this.panelFooter.Controls.Add(this.buttonBack);
            this.panelFooter.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.panelFooter.Location = new System.Drawing.Point(0, 329);
            this.panelFooter.Name = "panelFooter";
            this.panelFooter.Size = new System.Drawing.Size(548, 46);
			this.panelFooter.AntiAlias = false;
            // 
            // 
            // 
            this.panelFooter.TabIndex = 6;
            this.panelFooter.Resize += new System.EventHandler(this.panelFooter_Resize);
            // 
            // buttonHelp
            // 
            this.buttonHelp.CausesValidation = false;
            this.buttonHelp.Location = new System.Drawing.Point(462, 13);
            this.buttonHelp.Name = "buttonHelp";
            this.buttonHelp.Size = new System.Drawing.Size(74, 22);
            this.buttonHelp.TabIndex = 5;
            this.buttonHelp.Text = "Help";
            this.buttonHelp.VisibleChanged += new System.EventHandler(this.CommandButtonVisibleChanged);
            this.buttonHelp.Click += new System.EventHandler(this.buttonHelp_Click);
            this.buttonHelp.ThemeAware = true;
            this.buttonHelp.Style = eDotNetBarStyle.Office2000;
            this.buttonHelp.ColorTable = eButtonColor.Office2007WithBackground;
            // 
            // buttonCancel
            // 
            this.buttonCancel.CausesValidation = false;
            this.buttonCancel.Location = new System.Drawing.Point(382, 13);
            this.buttonCancel.Name = "buttonCancel";
            this.buttonCancel.Size = new System.Drawing.Size(74, 22);
            this.buttonCancel.TabIndex = 4;
            this.buttonCancel.Text = "Cancel";
            this.buttonCancel.VisibleChanged += new System.EventHandler(this.CommandButtonVisibleChanged);
            this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
            this.buttonCancel.ThemeAware = true;
            this.buttonCancel.Style = eDotNetBarStyle.Office2000;
            this.buttonCancel.ColorTable = eButtonColor.Office2007WithBackground;
            // 
            // buttonFinish
            // 
            this.buttonFinish.Location = new System.Drawing.Point(148, 13);
            this.buttonFinish.Name = "buttonFinish";
            this.buttonFinish.Size = new System.Drawing.Size(74, 22);
            this.buttonFinish.TabIndex = 3;
            this.buttonFinish.Text = "Finish";
            this.buttonFinish.VisibleChanged += new System.EventHandler(this.CommandButtonVisibleChanged);
            this.buttonFinish.Click += new System.EventHandler(this.buttonFinish_Click);
            this.buttonFinish.ThemeAware = true;
            this.buttonFinish.Style = eDotNetBarStyle.Office2000;
            this.buttonFinish.ColorTable = eButtonColor.Office2007WithBackground;
            // 
            // buttonNext
            // 
            this.buttonNext.Location = new System.Drawing.Point(302, 13);
            this.buttonNext.Name = "buttonNext";
            this.buttonNext.Size = new System.Drawing.Size(74, 22);
            this.buttonNext.TabIndex = 2;
            this.buttonNext.Text = "Next >";
            this.buttonNext.VisibleChanged += new System.EventHandler(this.CommandButtonVisibleChanged);
            this.buttonNext.Click += new System.EventHandler(this.buttonNext_Click);
            this.buttonNext.ThemeAware = true;
            this.buttonNext.Style = eDotNetBarStyle.Office2000;
            this.buttonNext.ColorTable = eButtonColor.Office2007WithBackground;
            // 
            // buttonBack
            // 
            this.buttonBack.CausesValidation = false;
            this.buttonBack.Location = new System.Drawing.Point(228, 13);
            this.buttonBack.Name = "buttonBack";
            this.buttonBack.Size = new System.Drawing.Size(74, 22);
            this.buttonBack.TabIndex = 1;
            this.buttonBack.Text = "< Back";
            this.buttonBack.VisibleChanged += new System.EventHandler(this.CommandButtonVisibleChanged);
            this.buttonBack.Click += new System.EventHandler(this.buttonBack_Click);
            this.buttonBack.ThemeAware = true;
            this.buttonBack.Style = eDotNetBarStyle.Office2000;
            this.buttonBack.ColorTable = eButtonColor.Office2007WithBackground;
            // 
            // Wizard
            // 
            this.Controls.Add(this.panelHeader);
            this.Controls.Add(this.panelFooter);
            this.Name = "Wizard";
            this.Size = new System.Drawing.Size(548, 375);
            this.panelHeader.ResumeLayout(false);
            this.panelFooter.ResumeLayout(false);
            this.ResumeLayout(false);
		}
		#endregion
        #region Public Properties
        /// 
        /// Gets or sets the header image. Default value is null which means that internal header image is used. You can hide header image
        /// by setting HeaderImageVisible property.
        /// 
        [Browsable(true), Category("Header and Footer"), DefaultValue(null), Description("Indicates the header image.")]
        public Image HeaderImage
        {
            get { return m_HeaderImage; }
            set
            {
                m_HeaderImage = value;
                m_HeaderImageChanged = true;
                UpdatePageDisplay();
            }
        }
        /// 
        /// Gets or sets whether header image is visible. Default value is true.
        /// 
        [Browsable(true), Category("Header and Footer"), DefaultValue(true), Description("Indicates whether header image is visible.")]
        public bool HeaderImageVisible
        {
            get { return m_HeaderImageVisible; }
            set
            {
				m_HeaderImageVisible=value;
                if (pictureHeader.Visible != m_HeaderImageVisible)
                {
                    pictureHeader.Visible = m_HeaderImageVisible;
                    LayoutHeader();
                }
            }
        }
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public new Control.ControlCollection Controls
        {
            get
            {
                return base.Controls;
            }
        }
        /// 
        /// Gets or sets wizard button that is clicked when ENTER key is pressed. Default value is eWizardFormAcceptButton.FinishAndNext which 
        /// indicates that finish button will be clicked if available otherwise next button will be clicked.
        /// 
        [Browsable(true), DefaultValue(eWizardFormAcceptButton.FinishAndNext), Category("Wizard Behavior"), Description("Indicates wizard button that is clicked when ENTER key is pressed.")]
        public eWizardFormAcceptButton FormAcceptButton
        {
            get { return m_FormAcceptButton; }
            set
            {
                m_FormAcceptButton = value;
                SetFormAcceptButton();
            }
        }
        /// 
        /// Gets or sets wizard button that is clicked when ESCAPE key is pressed. Default value is eWizardFormCancelButton.Cancel which 
        /// indicates that Cancel button will be clicked.
        /// 
        [Browsable(true), DefaultValue(eWizardFormCancelButton.Cancel), Category("Wizard Behavior"), Description("Indicates wizard button that is clicked when ESCAPE key is pressed.")]
        public eWizardFormCancelButton FormCancelButton
        {
            get { return m_FormCancelButton; }
            set
            {
                m_FormCancelButton = value;
                SetFormCancelButton();
            }
        }
        /// 
        /// Gets or sets whether all buttons are disabled while wizard page is changed which prevents users from clicking the buttons
        /// if page change is taking longer. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Behavior"), Description("Indicates whether all buttons are disabled while wizard page is changed.")]
        public bool PageChangeDisableButtons
        {
            get { return m_PageChangeDisableButtons; }
            set { m_PageChangeDisableButtons = value; }
        }
        /// 
        /// Gets or sets whether wait cursor is displayed while page is changed. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Behavior"), Description("Indicates whether wait cursor is displayed while page is changed.")]
        public bool PageChangeWaitCursor
        {
            get { return m_PageChangeWaitCursor; }
            set { m_PageChangeWaitCursor = value; }
        }
        /// 
        /// Gets or sets the selected page index. You can set this property to change the currently selected wizard page.
        /// 
        [Browsable(false), Category("Wizard Pages"), Description("Indicates selected page index."), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public int SelectedPageIndex
        {
            get { return m_SelectedPageIndex; }
            set
            {
                if (value < 0)
                    value = 0;
                if (value < m_WizardPages.Count)
                    ShowPage(m_WizardPages[value], eWizardPageChangeSource.Code);
                else
                    m_SelectedPageIndex = value;
            }
        }
        /// 
        /// Gets or sets selected wizard page. You can set this property to change the currently selected wizard page.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public WizardPage SelectedPage
        {
            get
            {
                if (m_SelectedPageIndex < m_WizardPages.Count)
                    return m_WizardPages[m_SelectedPageIndex];
                return null;
            }
            set
            {
                if (!m_WizardPages.Contains(value))
                    throw new InvalidOperationException("WizardPage is not member of WizardPages collection. Add page to the WizardPages collection before setting this property");
                ShowPage(value, eWizardPageChangeSource.Code);
            }
        }
        /// 
        /// Gets the collection of Wizard pages. The order of WizardPage objects inside of this collection determines the flow of the wizard.
        /// 
        [Browsable(true), Category("Wizard Pages"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public WizardPageCollection WizardPages
        {
            get
            {
                return m_WizardPages;
            }
        }
        /// 
        /// Returns a Stack of page history. Each time next page is displayed by wizard, previously visited page is added to the history.
        /// When user commands Wizard back, the last page from the history is shown and removed from the stack. You should not modify this collection
        /// directly since it is maintained by Wizard control.
        /// 
        [Browsable(false), Category("Wizard Pages"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public Stack PagesHistory
        {
            get
            {
                return m_PagesHistory;
            }
        }
        /// 
        /// Gets or sets the FlatStyle setting for the wizard buttons. Default value is FlatStyle.System
        /// 
        [DefaultValue(FlatStyle.System), Browsable(false), Category("Wizard Buttons"), Description("Indicates flat style for buttons"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Obsolete("Property is obsolete and no longer applies")]
        public FlatStyle ButtonFlatStyle
        {
            get { return m_ButtonFlatStyle; }
            set
            {
                m_ButtonFlatStyle = value;
            }
        }
        /// 
        /// Gets or sets height of wizard command buttons. Default value is 22 pixels.
        /// 
        [Browsable(true), DefaultValue(22), Category("Wizard Buttons"), Description("Indicates the height of the wizard command buttons")]
        public int ButtonHeight
        {
            get { return m_ButtonHeight; }
            set
            {
                if (m_ButtonHeight != value)
                {
                    m_ButtonHeight = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets whether back button causes validation to be performed on any controls that require validation when it receives focus. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether back button causes validation to be performed on any controls that require validation when it receives focus.")]
        public bool BackButtonCausesValidation
        {
            get { return buttonBack.CausesValidation; }
            set {buttonBack.CausesValidation = value;}
        }
        /// 
        /// Gets or sets tab index of back button. Default value is 1.
        /// 
        [Browsable(true), DefaultValue(1), Category("Wizard Buttons"), Description("Indicates tab index of back button.")]
        public int BackButtonTabIndex
        {
            get { return buttonBack.TabIndex; }
            set { buttonBack.TabIndex = value; }
        }
        /// 
        /// Gets or sets a value indicating whether the user can give the focus to this back button using the TAB key. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether the user can give the focus to this back button using the TAB key.")]
        public bool BackButtonTabStop
        {
            get { return buttonBack.TabStop; }
            set { buttonBack.TabStop = value; }
        }
        /// 
        /// Gets or sets caption of the back button.
        /// 
        [Browsable(true), Localizable(true), DefaultValue("< Back"), Category("Wizard Buttons"), Description("Indicates caption of the button")]
        public string BackButtonText
        {
            get { return buttonBack.Text; }
            set { buttonBack.Text = value; }
        }
        /// 
        /// Gets or sets width of the back button. Default value is 74.
        /// 
        [Browsable(true), DefaultValue(74), Category("Wizard Buttons"), Description("Indicates width of button")]
        public int BackButtonWidth
        {
            get { return buttonBack.Width; }
            set
            {
                if (buttonBack.Width != value)
                {
                    buttonBack.Width = value;
                    RepositionButtons();
                }
            }
        }
#if FRAMEWORK20
        /// 
        /// Gets or sets auto size of the button. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button is auto sized")]
        public bool BackButtonAutoSize
        {
            get { return buttonBack.AutoSize; }
            set
            {
                if (buttonBack.AutoSize != value)
                {
                    buttonBack.AutoSize = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets auto size mode of the button. Default value is AutoSizeMode.GrowOnly.
        /// 
        [Browsable(true), DefaultValue(AutoSizeMode.GrowOnly), Category("Wizard Buttons"), Description("Indicates button auto-size mode")]
        public AutoSizeMode BackButtonAutoSizeMode
        {
            get { return buttonBack.AutoSizeMode; }
            set
            {
                if (buttonBack.AutoSizeMode != value)
                {
                    buttonBack.AutoSizeMode = value;
                    RepositionButtons();
                }
            }
        }
#endif
        /// 
        /// Gets or sets whether next button causes validation to be performed on any controls that require validation when it receives focus. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether button causes validation to be performed on any controls that require validation when it receives focus.")]
        public bool NextButtonCausesValidation
        {
            get { return buttonNext.CausesValidation; }
            set { buttonNext.CausesValidation = value; }
        }
        /// 
        /// Gets or sets tab index of next button. Default value is 2.
        /// 
        [Browsable(true), DefaultValue(2), Category("Wizard Buttons"), Description("Indicates tab index of next button.")]
        public int NextButtonTabIndex
        {
            get { return buttonNext.TabIndex; }
            set { buttonNext.TabIndex = value; }
        }
        /// 
        /// Gets or sets a value indicating whether the user can give the focus to button using the TAB key. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether the user can give the focus to button using the TAB key.")]
        public bool NextButtonTabStop
        {
            get { return buttonNext.TabStop; }
            set { buttonNext.TabStop = value; }
        }
        /// 
        /// Gets or sets caption of the next button.
        /// 
        [Browsable(true), Localizable(true), DefaultValue("Next >"), Category("Wizard Buttons"), Description("Indicates caption of the button")]
        public string NextButtonText
        {
            get { return buttonNext.Text; }
            set { buttonNext.Text = value; }
        }
        /// 
        /// Gets or sets width of the next button. Default value is 74.
        /// 
        [Browsable(true), DefaultValue(74), Category("Wizard Buttons"), Description("Indicates width of button")]
        public int NextButtonWidth
        {
            get { return buttonNext.Width; }
            set
            {
                if (buttonNext.Width != value)
                {
                    buttonNext.Width = value;
                    RepositionButtons();
                }
            }
        }
#if FRAMEWORK20
        /// 
        /// Gets or sets auto size of the button. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button is auto sized")]
        public bool NextButtonAutoSize
        {
            get { return buttonNext.AutoSize; }
            set
            {
                if (buttonNext.AutoSize != value)
                {
                    buttonNext.AutoSize = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets auto size mode of the button. Default value is AutoSizeMode.GrowOnly.
        /// 
        [Browsable(true), DefaultValue(AutoSizeMode.GrowOnly), Category("Wizard Buttons"), Description("Indicates button auto-size mode")]
        public AutoSizeMode NextButtonAutoSizeMode
        {
            get { return buttonNext.AutoSizeMode; }
            set
            {
                if (buttonNext.AutoSizeMode != value)
                {
                    buttonNext.AutoSizeMode = value;
                    RepositionButtons();
                }
            }
        }
#endif
        /// 
        /// Gets or sets whether button causes validation to be performed on any controls that require validation when it receives focus. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button causes validation to be performed on any controls that require validation when it receives focus.")]
        public bool CancelButtonCausesValidation
        {
            get { return buttonCancel.CausesValidation; }
            set { buttonCancel.CausesValidation = value; }
        }
        /// 
        /// Gets or sets tab index of the button. Default value is 4.
        /// 
        [Browsable(true), DefaultValue(4), Category("Wizard Buttons"), Description("Indicates tab index of the button.")]
        public int CancelButtonTabIndex
        {
            get { return buttonCancel.TabIndex; }
            set { buttonCancel.TabIndex = value; }
        }
        /// 
        /// Gets or sets a value indicating whether the user can give the focus to button using the TAB key. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether the user can give the focus to button using the TAB key.")]
        public bool CancelButtonTabStop
        {
            get { return buttonCancel.TabStop; }
            set { buttonCancel.TabStop = value; }
        }
        /// 
        /// Gets or sets caption of the button.
        /// 
        [Browsable(true), Localizable(true), Category("Wizard Buttons"), Description("Indicates caption of the button")] // DefaultValue("Cancel") attribute removed since WinForms designer had trouble localizing with it
        public string CancelButtonText
        {
            get { return buttonCancel.Text; }
            set { buttonCancel.Text = value; }
        }
        /// 
        /// Gets or sets width of the button. Default value is 74.
        /// 
        [Browsable(true), DefaultValue(74), Category("Wizard Buttons"), Description("Indicates width of button")]
        public int CancelButtonWidth
        {
            get { return buttonCancel.Width; }
            set
            {
                if (buttonCancel.Width != value)
                {
                    buttonCancel.Width = value;
                    RepositionButtons();
                }
            }
        }
#if FRAMEWORK20
        /// 
        /// Gets or sets auto size of the button. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button is auto sized")]
        public bool CancelButtonAutoSize
        {
            get { return buttonCancel.AutoSize; }
            set
            {
                if (buttonCancel.AutoSize != value)
                {
                    buttonCancel.AutoSize = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets auto size mode of the button. Default value is AutoSizeMode.GrowOnly.
        /// 
        [Browsable(true), DefaultValue(AutoSizeMode.GrowOnly), Category("Wizard Buttons"), Description("Indicates button auto-size mode")]
        public AutoSizeMode CancelButtonAutoSizeMode
        {
            get { return buttonCancel.AutoSizeMode; }
            set
            {
                if (buttonCancel.AutoSizeMode != value)
                {
                    buttonCancel.AutoSizeMode = value;
                    RepositionButtons();
                }
            }
        }
#endif
        /// 
        /// Gets or sets whether button causes validation to be performed on any controls that require validation when it receives focus. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether button causes validation to be performed on any controls that require validation when it receives focus.")]
        public bool FinishButtonCausesValidation
        {
            get { return buttonFinish.CausesValidation; }
            set { buttonFinish.CausesValidation = value; }
        }
        /// 
        /// Gets or sets tab index of the button. Default value is 4.
        /// 
        [Browsable(true), DefaultValue(4), Category("Wizard Buttons"), Description("Indicates tab index of the button.")]
        public int FinishButtonTabIndex
        {
            get { return buttonFinish.TabIndex; }
            set { buttonFinish.TabIndex = value; }
        }
        /// 
        /// Gets or sets a value indicating whether the user can give the focus to button using the TAB key. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether the user can give the focus to button using the TAB key.")]
        public bool FinishButtonTabStop
        {
            get { return buttonFinish.TabStop; }
            set { buttonFinish.TabStop = value; }
        }
        /// 
        /// Gets or sets caption of the button.
        /// 
        [Browsable(true), Localizable(true), DefaultValue("Finish"), Category("Wizard Buttons"), Description("Indicates caption of the button")]
        public string FinishButtonText
        {
            get { return buttonFinish.Text; }
            set { buttonFinish.Text = value; }
        }
        /// 
        /// Gets or sets width of the button. Default value is 74.
        /// 
        [Browsable(true), DefaultValue(74), Category("Wizard Buttons"), Description("Indicates width of button")]
        public int FinishButtonWidth
        {
            get { return buttonFinish.Width; }
            set
            {
                if (buttonFinish.Width != value)
                {
                    buttonFinish.Width = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets whether finish button is always visible next to the Next button. Default value is false which means that Finish
        /// button will be visible only on last Wizard page and it will replace the Next button. When set to true Finish button is always visible next
        /// to the Next button except on first Welcome wizard page.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether Finish button is always visible or only when needed.")]
        public bool FinishButtonAlwaysVisible
        {
            get { return m_FinishButtonAlwaysVisible; }
            set
            {
                if (m_FinishButtonAlwaysVisible != value)
                {
                    m_FinishButtonAlwaysVisible = value;
                    OnFinishButtonAlwaysVisibleChanged();
                    RepositionButtons();
                }
            }
        }
#if FRAMEWORK20
        /// 
        /// Gets or sets auto size of the button. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button is auto sized")]
        public bool FinishButtonAutoSize
        {
            get { return buttonFinish.AutoSize; }
            set
            {
                if (buttonFinish.AutoSize != value)
                {
                    buttonFinish.AutoSize = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets auto size mode of the button. Default value is AutoSizeMode.GrowOnly.
        /// 
        [Browsable(true), DefaultValue(AutoSizeMode.GrowOnly), Category("Wizard Buttons"), Description("Indicates button auto-size mode")]
        public AutoSizeMode FinishButtonAutoSizeMode
        {
            get { return buttonFinish.AutoSizeMode; }
            set
            {
                if (buttonFinish.AutoSizeMode != value)
                {
                    buttonFinish.AutoSizeMode = value;
                    RepositionButtons();
                }
            }
        }
#endif
        /// 
        /// Gets or sets whether button causes validation to be performed on any controls that require validation when it receives focus. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button causes validation to be performed on any controls that require validation when it receives focus.")]
        public bool HelpButtonCausesValidation
        {
            get { return buttonHelp.CausesValidation; }
            set { buttonHelp.CausesValidation = value; }
        }
        /// 
        /// Gets or sets whether button is visible. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether button is visible")]
        public bool HelpButtonVisible
        {
            get { return m_HelpButtonVisible; }
            set
            {
                m_HelpButtonVisible = value;
                buttonHelp.Visible = m_HelpButtonVisible;
                RepositionButtons();
            }
        }
        /// 
        /// Gets or sets tab index of the button. Default value is 5.
        /// 
        [Browsable(true), DefaultValue(5), Category("Wizard Buttons"), Description("Indicates tab index of the button.")]
        public int HelpButtonTabIndex
        {
            get { return buttonHelp.TabIndex; }
            set { buttonHelp.TabIndex = value; }
        }
        /// 
        /// Gets or sets a value indicating whether the user can give the focus to button using the TAB key. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Wizard Buttons"), Description("Indicates whether the user can give the focus to button using the TAB key.")]
        public bool HelpButtonTabStop
        {
            get { return buttonHelp.TabStop; }
            set { buttonHelp.TabStop = value; }
        }
        /// 
        /// Gets or sets caption of the button.
        /// 
        [Browsable(true), Localizable(true), DefaultValue("Help"), Category("Wizard Buttons"), Description("Indicates caption of the button")]
        public string HelpButtonText
        {
            get { return buttonHelp.Text; }
            set { buttonHelp.Text = value; }
        }
        /// 
        /// Gets or sets width of the button. Default value is 74.
        /// 
        [Browsable(true), DefaultValue(74), Category("Wizard Buttons"), Description("Indicates width of button")]
        public int HelpButtonWidth
        {
            get { return buttonHelp.Width; }
            set
            {
                if (buttonHelp.Width != value)
                {
                    buttonHelp.Width = value;
                    RepositionButtons();
                }
            }
        }
#if FRAMEWORK20
        /// 
        /// Gets or sets auto size of the button. Default value is false.
        /// 
        [Browsable(true), DefaultValue(false), Category("Wizard Buttons"), Description("Indicates whether button is auto sized")]
        public bool HelpButtonAutoSize
        {
            get { return buttonHelp.AutoSize; }
            set
            {
                if (buttonHelp.AutoSize != value)
                {
                    buttonHelp.AutoSize = value;
                    RepositionButtons();
                }
            }
        }
        /// 
        /// Gets or sets auto size mode of the button. Default value is AutoSizeMode.GrowOnly.
        /// 
        [Browsable(true), DefaultValue(AutoSizeMode.GrowOnly), Category("Wizard Buttons"), Description("Indicates button auto-size mode")]
        public AutoSizeMode HelpButtonAutoSizeMode
        {
            get { return buttonHelp.AutoSizeMode; }
            set
            {
                if (buttonHelp.AutoSizeMode != value)
                {
                    buttonHelp.AutoSizeMode = value;
                    RepositionButtons();
                }
            }
        }
#endif
        /// 
        /// Gets or sets the height of the wizard footer. Default value is 46
        /// 
        [Browsable(true), DefaultValue(46), Category("Header and Footer"), Description("Indicates height of the wizard footer.")]
        public int FooterHeight
        {
            get { return panelFooter.Height; }
            set
            {
                if (panelFooter.Height != value)
                {
                    panelFooter.Height = value;
                    RepositionButtons();
                    SetupPage(this.SelectedPage);
                }
            }
        }
        /// 
        /// Gets or sets the height of the wizard header. Default value is 60
        /// 
        [Browsable(true), DefaultValue(60), Category("Header and Footer"), Description("Indicates height of the wizard header.")]
        public int HeaderHeight
        {
            get { return panelHeader.Height; }
            set
            {
                if (panelHeader.Height != value)
                {
                    panelHeader.Height = value;
                    SetupPage(this.SelectedPage);
                }
            }
        }
        private eWizardTitleImageAlignment _HeaderImageAlignment = eWizardTitleImageAlignment.Right;
        /// 
        /// Gets or sets the header image alignment. Default value is right.
        /// 
        [DefaultValue(eWizardTitleImageAlignment.Right), Category("Header and Footer"), Description("Indicates header image alignment.")]
        public eWizardTitleImageAlignment HeaderImageAlignment
        {
            get { return _HeaderImageAlignment; }
            set { _HeaderImageAlignment = value; LayoutHeader(); }
        }
        /// 
        /// Gets or sets the header image size for interior wizard pages. Default value is 48x48
        /// 
        [Browsable(true), Category("Header and Footer"), Description("Indicates header image size for interior wizard pages.")]
        public Size HeaderImageSize
        {
            get { return pictureHeader.Size; }
            set
            {
                if (pictureHeader.Size != value)
                {
                    pictureHeader.Size = value;
                    LayoutHeader();
                }
            }
        }
        private bool ShouldSerializeHeaderImageSize()
        {
            return (pictureHeader.Size.Width != 48 || pictureHeader.Size.Height != 48);
        }
        private void ResetHeaderImageSize()
        {
            TypeDescriptor.GetProperties(this)["HeaderImageSize"].SetValue(this, new Size(48, 48));
        }
        /// 
        /// Gets or sets indentation of header title label. Default value is 16.
        /// 
        [Browsable(true), DefaultValue(16),Category("Header and Footer"), Description("Indicates indentation of header title label.")]
        public int HeaderTitleIndent
        {
            get { return labelCaption.Left; }
            set
            {
                if (labelCaption.Left != value)
                {
                    labelCaption.Left = value;
                    LayoutHeader();
                }
            }
        }
        /// 
        /// Gets or sets indentation of header description label. Default value is 44.
        /// 
        [Browsable(true), DefaultValue(44), Category("Header and Footer"), Description("Indicates indentation of header description label.")]
        public int HeaderDescriptionIndent
        {
            get { return labelDescription.Left; }
            set
            {
                if (labelDescription.Left != value)
                {
                    labelDescription.Left = value;
                    LayoutHeader();
                }
            }
        }
        // 
        /// Indicates the font used to render header description text.
        /// 
        [Category("Header and Footer"), Description(" Indicates the font used to render header description text.")]
        public Font HeaderDescriptionFont
        {
            get { return labelDescription.Font; }
            set { labelDescription.Font = value; LayoutHeader(); }
        }
        /// 
        /// Indicates the font used to render caption header text.
        /// 
        [Category("Header and Footer"), Description("Indicates the font used to render caption header text.")]
        public Font HeaderCaptionFont
        {
            get { return labelCaption.Font; }
            set { labelCaption.Font = value; LayoutHeader(); }
        }
        private bool _HeaderDescriptionVisible = true;
        /// 
        /// Gets or sets whether description text displayed in wizard header is visible.
        /// 
        [DefaultValue(true), Category("Header and Footer"), Description("Indicates whether description text displayed in wizard header is visible.")]
        public bool HeaderDescriptionVisible
        {
            get { return _HeaderDescriptionVisible; }
            set
            {
                _HeaderDescriptionVisible = value;
                labelDescription.Visible = value;
                LayoutHeader();
            }
        }
        
        /// 
        /// Gets or sets the header background style.
        /// 
        [Browsable(true), DevCoBrowsable(true), NotifyParentPropertyAttribute(true), Category("Style"), Description("Gets or sets header background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ElementStyle HeaderStyle
        {
            get
            {
                return panelHeader.Style;
            }
        }
        /// 
        ///     Resets the style to it's default value.
        /// 
        private void ResetHeaderStyle()
        {
            panelHeader.ResetStyle();
        }
        /// 
        /// Gets or sets the footer background style.
        /// 
        [Browsable(true), DevCoBrowsable(true), NotifyParentPropertyAttribute(true), Category("Style"), Description("Gets or sets footer background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ElementStyle FooterStyle
        {
            get
            {
                return panelFooter.Style;
            }
        }
        /// 
        ///     Resets the style to it's default value.
        /// 
        private void ResetFooterStyle()
        {
            panelFooter.ResetStyle();
        }
        #endregion
        #region Internal Implementation
        /// 
        /// Simulates Back button click on Wizard control. Note that this method will raise the same events as 
        /// standard Wizard Back button click.
        /// 
        public void NavigateBack()
        {
            CancelEventArgs ce = new CancelEventArgs();
            OnBackButtonClick(ce);
            if (ce.Cancel)
                return;
            WizardPage page = this.SelectedPage;
            if (page != null)
            {
                page.InvokeBackButtonClick(ce);
                if (ce.Cancel)
                    return;
            }
            page = GetBackPage();
            if (page != null)
            {
                ShowPage(page, eWizardPageChangeSource.BackButton);
            }
        }
        /// 
        /// Simulates Next button click on Wizard control. Note that this method will raise the same events as 
        /// standard Wizard Next button click.
        /// 
        public void NavigateNext()
        {
            CancelEventArgs ce = new CancelEventArgs();
            OnNextButtonClick(ce);
            if (ce.Cancel)
                return;
            WizardPage page = this.SelectedPage;
            if (page != null)
            {
                page.InvokeNextButtonClick(ce);
                if (ce.Cancel)
                    return;
            }
            // Go to next page
            page = GetNextPage();
            if (page == null)
                return;
            WizardPage oldPage = this.SelectedPage;
            if (ShowPage(page, eWizardPageChangeSource.NextButton))
            {
                if (!this.DesignMode)
                    m_PagesHistory.Push(oldPage);
            }
        }
        /// 
        /// Simulates Cancel button click on Wizard control. Note that this method will raise the same events as 
        /// standard Wizard Cancel button click.
        /// 
        public void NavigateCancel()
        {
            CancelEventArgs ce = new CancelEventArgs();
            OnCancelButtonClick(ce);
            if (ce.Cancel)
                return;
            WizardPage page = this.SelectedPage;
            if (page != null)
            {
                page.InvokeCancelButtonClick(ce);
                if (ce.Cancel)
                    return;
            }
        }
        /// 
        /// Simulates Finish button click on Wizard control. Note that this method will raise the same events as 
        /// standard Wizard Finish button click.
        /// 
        public void NavigateFinish()
        {
            CancelEventArgs ce = new CancelEventArgs();
            OnFinishButtonClick(ce);
            if (ce.Cancel)
                return;
            WizardPage page = this.SelectedPage;
            if (page != null)
            {
                page.InvokeFinishButtonClick(ce);
                if (ce.Cancel)
                    return;
            }
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            if (this.DesignMode && this.WizardPages.Count == 0)
            {
                Rectangle r = this.ClientRectangle;
                Graphics g = e.Graphics;
                r.Inflate(6, 6);
                TextDrawing.DrawString(g, "Right-click control and use context menu commands to create, delete, navigate and re-order wizard pages. You can use Next and Back button to navigate wizard just like in run-time.",
                    this.Font, SystemColors.ControlDarkDark, r,
                    eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter | eTextFormat.WordBreak);
            }
            base.OnPaint(e);
        }
		protected override void OnResize(EventArgs e)
		{
			base.OnResize(e);
			if(this.DesignMode)
				this.Invalidate();
		}
        private void LayoutHeader()
        {
            int margin = 4;
            int titleWidth = this.Width - labelCaption.Left - margin;
            int descWidth = this.Width - labelDescription.Left - margin;
            if (m_HeaderImageVisible || this.DesignMode)
            {
                if (_HeaderImageAlignment == eWizardTitleImageAlignment.Right)
                {
                    pictureHeader.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
                    pictureHeader.Location = new Point(this.Width - pictureHeader.Width - margin,
                        (panelHeader.Height - pictureHeader.Height) / 2);
                }
                else
                {
                    pictureHeader.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
                    pictureHeader.Location = new Point(margin,
                        (panelHeader.Height - pictureHeader.Height) / 2);
                }
                titleWidth -= (pictureHeader.Width + margin);
                descWidth -= (pictureHeader.Width + margin);
            }
            labelCaption.Width = titleWidth;
            labelDescription.Width = descWidth;
            labelCaption.Top = 5;
            labelCaption.Height = labelCaption.Font.Height + 4;
            if (_HeaderImageAlignment == eWizardTitleImageAlignment.Right)
            {
                labelCaption.Left = 16;
            }
            else
            {
                labelCaption.Left = pictureHeader.Bounds.Right + 10;
                if (!_HeaderDescriptionVisible)
                    labelCaption.Top = (panelHeader.Height - labelCaption.Height) / 2;
            }
            labelDescription.Left = labelCaption.Left;
            if (this.IsRightToLeft)
            {
                pictureHeader.Left = this.Width - pictureHeader.Bounds.Right;
                labelCaption.Left = this.Width - labelCaption.Bounds.Right;
                labelDescription.Left = this.Width - labelDescription.Bounds.Right;
            }
        }
        /// 
        /// Returns reference to internal Next button control.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public ButtonX NextButtonControl
        {
            get { return buttonNext; }
        }
        /// 
        /// Returns reference to internal Cancel button control.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public ButtonX CancelButtonControl
        {
            get { return buttonCancel; }
        }
        /// 
        /// Returns reference to internal Finish button control.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public ButtonX FinishButtonControl
        {
            get { return buttonFinish; }
        }
        /// 
        /// Returns reference to internal Help button control.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public ButtonX HelpButtonControl
        {
            get { return buttonHelp; }
        }
        /// 
        /// Returns reference to internal Back button control.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public ButtonX BackButtonControl
        {
            get { return buttonBack; }
        }
        private bool IsRightToLeft
        {
            get
            {
                return this.RightToLeft == RightToLeft.Yes;
            }
        }
        protected override void OnRightToLeftChanged(EventArgs e)
        {
            this.RepositionButtons();
            this.LayoutHeader();
            base.OnRightToLeftChanged(e);
        }
        private void RepositionButtons()
        {
            int buttonSpacingMajor = Dpi.Width(m_ButtonSpacingMajor);
            int x=panelFooter.Width-buttonSpacingMajor;
            int buttonHeight = Dpi.Height(m_ButtonHeight);
            int y=(panelFooter.Height-buttonHeight)/2;
            WizardButtonsLayoutEventArgs e=new WizardButtonsLayoutEventArgs();
            if (buttonHelp.Visible)
            {
                x -= buttonHelp.Width;
                e.HelpButtonBounds = new Rectangle(x, y, buttonHelp.Width, buttonHeight);
                x -= buttonSpacingMajor;
            }
            if (buttonCancel.Visible)
            {
                x -= buttonCancel.Width;
                e.CancelButtonBounds = new Rectangle(x, y, buttonCancel.Width, buttonHeight);
                x -= buttonSpacingMajor;
            }
            if (buttonFinish.Visible)
            {
                x -= buttonFinish.Width;
                e.FinishButtonBounds = new Rectangle(x, y, buttonFinish.Width, buttonHeight);
                if(m_FinishButtonAlwaysVisible)
                    x -= buttonSpacingMajor;
                else
                    x -= m_ButtonSpacingMinor;
            }
            if (buttonNext.Visible)
            {
                x -= buttonNext.Width;
                e.NextButtonBounds = new Rectangle(x, y, buttonNext.Width, buttonHeight);
                x -= m_ButtonSpacingMinor;
            }
            if (buttonBack.Visible)
            {
                x -= buttonBack.Width;
                e.BackButtonBounds = new Rectangle(x, y, buttonBack.Width, buttonHeight);
                x -= m_ButtonSpacingMinor;
            }
            if (IsRightToLeft)
            {
                int xOffset = panelFooter.Width-x;
                if (!e.HelpButtonBounds.IsEmpty)
                {
                    Rectangle r = e.HelpButtonBounds;
                    e.HelpButtonBounds = new Rectangle(panelFooter.Width - r.Right, r.Y, r.Width, r.Height);
                }
                if (!e.CancelButtonBounds.IsEmpty)
                {
                    Rectangle r = e.CancelButtonBounds;
                    e.CancelButtonBounds = new Rectangle(panelFooter.Width - r.Right, r.Y, r.Width, r.Height);
                }
                if (!e.FinishButtonBounds.IsEmpty)
                {
                    Rectangle r = e.FinishButtonBounds;
                    e.FinishButtonBounds = new Rectangle(panelFooter.Width - r.Right, r.Y, r.Width, r.Height);
                }
                if (!e.NextButtonBounds.IsEmpty)
                {
                    Rectangle r = e.NextButtonBounds;
                    e.NextButtonBounds = new Rectangle(panelFooter.Width - r.Right, r.Y, r.Width, r.Height);
                }
                if (!e.BackButtonBounds.IsEmpty)
                {
                    Rectangle r = e.BackButtonBounds;
                    e.BackButtonBounds = new Rectangle(panelFooter.Width - r.Right, r.Y, r.Width, r.Height);
                }
            }
            OnLayoutWizardButtons(e);
            if (buttonHelp.Visible)
                buttonHelp.Bounds = e.HelpButtonBounds;
            if (buttonCancel.Visible)
                buttonCancel.Bounds = e.CancelButtonBounds;
            if (buttonNext.Visible)
                buttonNext.Bounds = e.NextButtonBounds;
            if (buttonFinish.Visible)
                buttonFinish.Bounds = e.FinishButtonBounds;
            if (buttonBack.Visible)
                buttonBack.Bounds = e.BackButtonBounds;
        }
        private void OnFinishButtonAlwaysVisibleChanged()
        {
        }
        private void panelFooter_Resize(object sender, EventArgs e)
        {
            RepositionButtons();
        }
        private void CommandButtonVisibleChanged(object sender, EventArgs e)
        {
            RepositionButtons();
        }
        private void buttonBack_Click(object sender, EventArgs e)
        {
            NavigateBack();
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public WizardPage GetBackPage()
        {
            WizardPage page = null;
            if (m_PagesHistory.Count > 0)
            {
                page = m_PagesHistory.Pop() as WizardPage;
            }
            else
            {
                if (this.SelectedPageIndex > 0)
                {
                    page = m_WizardPages[this.SelectedPageIndex - 1];
                }
            }
            return page;
        }
        private void buttonNext_Click(object sender, EventArgs e)
        {
            NavigateNext();
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public WizardPage GetNextPage()
        {
            if (this.SelectedPageIndex + 1 < m_WizardPages.Count)
                return m_WizardPages[this.SelectedPageIndex + 1];
            return null;
        }
        private void buttonFinish_Click(object sender, EventArgs e)
        {
            NavigateFinish();
        }
        private void buttonCancel_Click(object sender, EventArgs e)
        {
            NavigateCancel();
        }
        private void buttonHelp_Click(object sender, EventArgs e)
        {
            CancelEventArgs ce = new CancelEventArgs();
            OnHelpButtonClick(ce);
            if (ce.Cancel)
                return;
            WizardPage page = this.SelectedPage;
            if (page != null)
            {
                page.InvokeHelpButtonClick(ce);
                if (ce.Cancel)
                    return;
            }
        }
        internal void OnWizardPageAdded(WizardPage page)
        {
            SetupPage(page);
            if (m_WizardPages.IndexOf(page) == m_SelectedPageIndex)
                ShowPage(page, eWizardPageChangeSource.Code);
            else
                page.Visible = false;
                
            this.Controls.Add(page);
            SetupButtons(true);
        }
        internal void OnWizardPageRemoved(WizardPage page)
        {
            this.Controls.Remove(page);
            if (page.Visible && this.SelectedPage!=null && !this.SelectedPage.Visible)
            {
                ShowPage(this.SelectedPage, eWizardPageChangeSource.Code);
            }
        }
        private bool ShowPage(WizardPage page, eWizardPageChangeSource changeSource)
        {
            WizardPage oldPage = this.SelectedPage;
            WizardCancelPageChangeEventArgs e = new WizardCancelPageChangeEventArgs(page, oldPage, changeSource);
            OnWizardPageChanging(e);
            if (e.Cancel || e.NewPage==null)
                return false;
            page = e.NewPage;
            if (page != null)
            {
                page.InvokeBeforePageDisplayed(e);
                if (e.Cancel || e.NewPage == null)
                    return false;
                page = e.NewPage;
            }
            if (m_PageChangeDisableButtons)
            {
                buttonBack.Enabled = false;
                buttonNext.Enabled = false;
                buttonFinish.Enabled = false;
                buttonCancel.Enabled = false;
            }
            if(m_PageChangeWaitCursor)
                this.Cursor = Cursors.WaitCursor;
            // Change the page
            if (oldPage != null)
            {
                if (oldPage != page)
                {
                    if (this.DesignMode)
                        TypeDescriptor.GetProperties(oldPage)["Visible"].SetValue(oldPage, false);
                    oldPage.Visible = false;
                    oldPage.InvokeAfterPageHidden(new WizardPageChangeEventArgs(page, oldPage, changeSource));
                }
                else
                {
                    foreach (WizardPage wp in this.WizardPages)
                    {
                        if (wp != page)
                        {
                            if (this.DesignMode)
                                TypeDescriptor.GetProperties(wp)["Visible"].SetValue(wp, false);
                            wp.Visible = false;
                        }
                    }
                }
            }
            if (page != null)
            {
                if (this.DesignMode)
                    TypeDescriptor.GetProperties(page)["Visible"].SetValue(page, true);
                page.Visible = true;
            }
            m_SelectedPageIndex = m_WizardPages.IndexOf(page);
            SetupButtons(true);
            UpdatePageDisplay();
            // Raise event
            e.Cancel = false;
            OnWizardPageChanged(e);
            if (page != null)
            {
                page.InvokeAfterPageDisplayed(new WizardPageChangeEventArgs(page, oldPage, changeSource));
            }
            if (m_PageChangeWaitCursor)
                this.Cursor = Cursors.Default;
            return true;
        }
        internal void UpdatePageDisplay()
        {
            WizardPage page = this.SelectedPage;
            if (page == null)
                return;
            if (page.InteriorPage)
            {
                if (!panelHeader.Visible)
                    panelHeader.Visible = true;
				if(pictureHeader.Visible != m_HeaderImageVisible)
				{
					pictureHeader.Visible = m_HeaderImageVisible;
					LayoutHeader();
				}
            }
            else
            {
                if (panelHeader.Visible)
                    panelHeader.Visible = false;
            }
            labelCaption.Text = page.PageTitle;
            labelDescription.Text = page.PageDescription;
            if (page.PageHeaderImage != null)
            {
                pictureHeader.BackgroundImage = page.PageHeaderImage;
                m_HeaderImageChanged = true;
            }
            else if (m_HeaderImageChanged)
            {
                if (m_HeaderImage != null)
                    pictureHeader.BackgroundImage = m_HeaderImage;
                else
                    pictureHeader.BackgroundImage = BarFunctions.LoadBitmap("SystemImages.WizardHeaderImage.png");
                m_HeaderImageChanged = false;
            }
            if (page.FormCaption != "")
            {
                Form f = this.FindForm();
                if (f != null)
                    f.Text = page.FormCaption;
            }
#if !TRIAL
			if (NativeFunctions.keyValidated2 != 266)
				labelCaption.Text="Invalid DotNetBar License";
#endif
        }
        internal void SetupButtons(bool canSetFocus)
        {
            eWizardButtonState backButtonEnabled = eWizardButtonState.Auto;
            eWizardButtonState backButtonVisible = eWizardButtonState.Auto;
            eWizardButtonState nextButtonEnabled = eWizardButtonState.Auto;
            eWizardButtonState nextButtonVisible = eWizardButtonState.Auto;
            eWizardButtonState finishButtonEnabled = eWizardButtonState.Auto;
            eWizardButtonState cancelButtonEnabled = eWizardButtonState.Auto;
            eWizardButtonState cancelButtonVisible = eWizardButtonState.Auto;
            eWizardButtonState helpButtonEnabled = eWizardButtonState.Auto;
            eWizardButtonState helpButtonVisible = eWizardButtonState.Auto;
            WizardPage page = this.SelectedPage;
            if (page != null)
            {
                backButtonEnabled = page.BackButtonEnabled;
                backButtonVisible = page.BackButtonVisible;
                nextButtonEnabled = page.NextButtonEnabled;
                nextButtonVisible = page.NextButtonVisible;
                finishButtonEnabled = page.FinishButtonEnabled;
                cancelButtonEnabled = page.CancelButtonEnabled;
                cancelButtonVisible = page.CancelButtonVisible;
                helpButtonEnabled = page.HelpButtonEnabled;
                helpButtonVisible = page.HelpButtonVisible;
            }
            if (!m_HelpButtonVisible)
                helpButtonVisible = eWizardButtonState.False;
            if (this.WizardPages.Count == 0 && this.DesignMode)
            {
                backButtonEnabled = eWizardButtonState.False;
                nextButtonEnabled = eWizardButtonState.False;
                finishButtonEnabled = eWizardButtonState.False;
                cancelButtonEnabled = eWizardButtonState.False;
            }
            // Help button
            if (helpButtonVisible == eWizardButtonState.False)
                buttonHelp.Visible = false;
            else if(!buttonHelp.Visible)
                buttonHelp.Visible = true;
            if (helpButtonEnabled == eWizardButtonState.False)
                buttonHelp.Enabled = false;
            else if(!buttonHelp.Enabled)
                buttonHelp.Enabled = true;
            // Cancel button
            if (cancelButtonVisible == eWizardButtonState.False)
                buttonCancel.Visible = false;
            else if (!buttonCancel.Visible)
                buttonCancel.Visible = true;
            if (cancelButtonEnabled == eWizardButtonState.False)
                buttonCancel.Enabled = false;
            else if(!buttonCancel.Enabled)
                buttonCancel.Enabled = true;
            
            // Finish button
            if (m_FinishButtonAlwaysVisible ||
                this.SelectedPageIndex == m_WizardPages.Count - 1 || finishButtonEnabled == eWizardButtonState.True)
            {
                if (!buttonFinish.Visible)
                    buttonFinish.Visible = true;
            }
            else
                buttonFinish.Visible = false;
            if (finishButtonEnabled == eWizardButtonState.False ||
                finishButtonEnabled == eWizardButtonState.Auto && this.SelectedPageIndex < m_WizardPages.Count - 1)
            {
                buttonFinish.Enabled = false;
            }
            else if (!buttonFinish.Enabled)
                buttonFinish.Enabled = true;
            // Next button
            if (nextButtonVisible == eWizardButtonState.True)
            {
                if (!buttonNext.Visible)
                    buttonNext.Visible = true;
            }
            else if (nextButtonVisible == eWizardButtonState.Auto)
            {
                if (buttonFinish.Visible && buttonFinish.Enabled && !m_FinishButtonAlwaysVisible)
                    buttonNext.Visible = false;
                else if (!buttonNext.Visible)
                    buttonNext.Visible = true;
            }
            else if (buttonNext.Visible)
                buttonNext.Visible = false;
            if (nextButtonEnabled == eWizardButtonState.True)
            {
                if (!buttonNext.Enabled)
                    buttonNext.Enabled = true;
            }
            else if (nextButtonEnabled == eWizardButtonState.Auto)
            {
                if (buttonFinish.Visible && buttonFinish.Enabled || this.SelectedPageIndex == m_WizardPages.Count - 1)
                    buttonNext.Enabled = false;
                else if (!buttonNext.Enabled)
                    buttonNext.Enabled = true;
            }
            else if (buttonNext.Enabled)
                buttonNext.Enabled = false;
            if (canSetFocus)
            {
                if (buttonNext.Enabled && buttonNext.Visible)
                    buttonNext.Select();
                else if (buttonFinish.Enabled && buttonFinish.Visible)
                    buttonFinish.Select();
            }
            if (backButtonVisible == eWizardButtonState.True || backButtonVisible == eWizardButtonState.Auto)
            {
                if (!buttonBack.Visible)
                    buttonBack.Visible = true;
            }
            else if (buttonBack.Visible)
                buttonBack.Visible = false;
            if (backButtonEnabled == eWizardButtonState.True)
            {
                if (!buttonBack.Enabled)
                    buttonBack.Enabled = true;
            }
            else if (backButtonEnabled == eWizardButtonState.Auto)
            {
                if (m_PagesHistory.Count > 0 || this.SelectedPageIndex > 0)
                {
                    if (!buttonBack.Enabled)
                        buttonBack.Enabled = true;
                }
                else if (buttonBack.Enabled)
                    buttonBack.Enabled = false;
            }
            else if (backButtonEnabled == eWizardButtonState.False)
            {
                if (buttonBack.Enabled)
                    buttonBack.Enabled = false;
            }
            SetFormAcceptButton();
            SetFormCancelButton();
            RepositionButtons();
        }
        private void SetFormAcceptButton()
        {
            Form form = this.FindForm();
            if (form == null)
                return;
            if (m_FormAcceptButton == eWizardFormAcceptButton.FinishAndNext)
            {
                if (buttonFinish.Visible && buttonFinish.Enabled)
                {
                    if(form.AcceptButton != buttonFinish)
                        form.AcceptButton = buttonFinish;
                }
                else
                {
                    if (form.AcceptButton != buttonNext)
                        form.AcceptButton = buttonNext;
                }
            }
            else if (m_FormAcceptButton == eWizardFormAcceptButton.Next)
            {
                if (form.AcceptButton != buttonNext)
                    form.AcceptButton = buttonNext;
            }
            else if (m_FormAcceptButton == eWizardFormAcceptButton.Finish)
            {
                if (form.AcceptButton != buttonFinish)
                    form.AcceptButton = buttonFinish;
            }
            else if (m_FormAcceptButton == eWizardFormAcceptButton.None)
            {
                if (form.AcceptButton == buttonFinish || form.AcceptButton == buttonNext)
                    form.AcceptButton = null;
            }
            
        }
        private void SetFormCancelButton()
        {
            Form form = this.FindForm();
            if (form == null)
                return;
            if (m_FormCancelButton == eWizardFormCancelButton.Cancel)
            {
                if(form.CancelButton != buttonCancel)
                    form.CancelButton = buttonCancel;
            }
            else if (form.CancelButton == buttonCancel)
                form.CancelButton = null;
        }
        protected override void OnParentChanged(EventArgs e)
        {
            base.OnParentChanged(e);
            SetFormCancelButton();
            SetFormAcceptButton();
        }
        internal void SetupPage(WizardPage page)
        {
            if (page == null)
                return;
            Size innerPadding = new Size(7, 12);
            this.SuspendLayout();
            try
            {
                Rectangle bounds = Rectangle.Empty;
                if (page.InteriorPage)
                {
                    bounds = new Rectangle(this.ClientRectangle.X + innerPadding.Width,
                         this.ClientRectangle.Y + panelHeader.Height + innerPadding.Height,
                         this.ClientRectangle.Width - innerPadding.Width * 2,
                         this.ClientRectangle.Height - (panelHeader.Height + panelFooter.Height + innerPadding.Height * 2));
                }
                else
                {
                    bounds = new Rectangle(this.ClientRectangle.X,
                         this.ClientRectangle.Y,
                         this.ClientRectangle.Width,
                         this.ClientRectangle.Height - panelFooter.Height);
                }
                TypeDescriptor.GetProperties(page)["Bounds"].SetValue(page, bounds);
                TypeDescriptor.GetProperties(page)["Anchor"].SetValue(page, AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom);
            }
            finally
            {
                this.ResumeLayout();
            }
        }
        private bool _ButtonFocusCuesEnabled = true;
        /// 
        /// Gets or sets whether Focus cues on wizard navigation buttons are enabled. Default value is true.
        /// 
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether Focus cues on wizard navigation buttons are enabled.")]
        public bool ButtonFocusCuesEnabled
        {
            get { return _ButtonFocusCuesEnabled; }
            set
            {
                if (_ButtonFocusCuesEnabled != value)
                {
                    _ButtonFocusCuesEnabled = value;
                    buttonHelp.FocusCuesEnabled = value;
                    buttonCancel.FocusCuesEnabled = value;
                    buttonFinish.FocusCuesEnabled = value;
                    buttonNext.FocusCuesEnabled = value;
                    buttonBack.FocusCuesEnabled = value;
                }
            }
        }
        
        private eWizardStyle m_WizardStyle = eWizardStyle.Default;
        
        /// 
        /// Gets or sets the visual style used for wizard buttons.
        /// 
        [Browsable(false), DefaultValue(eWizardStyle.Default)]
        public eWizardStyle ButtonStyle
        {
            get { return m_WizardStyle; }
            set
            {
                if (m_WizardStyle != value)
                {
                    m_WizardStyle = value;
                    OnWizardStyleChanged();
                }
            }
        }
        private void OnWizardStyleChanged()
        {
            if (m_WizardStyle == eWizardStyle.Default)
            {
                buttonBack.Style = eDotNetBarStyle.Office2000;
                buttonCancel.Style = eDotNetBarStyle.Office2000;
                buttonFinish.Style = eDotNetBarStyle.Office2000;
                buttonHelp.Style = eDotNetBarStyle.Office2000;
                buttonNext.Style = eDotNetBarStyle.Office2000;
                buttonBack.ThemeAware = true;
                buttonCancel.ThemeAware = true;
                buttonFinish.ThemeAware = true;
                buttonHelp.ThemeAware = true;
                buttonNext.ThemeAware = true;
            }
            else
            {
                buttonBack.Style = eDotNetBarStyle.Office2007;
                buttonCancel.Style = eDotNetBarStyle.Office2007;
                buttonFinish.Style = eDotNetBarStyle.Office2007;
                buttonHelp.Style = eDotNetBarStyle.Office2007;
                buttonNext.Style = eDotNetBarStyle.Office2007;
                buttonBack.ThemeAware = false;
                buttonCancel.ThemeAware = false;
                buttonFinish.ThemeAware = false;
                buttonHelp.ThemeAware = false;
                buttonNext.ThemeAware = false;
            }
        }
        #endregion
        #region Event code
        /// 
        /// Raises BackButtonClick event.
        /// 
        /// Event arguments
        protected virtual void OnBackButtonClick(CancelEventArgs e)
        {
            if (BackButtonClick != null)
                BackButtonClick(this, e);
        }
        /// 
        /// Raises NextButtonClick event.
        /// 
        /// Event arguments
        protected virtual void OnNextButtonClick(CancelEventArgs e)
        {
            if (NextButtonClick != null)
                NextButtonClick(this, e);
        }
        /// 
        /// Raises FinishButtonClick event.
        /// 
        /// Event arguments
        protected virtual void OnFinishButtonClick(CancelEventArgs e)
        {
            if (FinishButtonClick != null)
                FinishButtonClick(this, e);
        }
        /// 
        /// Raises CancelButtonClick event.
        /// 
        /// Event arguments
        protected virtual void OnCancelButtonClick(CancelEventArgs e)
        {
            if (CancelButtonClick != null)
                CancelButtonClick(this, e);
        }
        /// 
        /// Raises HelpButtonClick event.
        /// 
        /// Event arguments
        protected virtual void OnHelpButtonClick(CancelEventArgs e)
        {
            if (HelpButtonClick != null)
                HelpButtonClick(this, e);
        }
        /// 
        /// Raises WizardPageChanging event.
        /// 
        /// Provides event arguments
        protected virtual void OnWizardPageChanging(WizardCancelPageChangeEventArgs e)
        {
            if (WizardPageChanging != null)
                WizardPageChanging(this, e);
        }
        /// 
        /// Raises WizardPageChanged event.
        /// 
        /// Provides event arguments
        protected virtual void OnWizardPageChanged(WizardCancelPageChangeEventArgs e)
        {
            if (WizardPageChanged != null)
                WizardPageChanged(this, e);
        }
        protected virtual void OnLayoutWizardButtons(WizardButtonsLayoutEventArgs e)
        {
            if (LayoutWizardButtons != null)
                LayoutWizardButtons(this, e);
        }
        #endregion
		#region Licensing
#if !TRIAL
		private string m_LicenseKey = "";
		[Browsable(false), DefaultValue("")]
		public string LicenseKey
		{
			get { return m_LicenseKey; }
			set
			{
				if (NativeFunctions.ValidateLicenseKey(value))
					return;
				m_LicenseKey = (!NativeFunctions.CheckLicenseKey(value) ? "9dsjkhds7" : value);
			}
		}
#else
		protected override void OnHandleCreated(EventArgs e)
		{
			base.OnHandleCreated(e);
			RemindForm frm=new RemindForm();
			frm.ShowDialog();
			frm.Dispose();
		}
#endif
        #endregion
    }
}