using System;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
namespace DevComponents.DotNetBar.Controls
{
    /// 
    /// Represents the Check Box control with extended styles.
    /// 
    [ToolboxBitmap(typeof(CheckBoxX), "Controls.CheckBoxX.ico"), ToolboxItem(true), DefaultEvent("CheckedChanged"), System.Runtime.InteropServices.ComVisible(false), Designer("DevComponents.DotNetBar.Design.CheckBoxXDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
    public class CheckBoxX : BaseItemControl, ICommandSource
    {
        #region Private Variables
        private const string DefaultCheckValueUnchecked = "N";
        private const string DefaultCheckValueChecked = "Y";
        private const object DefaultCheckValueIndeterminate = null;
        private CheckBoxItem m_CheckBox = null;
        private object m_CheckValue = DefaultCheckValueUnchecked;
        private object m_CheckValueUnchecked = DefaultCheckValueUnchecked;
        private object m_CheckValueChecked = DefaultCheckValueChecked;
        private object m_CheckValueIndeterminate = DefaultCheckValueIndeterminate;
        private bool m_ConsiderEmptyStringAsNull = true;
        #endregion
        #region Events
        /// 
        /// Occurs before Checked property is changed and allows you to cancel the change.
        /// 
        public event CheckBoxXChangeEventHandler CheckedChanging;
        
        /// 
        /// Occurs after Checked property is changed with extended information.
        /// 
        public event CheckBoxXChangeEventHandler CheckedChangedEx;
        /// 
        /// Occurs after Checked property is changed. This event is provided for the Windows Forms data binding support. You can use CheckedChangedEx to get extended information about the changed.
        /// 
        public event EventHandler CheckedChanged;
        /// 
        /// Occurs after Checked property is changed. This event is provided for the Windows Forms data binding support. You can use CheckedChangedEx to get extended information about the changed.
        /// 
        public event EventHandler CheckValueChanged;
        #endregion
        #region Constructor, Dispose
        public CheckBoxX()
        {
            this.SetStyle(ControlStyles.Selectable, true);
            m_CheckBox = new CheckBoxItem();
            m_CheckBox.VerticalPadding = 0;
            m_CheckBox.Style = eDotNetBarStyle.Office2007;
            m_CheckBox.CheckedChanging += new CheckBoxChangeEventHandler(OnCheckedChanging);
            m_CheckBox.CheckedChanged += new CheckBoxChangeEventHandler(OnCheckedChanged);
            this.HostItem = m_CheckBox;
        }
        #endregion
        #region Internal Implementation
        /// 
        /// Gets or sets the size of the check or radio sign. Default value is 13x13. Minimum value is 6x6.
        /// 
        [Category("Appearance"), Description("Indicates size of the check or radio sign. Default value is 13x13.")]
        public Size CheckSignSize
        {
            get { return m_CheckBox.CheckSignSize; }
            set { m_CheckBox.CheckSignSize = value; this.RecalcLayout(); this.Invalidate(); }
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeCheckSignSize()
        {
            return m_CheckBox.ShouldSerializeCheckSignSize();
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetCheckSignSize()
        {
            this.CheckSignSize = new Size(13, 13);
        }
        /// 
        /// Gets or sets whether text-markup support is enabled for controls Text property. Default value is true.
        /// Set this property to false to display HTML or other markup in the control instead of it being parsed as text-markup.
        /// 
        [DefaultValue(true), Category("Appearance"), Description("Indicates whether text-markup support is enabled for controls Text property.")]
        public bool EnableMarkup
        {
            get { return m_CheckBox.EnableMarkup; }
            set
            {
                m_CheckBox.EnableMarkup = value;
            }
        }
        protected override MouseButtons MouseDownFocusButtons
        {
            get { return MouseButtons.Left | MouseButtons.Right | MouseButtons.Middle | MouseButtons.XButton1 | MouseButtons.XButton2; }
        }
        //protected override void OnMouseDown(MouseEventArgs e)
        //{
        //    if (!this.Focused)
        //        this.Select();
        //    base.OnMouseDown(e);
        //}
        //protected override void OnEnter(EventArgs e)
        //{
        //    if (this.CheckBoxStyle == eCheckBoxStyle.RadioButton && Control.MouseButtons == MouseButtons.None && WinApi.GetKeyState(9) < 0 && this.AutoCheck)
        //    {
        //        m_CheckBox.SetChecked(true, eEventSource.Keyboard);
        //    }
        //    base.OnEnter(e);
        //}
        /// 
        /// Invokes the CheckedChanged event.
        /// 
        private void OnCheckedChanged(object sender, CheckBoxChangeEventArgs e)
        {
            CheckBoxX previous = null;
            if (m_CheckBox.CheckBoxStyle == eCheckBoxStyle.RadioButton && m_CheckBox.Checked && this.Parent != null)
            {
                foreach (Control c in this.Parent.Controls)
                {
                    if (c == this)
                    {
                        //c.TabStop = true;
                        continue;
                    }
                    CheckBoxX b = c as CheckBoxX;
                    if (b != null && b.Checked && b.CheckBoxStyle == eCheckBoxStyle.RadioButton)
                    {
                        b.Checked = false;
                        //b.TabStop = false;
                        previous = b;
                    }
                }
            }
            if (this.Command != null)
                this.Command.Checked = this.Checked;
            CheckBoxXChangeEventArgs e1 = new CheckBoxXChangeEventArgs(previous, this, e.EventSource);
            if (CheckedChangedEx != null)
                CheckedChangedEx(this, e1);
            if (CheckedChanged != null)
                CheckedChanged(this, new EventArgs());
            if (GetCheckState(m_CheckValue) != this.CheckState)
                m_CheckValue = GetCheckValue(this.CheckState);
            if (CheckValueChanged != null)
                CheckValueChanged(this, new EventArgs());
            ExecuteCommand();
        }
        /// 
        /// Invokes CheckedChanging event.
        /// 
        private void OnCheckedChanging(object sender, CheckBoxChangeEventArgs e)
        {
            CheckBoxXChangeEventArgs e1 = new CheckBoxXChangeEventArgs(null, this, e.EventSource);
            if (m_CheckBox.CheckBoxStyle == eCheckBoxStyle.RadioButton && !m_CheckBox.Checked && this.Parent != null)
            {
                CheckBoxX b = null;
                foreach (Control c in this.Parent.Controls)
                {
                    if (c == this)
                        continue;
                    b = c as CheckBoxX;
                    if (b != null && b.Checked && b.CheckBoxStyle == eCheckBoxStyle.RadioButton)
                    {
                        break;
                    }
                }
                e1 = new CheckBoxXChangeEventArgs(b, this, e.EventSource);
            }
            if (CheckedChanging != null)
            {
                CheckedChanging(this, e1);
                e.Cancel = e1.Cancel;
            }
        }
        /// 
        /// Gets or sets the appearance style of the item. Default value is CheckBox. Item can also assume the style of radio-button.
        /// 
        [Browsable(true), DefaultValue(eCheckBoxStyle.CheckBox), Category("Appearance"), Description("Indicates appearance style of the item. Default value is CheckBox. Item can also assume the style of radio-button.")]
        public eCheckBoxStyle CheckBoxStyle
        {
            get { return m_CheckBox.CheckBoxStyle; }
            set
            {
                m_CheckBox.CheckBoxStyle = value;
            }
        }
        /// 
        /// Gets or sets the check box position relative to the text. Default value is Left.
        /// 
        [Browsable(true), DefaultValue(eCheckBoxPosition.Left), Category("Appearance"), Description("Indicates the check box position relative to the text.")]
        public eCheckBoxPosition CheckBoxPosition
        {
            get { return m_CheckBox.CheckBoxPosition; }
            set
            {
                m_CheckBox.CheckBoxPosition = value;
            }
        }
        /// 
        /// Gets or set a value indicating whether the button is in the checked state.
        /// 
        [Browsable(true), Bindable(true), DevCoBrowsable(true), Category("Appearance"), Description("Indicates whether item is checked or not."), DefaultValue(false)]
        public virtual bool Checked
        {
            get
            {
                return m_CheckBox.Checked;
            }
            set
            {
                m_CheckBox.Checked = value;
            }
        }
        /// 
        /// Gets or sets whether text assigned to the check box is visible. Default value is true.
        /// 
        [Browsable(true), DefaultValue(true), Category("Appearance"), Description("Indicates whether text assigned to the check box is visible.")]
        public bool TextVisible
        {
            get { return m_CheckBox.TextVisible; }
            set
            {
                m_CheckBox.TextVisible = value;
                this.RecalcLayout();
            }
        }
        /// 
        /// Gets or sets the text color. Default value is Color.Empty which indicates that default color is used.
        /// 
        [Browsable(true), Category("Appearance"), Description("Indicates text color.")]
        public Color TextColor
        {
            get { return m_CheckBox.TextColor; }
            set
            {
                m_CheckBox.TextColor = value;
            }
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeTextColor()
        {
            return !m_CheckBox.TextColor.IsEmpty;
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetTextColor()
        {
            this.TextColor = Color.Empty;
        }
        [Browsable(false)]
        public override Color ForeColor
        {
            get
            {
                return base.ForeColor;
            }
            set
            {
                base.ForeColor = value;
            }
        }
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space && this.Enabled && this.AutoCheck)
            {
                if (this.CheckBoxStyle == eCheckBoxStyle.CheckBox)
                    SetChecked(!this.Checked, eEventSource.Keyboard);
                else if (!this.Checked)
                    SetChecked(true, eEventSource.Keyboard);
            }
            base.OnKeyDown(e);
        }
        private void SetChecked(bool newValue, eEventSource source)
        {
            m_CheckBox.SetChecked(newValue, source);
        }
        private void SetChecked(CheckState newValue, eEventSource source)
        {
            m_CheckBox.SetChecked(newValue, source);
        }
        /// 
        /// Gets or sets the text associated with the control.
        /// 
        [Browsable(true), Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), Category("Appearance"), Description("Indicates text associated with this button.."), Localizable(true), DefaultValue("")]
        public override string Text
        {
            get { return base.Text; }
            set { base.Text = value; }
        }
#if FRAMEWORK20
        [Localizable(true), Browsable(false)]
        public new System.Windows.Forms.Padding Padding
        {
            get { return base.Padding; }
            set { base.Padding = value; }
        }
        public override Size GetPreferredSize(Size proposedSize)
        {
            if (!BarFunctions.IsHandleValid(this))
                return base.GetPreferredSize(proposedSize);
            if (this.Text.Length == 0)
                return base.GetPreferredSize(proposedSize);
            m_CheckBox.RecalcSize();
            Size s = m_CheckBox.Size;
            s.Width += 2;
            s.Height += 2;
            if (!this.TextVisible) s.Width += 2;
            m_CheckBox.Bounds = GetItemBounds();
            return s;
        }
        /// 
        /// Gets or sets a value indicating whether the control is automatically resized to display its entire contents. You can set MaximumSize.Width property to set the maximum width used by the control.
        /// 
        [Browsable(true), DefaultValue(false), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override bool AutoSize
        {
            get
            {
                return base.AutoSize;
            }
            set
            {
                if (this.AutoSize != value)
                {
                    base.AutoSize = value;
                    AdjustSize();
                }
            }
        }
        protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
        {
            if (this.AutoSize)
            {
                Size preferredSize = base.PreferredSize;
                width = preferredSize.Width;
                height = preferredSize.Height;
            }
            base.SetBoundsCore(x, y, width, height, specified);
        }
        private void AdjustSize()
        {
            if (this.AutoSize)
            {
                this.Size = base.PreferredSize;
            }
        }
        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);
            this.AdjustSize();
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            if (this.AutoSize)
                this.AdjustSize();
        }
#endif
        /// 
        /// Gets or sets a value indicating whether the CheckBox will allow three check states rather than two. If the ThreeState property is set to true
        /// CheckState property should be used instead of Checked property to set the extended state of the control.
        /// 
        [Browsable(true), Category("Behavior"), DefaultValue(false), Description("Indicates whether the CheckBox will allow three check states rather than two.")]
        public bool ThreeState
        {
            get { return m_CheckBox.ThreeState; }
            set { m_CheckBox.ThreeState = value; }
        }
        /// 
        /// Specifies the state of a control, such as a check box, that can be checked, unchecked, or set to an indeterminate state. 
        /// 
        [Browsable(true), Category("Behavior"), DefaultValue(CheckState.Unchecked), Description("Specifies the state of a control, such as a check box, that can be checked, unchecked, or set to an indeterminate state")]
        public CheckState CheckState
        {
            get { return m_CheckBox.CheckState; }
            set { m_CheckBox.CheckState = value; }
        }
        /// 
        /// Gets the underlying CheckBoxItem
        /// 
        internal CheckBoxItem CheckBoxItem
        {
            get { return (m_CheckBox); }
        }
        private bool _EnableMnemonicWithAltKeyOnly = false;
        /// 
        /// Gets or sets whether mnemonic character assigned to control is processed only if Alt key is pressed. Default value is false which indicate that Alt key is not required.
        /// 
        [DefaultValue(false), Category("Behavior"), Description("Indicates whether mnemonic character assigned to control is processed only if Alt key is pressed")]
        public bool EnableMnemonicWithAltKeyOnly
        {
            get { return _EnableMnemonicWithAltKeyOnly; }
            set
            {
                _EnableMnemonicWithAltKeyOnly = value;
            }
        }
        protected override bool ProcessMnemonic(char charCode)
        {
            if (AutoCheck && CanSelect && IsMnemonic(charCode, this.Text) && this.Enabled &&
                (!_EnableMnemonicWithAltKeyOnly || Control.ModifierKeys == Keys.Alt || this.Focused) && !m_CheckBox.IsUsingTextMarkup)
            {
                if (Focus())
                {
                    if (this.CheckBoxStyle == eCheckBoxStyle.CheckBox)
                        SetChecked(!this.Checked, eEventSource.Keyboard);
                    else if (!this.Checked)
                        SetChecked(true, eEventSource.Keyboard);
                    return true;
                }
            }
            return false;
        }
        #endregion
        #region Data-Binding Support
        /// 
        /// Gets or set whether the Checked values and the item appearance are automatically changed when the Check-Box is clicked. Default value is true.
        /// 
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether the Checked values and the item appearance are automatically changed when the Check-Box is clicked.")]
        public bool AutoCheck
        {
            get { return m_CheckBox.AutoCheck; }
            set
            {
                m_CheckBox.AutoCheck = value;
            }
        }
        /// 
        /// Gets or sets the object that represents the Checked state of control.
        /// 
        [DefaultValue("N"), Bindable(true), RefreshProperties(RefreshProperties.All), TypeConverter(typeof(StringConverter)), Description("Indicates object that represents the Checked state of control.")]
        public object CheckValue
        {
            get { return m_CheckValue; }
            set
            {
                m_CheckValue = value;
                OnCheckValueChanged();
            }
        }
        private void OnCheckValueChanged()
        {
            CheckState cs = GetCheckState(m_CheckValue);
            this.CheckState = cs;
        }
        private bool IsNull(object value)
        {
            return value == null || value is string && (string)value == string.Empty && m_ConsiderEmptyStringAsNull ||
                value == DBNull.Value;
        }
        private object GetCheckValue(CheckState cs)
        {
            if (cs == CheckState.Indeterminate)
                return m_CheckValueIndeterminate;
            if (cs == CheckState.Unchecked)
                return m_CheckValueUnchecked;
            return m_CheckValueChecked;
        }
        private CheckState GetCheckState(object value)
        {
            if (m_CheckValueIndeterminate == null && IsNull(value) || m_CheckValueIndeterminate!=null && m_CheckValueIndeterminate.Equals(value))
            {
                return CheckState.Indeterminate;
            }
            else if (m_CheckValueChecked == null && IsNull(value) || m_CheckValueChecked!=null && m_CheckValueChecked.Equals(value))
            {
                return CheckState.Checked;
            }
            else if (m_CheckValueUnchecked == null && IsNull(value) || m_CheckValueUnchecked!=null && m_CheckValueUnchecked.Equals(value))
            {
                return CheckState.Unchecked;
            }
            else
            {
                if (value is System.Data.SqlTypes.SqlBoolean)
                {
                    System.Data.SqlTypes.SqlBoolean sqlBool = (System.Data.SqlTypes.SqlBoolean)value;
                    if (sqlBool.IsTrue)
                        return CheckState.Checked;
                    else if (sqlBool.IsNull)
                        return CheckState.Indeterminate;
                    else
                        return CheckState.Unchecked;
                }
                else if (value is int? && this.ThreeState)
                {
                    if (value == null) return CheckState.Indeterminate;
                    if (((int?)value).Value == 0)
                        return CheckState.Unchecked;
                    return CheckState.Checked;
                }
                else if (value is int)
                {
                    if (this.ThreeState && (int)value == -1)
                        return CheckState.Indeterminate;
                    return ((int)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is long)
                {
                    if (this.ThreeState && (long)value == -1)
                        return CheckState.Indeterminate;
                    return ((long)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is short)
                {
                    if (this.ThreeState && (short)value == -1)
                        return CheckState.Indeterminate;
                    return ((short)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is float)
                {
                    if (this.ThreeState && (float)value == -1)
                        return CheckState.Indeterminate;
                    return ((float)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is double)
                {
                    if (this.ThreeState && (double)value == -1)
                        return CheckState.Indeterminate;
                    return ((double)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is byte)
                {
                    return ((byte)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is uint)
                {
                    return ((uint)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is ulong)
                {
                    return ((ulong)value) == 0 ? CheckState.Unchecked : CheckState.Checked;
                }
                else if (value is bool)
                {
                    return ((bool)value) == false ? CheckState.Unchecked : CheckState.Checked;
                }
                
                return CheckState.Indeterminate;
            }
        }
        /// 
        /// Gets or sets whether empty string is consider as null value during CheckValue value comparison. Default value is true.
        /// 
        [DefaultValue(true), Category("Behavior"), Browsable(true), Description("Indicates whether empty string is consider as null value during CheckValue value comparison.")]
        public bool ConsiderEmptyStringAsNull
        {
            get { return m_ConsiderEmptyStringAsNull; }
            set { m_ConsiderEmptyStringAsNull = value; }
        }
        /// 
        /// Gets or sets the value that represents the Indeterminate state of check box when CheckValue property is set to that value. Default value is null.
        /// 
        [Browsable(true), DefaultValue(null), Category("Behavior"), TypeConverter(typeof(StringConverter)), Description("Represents the Indeterminate state value of check box when CheckValue property is set to that value")]
        public object CheckValueIndeterminate
        {
            get { return m_CheckValueIndeterminate; }
            set { m_CheckValueIndeterminate = value; OnCheckValueChanged(); }
        }
        /// 
        /// Gets or sets the value that represents the Checked state of check box when CheckValue property is set to that value. Default value is null.
        /// 
        [Browsable(true), DefaultValue("Y"), Category("Behavior"), TypeConverter(typeof(StringConverter)), Description("Represents the Checked state value of check box when CheckValue property is set to that value")]
        public object CheckValueChecked
        {
            get { return m_CheckValueChecked; }
            set { m_CheckValueChecked = value; OnCheckValueChanged(); }
        }
        /// 
        /// Gets or sets the value that represents the Unchecked state of check box when CheckValue property is set to that value. Default value is null.
        /// 
        [Browsable(true), DefaultValue("N"), Category("Behavior"), TypeConverter(typeof(StringConverter)), Description("Represents the Unchecked state value of check box when CheckValue property is set to that value")]
        public object CheckValueUnchecked
        {
            get { return m_CheckValueUnchecked; }
            set { m_CheckValueUnchecked = value; OnCheckValueChanged(); }
        }
        /// 
        /// Gets or sets the custom image that is displayed instead default check box representation when check box is checked.
        /// 
        [DefaultValue(null), Category("CheckBox Images"), Description("Indicates custom image that is displayed instead default check box representation when check box is checked")]
        public Image CheckBoxImageChecked
        {
            get { return m_CheckBox.CheckBoxImageChecked; }
            set
            {
                m_CheckBox.CheckBoxImageChecked = value;
            }
        }
        /// 
        /// Gets or sets the custom image that is displayed instead default check box representation when check box is unchecked.
        /// 
        [DefaultValue(null), Category("CheckBox Images"), Description("Indicates custom image that is displayed instead default check box representation when check box is unchecked")]
        public Image CheckBoxImageUnChecked
        {
            get { return m_CheckBox.CheckBoxImageUnChecked; }
            set
            {
                m_CheckBox.CheckBoxImageUnChecked = value;
            }
        }
        /// 
        /// Gets or sets the custom image that is displayed instead default check box representation when check box is in indeterminate state.
        /// 
        [DefaultValue(null), Category("CheckBox Images"), Description("Indicates custom image that is displayed instead default check box representation when check box is in indeterminate state")]
        public Image CheckBoxImageIndeterminate
        {
            get { return m_CheckBox.CheckBoxImageIndeterminate; }
            set
            {
                m_CheckBox.CheckBoxImageIndeterminate = value;
            }
        }
        #endregion
        #region ICommandSource Members
        protected virtual void ExecuteCommand()
        {
            if (_Command == null) return;
            CommandManager.ExecuteCommand(this);
        }
        /// 
        /// Gets or sets the command assigned to the item. Default value is null.
        /// Note that if this property is set to null Enabled property will be set to false automatically to disable the item.
        /// 
        [DefaultValue(null), Category("Commands"), Description("Indicates the command assigned to the item.")]
        public Command Command
        {
            get { return (Command)((ICommandSource)this).Command; }
            set
            {
                ((ICommandSource)this).Command = value;
            }
        }
        private ICommand _Command = null;
        //[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        ICommand ICommandSource.Command
        {
            get
            {
                return _Command;
            }
            set
            {
                bool changed = false;
                if (_Command != value)
                    changed = true;
                if (_Command != null)
                    CommandManager.UnRegisterCommandSource(this, _Command);
                _Command = value;
                if (value != null)
                    CommandManager.RegisterCommand(this, value);
                if (changed)
                    OnCommandChanged();
            }
        }
        /// 
        /// Called when Command property value changes.
        /// 
        protected virtual void OnCommandChanged()
        {
            Command command = this.Command;
            if (command != null && command.Checked != this.Checked)
            {
                SetChecked(command.Checked, eEventSource.Code);
            }
        }
        private object _CommandParameter = null;
        /// 
        /// Gets or sets user defined data value that can be passed to the command when it is executed.
        /// 
        [Browsable(true), DefaultValue(null), Category("Commands"), Description("Indicates user defined data value that can be passed to the command when it is executed."), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter)), System.ComponentModel.Localizable(true)]
        public object CommandParameter
        {
            get
            {
                return _CommandParameter;
            }
            set
            {
                _CommandParameter = value;
            }
        }
        #endregion
    }
    /// 
    /// Delegate for OptionGroupChanging event.
    /// 
    public delegate void CheckBoxXChangeEventHandler(object sender, CheckBoxXChangeEventArgs e);
    #region CheckBoxXChangeEventArgs
    /// 
    /// Represents event arguments for OptionGroupChanging event.
    /// 
    public class CheckBoxXChangeEventArgs : EventArgs
    {
        /// 
        /// Set to true to cancel the checking on NewChecked button.
        /// 
        public bool Cancel = false;
        /// 
        /// Check-box that will become checked if operation is not cancelled.
        /// 
        public readonly CheckBoxX NewChecked;
        /// 
        /// Check-box that is currently checked and which will be unchecked if operation is not cancelled. This property will have only valid values for eCheckBoxStyle.RadioButton style CheckBoxItems.
        /// 
        public readonly CheckBoxX OldChecked;
        /// 
        /// Indicates the action that has caused the event.
        /// 
        public readonly eEventSource EventSource = eEventSource.Code;
        /// 
        /// Default constructor.
        /// 
        public CheckBoxXChangeEventArgs(CheckBoxX oldchecked, CheckBoxX newchecked, eEventSource eventSource)
        {
            NewChecked = newchecked;
            OldChecked = oldchecked;
            EventSource = eventSource;
        }
    }
    #endregion
}