#if FRAMEWORK20
using System;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using DevComponents.Editors;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Drawing.Design;
using System.Security.Permissions;
namespace DevComponents.DotNetBar.Controls
{
    /// 
    /// Represents single line text box control with the drop down button to display custom control on popup and additional custom buttons. 
    /// 
    [ToolboxBitmap(typeof(TextBoxDropDown), "Controls.TextBoxDropDown.ico"), ToolboxItem(true), DefaultProperty("Text"), DefaultBindingProperty("Text"), DefaultEvent("TextChanged"), Designer("DevComponents.DotNetBar.Design.TextBoxDropDownDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
    public class TextBoxDropDown : PopupItemControl, IInputButtonControl, ICommandSource
    {
        #region Private Variables
        private TextBoxX _TextBox = null;
        private ButtonItem _PopupItem = null;
        private static string _DropDownItemContainerName = "sysPopupItemContainer";
        private static string _DropDownControlContainerName = "sysPopupControlContainer";
        private Color _FocusHighlightColor = ColorScheme.GetColor(0xFFFF88);
        private bool _FocusHighlightEnabled = false;
        #endregion
        #region Events
        /// 
        /// Occurs when Clear button is clicked and allows you to cancel the default action performed by the button.
        /// 
        public event CancelEventHandler ButtonClearClick;
        /// 
        /// Occurs when Drop-Down button that shows popup is clicked and allows you to cancel showing of the popup.
        /// 
        public event CancelEventHandler ButtonDropDownClick;
        /// 
        /// Occurs when ButtonCustom control is clicked.
        /// 
        public event EventHandler ButtonCustomClick;
        /// 
        /// Occurs when ButtonCustom2 control is clicked.
        /// 
        public event EventHandler ButtonCustom2Click;
        /// 
        /// Occurs when the text alignment is changed.
        /// 
        [Description("Occurs when the text alignment is changed.")]
        public event EventHandler TextAlignChanged;
        /// 
        /// Occurs when the value of the Modified property has changed.
        /// 
        public event EventHandler ModifiedChanged;
        /// 
        /// Occurs before the popup is opened and it allows canceling of popup by setting CancelEventArgs.Cancel=true.
        /// 
        [Description("Occurs before the popup is opened and it allows canceling of popup by setting CancelEventArgs.Cancel=true.")]
        public event CancelEventHandler BeforePopupOpen;
        /// 
        /// Raises BeforeMultiColumnPopupOpen event.
        /// 
        /// Provides event arguments.
        protected virtual void OnBeforePopupOpen(CancelEventArgs e)
        {
            CancelEventHandler handler = BeforePopupOpen;
            if (handler != null)
                handler(this, e);
        }
        #endregion
        #region Constructor
        /// 
        /// Initializes a new instance of the TextBoxDropDown class.
        /// 
        public TextBoxDropDown()
        {
            this.SetStyle(ControlStyles.Selectable, false);
            _TextBox = new TextBoxX();
            base.BackColor = SystemColors.Window;
            InitControl();
        }
        private void InitControl()
        {
            _BackgroundStyle.SetColorScheme(this.ColorScheme);
            _BackgroundStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged);
            _ButtonCustom = new InputButtonSettings(this);
            _ButtonCustom2 = new InputButtonSettings(this);
            _ButtonClear = new InputButtonSettings(this);
            _ButtonDropDown = new InputButtonSettings(this);
            CreateButtonGroup();
            _TextBox.BorderStyle = BorderStyle.None;
            _TextBox.TextChanged += new EventHandler(TextBoxTextChanged);
            _TextBox.TextAlignChanged += new EventHandler(TextBoxTextAlignChanged);
            _TextBox.SizeChanged += new EventHandler(TextBoxSizeChanged);
            _TextBox.ModifiedChanged += new EventHandler(TextBoxModifiedChanged);
            _TextBox.KeyPress += new KeyPressEventHandler(TextBoxKeyPress);
            _TextBox.KeyDown += new KeyEventHandler(TextBoxKeyDown);
            this.Controls.Add(_TextBox);
        }
        #endregion
        #region Internal Implementation
        private bool _AutoSelectAll = false;
        /// 
        /// Indicates whether all text is auto-selected when control gets input focus. Default value is false.
        /// 
        [DefaultValue(false), Category("Behavior"), Description("Indicates whether all text is auto-selected when control gets input focus.")]
        public bool AutoSelectAll
        {
            get { return _AutoSelectAll; }
            set { _AutoSelectAll = value; }
        }
        protected override void OnBindingContextChanged(EventArgs e)
        {
            if (_DropDownControl != null) _DropDownControl.BindingContext = this.BindingContext;
            base.OnBindingContextChanged(e);
        }
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.F4)
            {
                if (_PopupItem.Expanded)
                    CloseDropDown();
                else
                    InvokeShowDropDown();
                return true;
            }
            else if (keyData == Keys.Escape && this.IsPopupOpen)
            {
                CloseDropDown();
                return true;
            }
            else if (_ButtonGroup.ProcessCmdKey(ref msg, keyData))
                return true;
            return base.ProcessCmdKey(ref msg, keyData);
        }
        void TextBoxKeyPress(object sender, KeyPressEventArgs e)
        {
            if (_InternalReadOnly) e.Handled = true;
        }
        void TextBoxKeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)
            {
                if (ButtonDropDown.Visible)
                {
                    InvokeShowDropDown();
                    e.Handled = true;
                }
            }
        }
        private void TextBoxModifiedChanged(object sender, EventArgs e)
        {
            OnModifiedChanged(e);
        }
        protected virtual void OnModifiedChanged(EventArgs e)
        {
            EventHandler handler = ModifiedChanged;
            if (handler != null)
            {
                handler(this, e);
            }
        }
        private void TextBoxSizeChanged(object sender, EventArgs e)
        {
            if (!_InternalSizeUpdate)
                UpdateLayout();
        }
        private void TextBoxTextChanged(object sender, EventArgs e)
        {
            base.Text = _TextBox.Text;
            ExecuteCommand();
        }
        private void TextBoxTextAlignChanged(object sender, EventArgs e)
        {
            OnTextAlignChanged(e);
        }
        /// 
        /// Raises the TextAlignChanged event.
        /// 
        protected virtual void OnTextAlignChanged(EventArgs e)
        {
            EventHandler eh = TextAlignChanged;
            if (eh != null)
                eh(this, e);
        }
        protected override void OnEnabledChanged(EventArgs e)
        {
            if (!this.Enabled)
                _TextBox.ResetBackColor();
            else if (_TextBox.BackColor != this.BackColor)
                _TextBox.BackColor = this.BackColor;
            base.OnEnabledChanged(e);
        }
        private Color _OldBackColor = Color.Empty;
        protected override void OnEnter(EventArgs e)
        {
            if (_FocusHighlightEnabled)
            {
                _OldBackColor = this.BackColor;
                this.BackColor = _FocusHighlightColor;
            }
            if (_AutoSelectAll)
                _TextBox.SelectAll();
            base.OnEnter(e);
        }
        protected override void OnLeave(EventArgs e)
        {
            if (_FocusHighlightEnabled && !_OldBackColor.IsEmpty)
            {
                this.BackColor = _OldBackColor;
                if (_OldBackColor == SystemColors.Window)
                    _TextBox.ResetBackColor();
                _OldBackColor = Color.Empty;
            }
            base.OnLeave(e);
        }
        protected override bool QueryPopupCloseMouseDown()
        {
            Point p = this.PointToClient(MousePosition);
            if(this.ClientRectangle.Contains(p))
                return false;
            return base.QueryPopupCloseMouseDown();
        }
        /// 
        /// Gets or sets whether FocusHighlightColor is used as background color to highlight text box when it has input focus. Default value is false.
        /// 
        [DefaultValue(false), Browsable(true), Category("Appearance"), Description("Indicates whether FocusHighlightColor is used as background color to highlight text box when it has input focus.")]
        public bool FocusHighlightEnabled
        {
            get { return _FocusHighlightEnabled; }
            set
            {
                if (_FocusHighlightEnabled != value)
                {
                    _FocusHighlightEnabled = value;
                    //_TextBox.FocusHighlightEnabled = value;
                    if (this.Focused)
                        this.Invalidate(true);
                }
            }
        }
        /// 
        /// Gets or sets the color used as background color to highlight text box when it has input focus and focus highlight is enabled.
        /// 
        [Browsable(true), Category("Appearance"), Description("Indicates color used as background color to highlight text box when it has input focus and focus highlight is enabled.")]
        public Color FocusHighlightColor
        {
            get { return _FocusHighlightColor; }
            set
            {
                if (_FocusHighlightColor != value)
                {
                    _FocusHighlightColor = value;
                    _TextBox.FocusHighlightColor = value;
                    if (this.Focused)
                        this.Invalidate(true);
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeFocusHighlightColor()
        {
            return !_FocusHighlightColor.Equals(ColorScheme.GetColor(0xFFFF88));
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetFocusHighlightColor()
        {
            FocusHighlightColor = ColorScheme.GetColor(0xFFFF88);
        }
        private ElementStyle _BackgroundStyle = new ElementStyle();
        /// 
        /// Specifies the background style of the control.
        /// 
        [Category("Style"), Description("Gets or sets control background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ElementStyle BackgroundStyle
        {
            get { return _BackgroundStyle; }
        }
        /// 
        /// Resets style to default value. Used by windows forms designer.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetBackgroundStyle()
        {
            _BackgroundStyle.StyleChanged -= new EventHandler(this.VisualPropertyChanged);
            _BackgroundStyle = new ElementStyle();
            _BackgroundStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged);
            this.Invalidate();
        }
        private void VisualPropertyChanged(object sender, EventArgs e)
        {
            OnVisualPropertyChanged();
        }
        protected virtual void OnVisualPropertyChanged()
        {
            _ButtonGroup.InvalidateArrange();
            this.Invalidate();
        }
        protected override void Dispose(bool disposing)
        {
            if (_BackgroundStyle != null) _BackgroundStyle.StyleChanged -= new EventHandler(VisualPropertyChanged);
            base.Dispose(disposing);
        }
        private InputButtonSettings _ButtonDropDown = null;
        /// 
        /// Gets the object that describes the settings for the button that shows drop-down when clicked.
        /// 
        [Category("Buttons"), Description("Describes the settings for the button that shows drop-down when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public InputButtonSettings ButtonDropDown
        {
            get
            {
                return _ButtonDropDown;
            }
        }
        private InputButtonSettings _ButtonClear = null;
        /// 
        /// Gets the object that describes the settings for the button that clears the content of the control when clicked.
        /// 
        [Category("Buttons"), Description("Describes the settings for the button that clears the content of the control when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public InputButtonSettings ButtonClear
        {
            get
            {
                return _ButtonClear;
            }
        }
        private InputButtonSettings _ButtonCustom = null;
        /// 
        /// Gets the object that describes the settings for the custom button that can execute an custom action of your choosing when clicked.
        /// 
        [Category("Buttons"), Description("Describes the settings for the custom button that can execute an custom action of your choosing when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public InputButtonSettings ButtonCustom
        {
            get
            {
                return _ButtonCustom;
            }
        }
        private InputButtonSettings _ButtonCustom2 = null;
        /// 
        /// Gets the object that describes the settings for the custom button that can execute an custom action of your choosing when clicked.
        /// 
        [Category("Buttons"), Description("Describes the settings for the custom button that can execute an custom action of your choosing when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public InputButtonSettings ButtonCustom2
        {
            get
            {
                return _ButtonCustom2;
            }
        }
        void IInputButtonControl.InputButtonSettingsChanged(InputButtonSettings inputButtonSettings)
        {
            OnInputButtonSettingsChanged(inputButtonSettings);
        }
        protected virtual void OnInputButtonSettingsChanged(InputButtonSettings inputButtonSettings)
        {
            UpdateButtons();
        }
        private VisualGroup _ButtonGroup = null;
        private void UpdateButtons()
        {
            RecreateButtons();
            _ButtonGroup.InvalidateArrange();
            this.Invalidate();
        }
        internal VisualGroup ButtonGroup
        {
            get { return (_ButtonGroup); }
        }
        protected virtual void RecreateButtons()
        {
            VisualItem[] buttons = CreateOrderedButtonList();
            // Remove all system buttons that are already in the list
            VisualGroup group = _ButtonGroup;
            VisualItem[] items = new VisualItem[group.Items.Count];
            group.Items.CopyTo(items);
            foreach (VisualItem item in items)
            {
                if (item.ItemType == eSystemItemType.SystemButton)
                {
                    group.Items.Remove(item);
                    if (item == _ButtonCustom.ItemReference)
                        item.MouseUp -= new MouseEventHandler(CustomButtonMouseUp);
                    else if (item == _ButtonCustom2.ItemReference)
                        item.MouseUp -= new MouseEventHandler(CustomButton2MouseUp);
                }
            }
            // Add new buttons to the list
            group.Items.AddRange(buttons);
        }
        private void CustomButtonMouseUp(object sender, MouseEventArgs e)
        {
            if (_ButtonCustom.ItemReference.RenderBounds.Contains(e.X, e.Y))
                OnButtonCustomClick(e);
        }
        protected virtual void OnButtonCustomClick(EventArgs e)
        {
            if (ButtonCustomClick != null)
                ButtonCustomClick(this, e);
        }
        private void CustomButton2MouseUp(object sender, MouseEventArgs e)
        {
            if (_ButtonCustom2.ItemReference.RenderBounds.Contains(e.X, e.Y))
                OnButtonCustom2Click(e);
        }
        protected virtual void OnButtonCustom2Click(EventArgs e)
        {
            if (ButtonCustom2Click != null)
                ButtonCustom2Click(this, e);
        }
        private VisualItem[] CreateOrderedButtonList()
        {
            SortedList list = CreateSortedButtonList();
            VisualItem[] items = new VisualItem[list.Count];
            list.Values.CopyTo(items, 0);
            return items;
        }
        private void CustomButtonClick(object sender, EventArgs e)
        {
            OnButtonCustomClick(e);
        }
        private void CustomButton2Click(object sender, EventArgs e)
        {
            OnButtonCustom2Click(e);
        }
        private void ClearButtonClick(object sender, EventArgs e)
        {
            ClearButtonClick();
        }
        protected virtual SortedList CreateSortedButtonList()
        {
            SortedList list = new SortedList(4);
            if (_ButtonCustom.Visible)
            {
                VisualItem button = CreateButton(_ButtonCustom);
                if (_ButtonCustom.ItemReference != null)
                {
                    _ButtonCustom.ItemReference.MouseUp -= CustomButtonMouseUp;
                    _ButtonCustom.ItemReference.Click -= CustomButtonClick;
                }
                _ButtonCustom.ItemReference = button;
                button.Click += CustomButtonClick;
                button.MouseUp += CustomButtonMouseUp;
                button.Enabled = _ButtonCustom.Enabled;
                list.Add(_ButtonCustom, button);
            }
            if (_ButtonCustom2.Visible)
            {
                VisualItem button = CreateButton(_ButtonCustom2);
                if (_ButtonCustom.ItemReference != null)
                {
                    _ButtonCustom.ItemReference.MouseUp -= CustomButton2MouseUp;
                    _ButtonCustom.ItemReference.Click -= CustomButton2Click;
                }
                _ButtonCustom2.ItemReference = button;
                button.Click += CustomButton2Click;
                button.MouseUp += CustomButton2MouseUp;
                button.Enabled = _ButtonCustom2.Enabled;
                list.Add(_ButtonCustom2, button);
            }
            if (_ButtonClear.Visible)
            {
                VisualItem button = CreateButton(_ButtonClear);
                if (_ButtonClear.ItemReference != null)
                {
                    _ButtonClear.ItemReference.MouseUp -= ClearButtonMouseUp;
                    _ButtonClear.ItemReference.Click -= ClearButtonClick;
                }
                _ButtonClear.ItemReference = button;
                button.MouseUp += ClearButtonMouseUp;
                button.Click += ClearButtonClick;
                list.Add(_ButtonClear, button);
            }
            if (_ButtonDropDown.Visible)
            {
                VisualItem button = CreateButton(_ButtonDropDown);
                if (_ButtonDropDown.ItemReference != null)
                {
                    _ButtonDropDown.ItemReference.MouseDown -= DropDownButtonMouseDown;
                    _ButtonDropDown.ItemReference.Click -= DropDownButtonClick;
                }
                _ButtonDropDown.ItemReference = button;
                button.MouseDown += DropDownButtonMouseDown;
                button.Click += DropDownButtonClick;
                list.Add(_ButtonDropDown, button);
            }
            return list;
        }
        private void DropDownButtonClick(object sender, EventArgs e)
        {
            if (e is KeyEventArgs) // Only if invoked through keyboard shortcut
            {
                if (_PopupItem.Expanded)
                    CloseDropDown();
                else
                    InvokeShowDropDown();
            }
        }
        protected virtual VisualItem CreateButton(InputButtonSettings buttonSettings)
        {
            VisualItem item = null;
            if (buttonSettings == _ButtonDropDown)
            {
                item = new VisualDropDownButton();
                ApplyButtonSettings(buttonSettings, item as VisualButton);
            }
            else
            {
                item = new VisualCustomButton();
                ApplyButtonSettings(buttonSettings, item as VisualButton);
            }
            VisualButton button = item as VisualButton;
            button.ClickAutoRepeat = false;
            if (buttonSettings == _ButtonClear)
            {
                if (buttonSettings.Image == null && string.IsNullOrEmpty(buttonSettings.Text))
                {
                    //if (Dpi.Factor.Width > 1)
                        button.Symbol = "\uf00d";
                    //else
                    //    button.Image = DevComponents.DotNetBar.BarFunctions.LoadBitmap("SystemImages.DateReset.png");
                }
            }
            return item;
        }
        protected virtual void ApplyButtonSettings(InputButtonSettings buttonSettings, VisualButton button)
        {
            button.Text = buttonSettings.Text;
            button.Image = buttonSettings.Image;
            button.ItemType = eSystemItemType.SystemButton;
            button.Enabled = buttonSettings.Enabled;
            button.Shortcut = buttonSettings.Shortcut;
            button.Tooltip = buttonSettings.Tooltip;
            button.Symbol = buttonSettings.Symbol;
            button.SymbolSet = buttonSettings.SymbolSet;
            button.SymbolColor = buttonSettings.SymbolColor;
        }
        private void CreateButtonGroup()
        {
            VisualGroup group = new VisualGroup();
            group.HorizontalItemSpacing = 0;
            group.ArrangeInvalid += new EventHandler(ButtonGroupArrangeInvalid);
            group.RenderInvalid += new EventHandler(ButtonGroupRenderInvalid);
            group.ResetMouseHover += ButtonGroupResetMouseHover;
            _ButtonGroup = group;
        }
        private void ButtonGroupRenderInvalid(object sender, EventArgs e)
        {
            Invalidate();
        }
        private void ButtonGroupArrangeInvalid(object sender, EventArgs e)
        {
            Invalidate();
        }
        private void ButtonGroupResetMouseHover(object sender, EventArgs e)
        {
            DevComponents.AdvTree.Interop.WinApi.ResetHover(this);
        }
        private bool _MouseOver = false;
        private PaintInfo CreatePaintInfo(Graphics g)
        {
            PaintInfo p = new PaintInfo();
            p.Graphics = g;
            p.DefaultFont = this.Font;
            p.ForeColor = this.ForeColor;
            p.RenderOffset = new System.Drawing.Point();
            Size s = this.Size;
            bool disposeStyle = false;
            ElementStyle style = GetBackgroundStyle(out disposeStyle);
            int styleSpace = (ElementStyleLayout.TopWhiteSpace(style, eSpacePart.Border) + ElementStyleLayout.BottomWhiteSpace(style, eSpacePart.Border));
            if (styleSpace > 0) styleSpace += 2;
            s.Height -= styleSpace;
            styleSpace = (ElementStyleLayout.LeftWhiteSpace(style, eSpacePart.Border) + ElementStyleLayout.RightWhiteSpace(style, eSpacePart.Border));
            if (styleSpace > 0) styleSpace += 2;
            s.Width -= styleSpace;
            p.AvailableSize = s;
            p.ParentEnabled = this.Enabled;
            p.MouseOver = _MouseOver || this.Focused;
            if (disposeStyle) style.Dispose();
            return p;
        }
        private ElementStyle GetBackgroundStyle(out bool disposeStyle)
        {
            disposeStyle = false;
            _BackgroundStyle.SetColorScheme(this.GetColorScheme());
            return ElementStyleDisplay.GetElementStyle(_BackgroundStyle, out disposeStyle);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            Rectangle clientRect = this.ClientRectangle;
            bool enabled = this.Enabled;
            if (!this.Enabled)
                e.Graphics.FillRectangle(SystemBrushes.Control, clientRect);
            else
            {
                using (SolidBrush brush = new SolidBrush(this.BackColor))
                    e.Graphics.FillRectangle(brush, clientRect);
            }
            bool disposeStyle = false;
            ElementStyle style = GetBackgroundStyle(out disposeStyle);
            if (style.Custom)
            {
                SmoothingMode sm = g.SmoothingMode;
                if (this.AntiAlias)
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                ElementStyleDisplayInfo displayInfo = new ElementStyleDisplayInfo(style, g, clientRect);
                if (!enabled)
                {
                    ElementStyleDisplay.PaintBorder(displayInfo);
                }
                else
                    ElementStyleDisplay.Paint(displayInfo);
                if (this.AntiAlias)
                    g.SmoothingMode = sm;
            }
            PaintButtons(g);
            if (disposeStyle) style.Dispose();
        }
        public override Color BackColor
        {
            get
            {
                return base.BackColor;
            }
            set
            {
                base.BackColor = value;
            }
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeBackColor()
        {
            return this.BackColor != SystemColors.Window;
        }
        protected override void OnBackColorChanged(EventArgs e)
        {
            base.OnBackColorChanged(e);
            if (_TextBox.Parent != null)
                _TextBox.BackColor = this.BackColor;
        }
        private void PaintButtons(Graphics g)
        {
            PaintInfo p = CreatePaintInfo(g);
            if (!_ButtonGroup.IsLayoutValid)
            {
                UpdateLayout(p);
            }
            bool disposeStyle = false;
            ElementStyle style = GetBackgroundStyle(out disposeStyle);
            _ButtonGroup.RenderBounds = GetButtonsRenderBounds(style);
            _ButtonGroup.ProcessPaint(p);
            if (disposeStyle) style.Dispose();
        }
        private Rectangle GetButtonsRenderBounds(ElementStyle style)
        {
            int y = ElementStyleLayout.TopWhiteSpace(style, eSpacePart.Border);
            if (y > 0) y += 1;
            if (this.RightToLeft == RightToLeft.Yes)
            {
                return new Rectangle((ElementStyleLayout.LeftWhiteSpace(style, eSpacePart.Border) + 1), y,
                _ButtonGroup.Size.Width, _ButtonGroup.Size.Height);
            }
            return new Rectangle(this.Width - (ElementStyleLayout.RightWhiteSpace(style, eSpacePart.Border) + 1) - _ButtonGroup.Size.Width, y,
                _ButtonGroup.Size.Width, _ButtonGroup.Size.Height);
        }
        protected override void OnResize(EventArgs e)
        {
            if (BarFunctions.IsHandleValid(this))
            {
                _ButtonGroup.InvalidateArrange();
                UpdateLayout();
                this.Invalidate();
            }
            base.OnResize(e);
        }
        protected override void OnGotFocus(EventArgs e)
        {
            _TextBox.Focus();
            base.OnGotFocus(e);
        }
        protected override void OnRightToLeftChanged(EventArgs e)
        {
            _ButtonGroup.InvalidateArrange();
            UpdateLayout();
            this.Invalidate();
            base.OnRightToLeftChanged(e);
        }
        protected override void OnFontChanged(EventArgs e)
        {
            _ButtonGroup.InvalidateArrange();
            UpdateLayout();
            this.Invalidate();
            base.OnFontChanged(e);
        }
        protected override void OnForeColorChanged(EventArgs e)
        {
            _TextBox.ForeColor = this.ForeColor;
            base.OnForeColorChanged(e);
        }
        private void UpdateLayout()
        {
            if (!BarFunctions.IsHandleValid(this))
                return;
            using (Graphics g = BarFunctions.CreateGraphics(this))
                UpdateLayout(CreatePaintInfo(g));
        }
        private bool _InternalSizeUpdate = false;
        private void UpdateLayout(PaintInfo p)
        {
            if (_InternalSizeUpdate) return;
            _InternalSizeUpdate = true;
            try
            {
                if (!_ButtonGroup.IsLayoutValid)
                {
                    _ButtonGroup.PerformLayout(p);
                }
                bool disposeStyle = false;
                ElementStyle style = GetBackgroundStyle(out disposeStyle);
                Rectangle textBoxControlRect = ElementStyleLayout.GetInnerRect(style, this.ClientRectangle);
                if (RenderButtons)
                {
                    Rectangle buttonsRect = GetButtonsRenderBounds(style);
                    if (this.RightToLeft == RightToLeft.Yes)
                    {
                        textBoxControlRect.X += buttonsRect.Right;
                        textBoxControlRect.Width -= buttonsRect.Right;
                    }
                    else
                    {
                        textBoxControlRect.Width -= (textBoxControlRect.Right - buttonsRect.X);
                    }
                }
                if (_TextBox.Multiline == false && (_TextBox.PreferredHeight < textBoxControlRect.Height))
                {
                    textBoxControlRect.Y += (textBoxControlRect.Height - _TextBox.PreferredHeight) / 2;
                }
                _TextBox.Bounds = textBoxControlRect;
                if (disposeStyle) style.Dispose();
            }
            finally
            {
                _InternalSizeUpdate = false;
            }
        }
        private Control _PreviousDropDownControlParent = null;
        private void DropDownButtonMouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left || _CloseTime != DateTime.MinValue && DateTime.Now.Subtract(_CloseTime).TotalMilliseconds < 250)
            {
                _CloseTime = DateTime.MinValue;
                return;
            }
            InvokeShowDropDown();
            if ((Control.MouseButtons & MouseButtons.Left) == 0)
                _ButtonGroup.ProcessMouseUp(e);
        }
        private void InvokeShowDropDown()
        {
            CancelEventArgs cancelArgs = new CancelEventArgs();
            OnButtonDropDownClick(cancelArgs);
            if (cancelArgs.Cancel) return;
            if (IsPopupOpen)
                CloseDropDown();
            else
               ShowDropDown();
        }
        /// 
        /// Gets or sets a value indicating whether the drop-down is open.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public bool IsPopupOpen
        {
            get
            {
                return _PopupItem.Expanded;
            }
            set
            {
                if (value != _PopupItem.Expanded)
                {
                    if (value)
                        ShowDropDown();
                    else
                        CloseDropDown();
                }
            }
        }
        private bool _ShowingPopup = false;
        /// 
        /// Shows drop-down popup. Note that popup will be shown only if there is a DropDownControl assigned or DropDownItems collection has at least one item.
        /// 
        public void ShowDropDown()
        {
            if (_DropDownControl == null && _PopupItem.SubItems.Count == 0 || _ShowingPopup || _PopupItem.Expanded)
                return;
            CancelEventArgs ce = new CancelEventArgs();
            OnBeforePopupOpen(ce);
            if (ce.Cancel) return;
            _ShowingPopup = true;
            try
            {
                ControlContainerItem cc = null;
                ItemContainer ic = null;
                if (_DropDownControl != null)
                {
                    ic = new ItemContainer();
                    ic.Name = _DropDownItemContainerName;
                    cc = new ControlContainerItem(_DropDownControlContainerName);
                    ic.SubItems.Add(cc);
                    _PopupItem.SubItems.Insert(0, ic);
                }
                if (_PopupItem.SubItems.Count == 0)
                {
                    if (ic != null)
                        _PopupItem.SubItems.Remove(ic);
                    return;
                }
                if (_DropDownControl != null)
                {
                    _PreviousDropDownControlParent = _DropDownControl.Parent;
                    cc.Control = _DropDownControl;
                    if (!_DropDownControl.IsHandleCreated)
                    {
                        IntPtr handle = _DropDownControl.Handle; // Forces creation of the control so its size etc. can be accessed reliably
                    }
                }
                _PopupItem.SetDisplayRectangle(this.ClientRectangle);
                if (this.RightToLeft == RightToLeft.No)
                {
                    Point pl = new Point(this.Width - _PopupItem.PopupSize.Width, this.Height);
                    ScreenInformation screen = BarFunctions.ScreenFromControl(this);
                    Point ps = PointToScreen(pl);
                    if (screen != null && screen.WorkingArea.X > ps.X)
                    {
                        pl.X = 0;
                    }
                    _PopupItem.PopupLocation = pl;
                }
                _PopupItem.Expanded = !_PopupItem.Expanded;
            }
            finally
            {
                _ShowingPopup = false;
            }
            if (_DropDownControl != null && _AutoFocusDropDownControl && _DropDownControl.CanFocus)
                BarUtilities.InvokeDelayed(new MethodInvoker(delegate { _DropDownControl.Focus(); }));
        }
        /// 
        /// Closes the drop-down popup if it is open.
        /// 
        public void CloseDropDown()
        {
            if (_PopupItem.Expanded) _PopupItem.Expanded = false;
        }
        private DateTime _CloseTime = DateTime.MinValue;
        private void DropDownPopupClose(object sender, EventArgs e)
        {
            _CloseTime = DateTime.Now;
            ItemContainer ic = null;
            if (_PopupItem.SubItems.Contains(_DropDownItemContainerName))
                ic = _PopupItem.SubItems[_DropDownItemContainerName] as ItemContainer;
            if (ic != null)
            {
                ControlContainerItem cc = ic.SubItems[_DropDownControlContainerName] as ControlContainerItem;
                if (cc != null)
                {
                    cc.Control = null;
                    ic.SubItems.Remove(cc);
                    if (_DropDownControl != null)
                    {
                        _DropDownControl.Parent = _PreviousDropDownControlParent;
                        _PreviousDropDownControlParent = null;
                    }
                }
                _PopupItem.SubItems.Remove(ic);
                ic.Dispose();
            }
        }
        private bool _AutoFocusDropDownControl = false;
        /// 
        /// Indicates whether DropDownControl is automatically focused when popup is open.
        /// 
        [DefaultValue(false), Category("Behavior"), Description("Indicates whether DropDownControl is automatically focused when popup is open.")]
        public bool AutoFocusDropDownControl
        {
            get { return _AutoFocusDropDownControl; }
            set
            {
                _AutoFocusDropDownControl = value;
            }
        }
        
        private void ClearButtonClick()
        {
            CancelEventArgs cancelArgs = new CancelEventArgs();
            OnButtonClearClick(cancelArgs);
            if (cancelArgs.Cancel) return;
            _TextBox.Text = "";
        }
        private void ClearButtonMouseUp(object sender, EventArgs e)
        {
            ClearButtonClick();
        }
        /// 
        /// Raises the ButtonClearClick event.
        /// 
        /// 
        protected virtual void OnButtonClearClick(CancelEventArgs e)
        {
            if (ButtonClearClick != null)
                ButtonClearClick(this, e);
        }
        /// 
        /// Raises the ButtonDropDownClick event.
        /// 
        /// 
        protected virtual void OnButtonDropDownClick(CancelEventArgs e)
        {
            if (ButtonDropDownClick != null)
                ButtonDropDownClick(this, e);
        }
        private Control _DropDownControl = null;
        /// 
        /// Gets or sets the reference of the control that will be displayed on popup that is shown when drop-down button is clicked.
        /// 
        [DefaultValue(null), Description("Indicates reference of the control that will be displayed on popup that is shown when drop-down button is clicked.")]
        public Control DropDownControl
        {
            get { return _DropDownControl; }
            set
            {
                if (value == this) return;
                _DropDownControl = value;
                OnDropDownControlChanged();
            }
        }
        /// 
        /// Called when DropDownControl property has changed.
        /// 
        protected virtual void OnDropDownControlChanged()
        {
            if (_DropDownControl != null)
            {
                _DropDownControl.BindingContext = this.BindingContext;
                if (!this.DesignMode)
                    _DropDownControl.Visible = false;
            }
        }
        protected override PopupItem CreatePopupItem()
        {
            ButtonItem button = new ButtonItem("sysPopupProvider");
            button.PopupFinalized += new EventHandler(DropDownPopupClose);
            _PopupItem = button;
            return button;
        }
        /// 
        /// Gets the collection of BaseItem derived items displayed on popup menu.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public SubItemsCollection DropDownItems
        {
            get { return _PopupItem.SubItems; }
        }
        protected override void RecalcSize()
        {
        }
        public override void PerformClick()
        {
        }
        private bool RenderButtons
        {
            get
            {
                return _ButtonCustom != null && _ButtonCustom.Visible || _ButtonCustom2 != null && _ButtonCustom2.Visible ||
                    _ButtonDropDown != null && _ButtonDropDown.Visible || _ButtonClear != null && _ButtonClear.Visible;
            }
        }
        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (RenderButtons)
            {
                _ButtonGroup.ProcessMouseMove(e);
            }
            base.OnMouseMove(e);
        }
        protected override void OnMouseLeave(EventArgs e)
        {
            if (RenderButtons)
            {
                _ButtonGroup.ProcessMouseLeave();
            }
            base.OnMouseLeave(e);
        }
        protected override void OnMouseHover(EventArgs e)
        {
            if (RenderButtons)
            {
                _ButtonGroup.ProcessMouseHover(e);
            }
            base.OnMouseHover(e);
        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (RenderButtons)
                _ButtonGroup.ProcessMouseDown(e);
            base.OnMouseDown(e);
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            if (RenderButtons)
                _ButtonGroup.ProcessMouseUp(e);
            base.OnMouseUp(e);
        }
        internal void ProcessMouseUpOnGroup()
        {
            if (RenderButtons)
                _ButtonGroup.ProcessMouseUp(new MouseEventArgs(MouseButtons.Left, 0, -10, -10, 0));
            this.Invalidate();
        }
        /// 
        /// Gets the reference to internal TextBox control. Use it to get access to the text box events and properties.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public TextBoxX TextBox
        {
            get
            {
                return _TextBox;
            }
        }
        private bool _InternalReadOnly = false;
        internal bool InternalReadOnly
        {
            get { return _InternalReadOnly; }
            set
            {
                _InternalReadOnly = value;
            }
        }
        /// 
        /// Gets or sets whether watermark text is displayed when control is empty. Default value is true.
        /// 
        [DefaultValue(true), Description("Indicates whether watermark text is displayed when control is empty.")]
        public virtual bool WatermarkEnabled
        {
            get { return _TextBox.WatermarkEnabled; }
            set { _TextBox.WatermarkEnabled = value; this.Invalidate(true); }
        }
        /// 
        /// Gets or sets the watermark (tip) text displayed inside of the control when Text is not set and control does not have input focus. This property supports text-markup.
        /// 
        [Browsable(true), DefaultValue(""), Localizable(true), Category("Appearance"), Description("Indicates watermark text displayed inside of the control when Text is not set and control does not have input focus."), Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))]
        public string WatermarkText
        {
            get { return _TextBox.WatermarkText; }
            set
            {
                if (value == null) value = "";
                _TextBox.WatermarkText = value;
                this.Invalidate(true);
            }
        }
        /// 
        /// Gets or sets the watermark font.
        /// 
        [Browsable(true), Category("Appearance"), Description("Indicates watermark font."), DefaultValue(null)]
        public Font WatermarkFont
        {
            get { return _TextBox.WatermarkFont; }
            set { _TextBox.WatermarkFont = value; this.Invalidate(true); }
        }
        /// 
        /// Gets or sets the watermark text color.
        /// 
        [Browsable(true), Category("Appearance"), Description("Indicates watermark text color.")]
        public Color WatermarkColor
        {
            get { return _TextBox.WatermarkColor; }
            set { _TextBox.WatermarkColor = value; this.Invalidate(); }
        }
        /// 
        /// Indicates whether property should be serialized by Windows Forms designer.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeWatermarkColor()
        {
            return _TextBox.WatermarkColor != SystemColors.GrayText;
        }
        /// 
        /// Resets the property to default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetWatermarkColor()
        {
            this.WatermarkColor = SystemColors.GrayText;
        }
        /// 
        /// Gets or sets the watermark hiding behaviour. Default value indicates that watermark is hidden when control receives input focus.
        /// 
        [DefaultValue(eWatermarkBehavior.HideOnFocus), Category("Behavior"), Description("Indicates watermark hiding behaviour.")]
        public eWatermarkBehavior WatermarkBehavior
        {
            get { return _TextBox.WatermarkBehavior; }
            set { _TextBox.WatermarkBehavior = value; this.Invalidate(true); }
        }
        /// 
        /// Gets or sets the watermark image displayed inside of the control when Text is not set and control does not have input focus.
        /// 
        [DefaultValue(null), Category("Appearance"), Description("Indicates watermark image displayed inside of the control when Text is not set and control does not have input focus.")]
        public Image WatermarkImage
        {
            get { return _TextBox.WatermarkImage; }
            set { _TextBox.WatermarkImage = value; }
        }
        /// 
        /// Gets or sets the watermark image alignment.
        /// 
        [DefaultValue(ContentAlignment.MiddleLeft), Category("Appearance"), Description("Indicates watermark image alignment.")]
        public ContentAlignment WatermarkImageAlignment
        {
            get { return _TextBox.WatermarkImageAlignment; }
            set { _TextBox.WatermarkImageAlignment = 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()
        {
        }
        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
        #region TextBox Property Forwarding
        /// 
        /// Gets or sets the text as it is currently displayed to the user. 
        /// 
        [Category("Appearance"), DefaultValue("Indicates text as it is currently displayed to the user"), Bindable(true), RefreshProperties(RefreshProperties.Repaint), Localizable(true)]
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                _TextBox.Text = value;
            }
        }
        /// 
        /// Returns a string that represents the current text in text box. This method overrides ToString.
        /// 
        /// A String that contains information about the current TextBox. The string includes the type, a simplified view of the input string, and the formatted input string.
        public override string ToString()
        {
            return _TextBox.ToString();
        }
        /// 
        /// Gets the preferred height for a text box. 
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced)]
        public int PreferredHeight
        {
            get
            {
                int height = _TextBox.PreferredHeight;
                bool disposeStyle = false;
                ElementStyle style = GetBackgroundStyle(out disposeStyle);
                height += ElementStyleLayout.VerticalStyleWhiteSpace(style);
                if (disposeStyle)
                {
                    style.Dispose();
                }
                return height;
            }
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            UpdateLayout(); // Fixes an issue where button if visible is not showing under certain use cases
            base.OnHandleCreated(e);
        }
        public override Size GetPreferredSize(Size proposedSize)
        {
            Size ps = _TextBox.GetPreferredSize(proposedSize);
            ps.Height = PreferredHeight;
            return ps;
        }
        /// 
        /// Gets or sets a custom StringCollection to use when the AutoCompleteSource property is set to CustomSource.
        /// A StringCollection to use with AutoCompleteSource.
        /// 
        [Browsable(true), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Localizable(true), Description("Indicates custom StringCollection to use when the AutoCompleteSource property is set to CustomSource."), Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version= 2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
        public AutoCompleteStringCollection AutoCompleteCustomSource
        {
            get
            {
                return _TextBox.AutoCompleteCustomSource;
            }
            set
            {
                _TextBox.AutoCompleteCustomSource = value;
            }
        }
        /// 
        /// Gets or sets an option that controls how automatic completion works for the TextBox.
        /// One of the values of AutoCompleteMode. The values are Append, None, Suggest, and SuggestAppend. The default is None.
        /// 
        [Description("Gets or sets an option that controls how automatic completion works for the TextBox."), Browsable(true), EditorBrowsable(EditorBrowsableState.Always), DefaultValue(0)]
        public AutoCompleteMode AutoCompleteMode
        {
            get
            {
                return _TextBox.AutoCompleteMode;
            }
            set
            {
                _TextBox.AutoCompleteMode = value;
            }
        }
        /// 
        /// Gets or sets a value specifying the source of complete strings used for automatic completion.
        /// One of the values of AutoCompleteSource. The options are AllSystemSources, AllUrl, FileSystem, HistoryList, RecentlyUsedList, CustomSource, and None. The default is None.
        /// 
        [DefaultValue(0x80), TypeConverter(typeof(TextBoxAutoCompleteSourceConverter)), Browsable(true), EditorBrowsable(EditorBrowsableState.Always), Description("Gets or sets a value specifying the source of complete strings used for automatic completion.")]
        public AutoCompleteSource AutoCompleteSource
        {
            get
            {
                return _TextBox.AutoCompleteSource;
            }
            set
            {
                _TextBox.AutoCompleteSource = value;
            }
        }
        /// 
        /// Gets or sets whether the TextBox control modifies the case of characters as they are typed.
        /// One of the CharacterCasing enumeration values that specifies whether the TextBox control modifies the case of characters. The default is CharacterCasing.Normal.
        /// 
        [Category("Behavior"), Description("Indicates whether the TextBox control modifies the case of characters as they are typed."), DefaultValue(0)]
        public CharacterCasing CharacterCasing
        {
            get
            {
                return _TextBox.CharacterCasing;
            }
            set
            {
                _TextBox.CharacterCasing = value;
            }
        }
        /// 
        /// Gets or sets the character used to mask characters of a password in a single-line TextBox control.
        /// The character used to mask characters entered in a single-line TextBox control. Set the value of this property to 0 (character value) if you do not want the control to mask characters as they are typed. Equals 0 (character value) by default.
        /// 
        [RefreshProperties(RefreshProperties.Repaint), Localizable(true), Description("Gets or sets the character used to mask characters of a password in a single-line TextBox control."), Category("Behavior"), DefaultValue('\0')]
        public char PasswordChar
        {
            get
            {
                return _TextBox.PasswordChar;
            }
            set
            {
                _TextBox.PasswordChar = value;
            }
        }
        /// 
        /// Gets or sets how text is aligned in a TextBox control.
        /// One of the HorizontalAlignment enumeration values that specifies how text is aligned in the control. The default is HorizontalAlignment.Left.
        /// 
        [DefaultValue(0), Category("Appearance"), Localizable(true), Description("Indicates how text is aligned in a TextBox control.")]
        public HorizontalAlignment TextAlign
        {
            get
            {
                return _TextBox.TextAlign;
            }
            set
            {
                _TextBox.TextAlign = value;
            }
        }
        /// 
        /// Gets or sets a value indicating whether the text in the TextBox control should appear as the default password character.
        /// true if the text in the TextBox control should appear as the default password character; otherwise, false.
        /// 
        [Category("Behavior"), DefaultValue(false), Description("Gets or sets a value indicating whether the text in the TextBox control should appear as the default password character."), RefreshProperties(RefreshProperties.Repaint)]
        public bool UseSystemPasswordChar
        {
            get
            {
                return _TextBox.UseSystemPasswordChar;
            }
            set
            {
                _TextBox.UseSystemPasswordChar = value;
            }
        }
        /// 
        /// Gets or sets a value indicating whether the selected text in the text box control remains highlighted when the control loses focus.
        /// true if the selected text does not appear highlighted when the text box control loses focus; false, if the selected text remains highlighted when the text box control loses focus. The default is true.
        /// 
        [Category("Behavior"), DefaultValue(true), Description("Gets or sets a value indicating whether the selected text in the text box control remains highlighted when the control loses focus.")]
        public bool HideSelection
        {
            get
            {
                return _TextBox.HideSelection;
            }
            set
            {
                _TextBox.HideSelection = value;
            }
        }
        /// 
        /// Gets or sets the maximum number of characters the user can type or paste into the text box control.
        /// The number of characters that can be entered into the control. The default is 32767.
        /// 
        [Category("Behavior"), Description("Gets or sets the maximum number of characters the user can type or paste into the text box control."), DefaultValue(0x7fff), Localizable(true)]
        public virtual int MaxLength
        {
            get
            {
                return _TextBox.MaxLength;
            }
            set
            {
                _TextBox.MaxLength = value;
            }
        }
        /// 
        /// Gets or sets a value that indicates that the text box control has been modified by the user since the control was created or its contents were last set.
        /// true if the control's contents have been modified; otherwise, false. The default is false.
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false)]
        public bool Modified
        {
            get
            {
                return _TextBox.Modified;
            }
            set
            {
                _TextBox.Modified = value;
            }
        }
        /// 
        /// Gets or sets a value indicating whether text in the text box is read-only.
        /// true if the text box is read-only; otherwise, false. The default is false.
        /// 
        [DefaultValue(false), RefreshProperties(RefreshProperties.Repaint), Category("Behavior"), Description("Gets or sets a value indicating whether text in the text box is read-only.")]
        public bool ReadOnly
        {
            get
            {
                return _TextBox.ReadOnly;
            }
            set
            {
                _TextBox.ReadOnly = value;
            }
        }
        /// 
        /// Gets or sets a value indicating the currently selected text in the control.
        /// A string that represents the currently selected text in the text box.
        /// 
        [Description("Gets or sets a value indicating the currently selected text in the control."), Browsable(false), Category("Appearance"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public virtual string SelectedText
        {
            get
            {
                return _TextBox.SelectedText;
            }
            set
            {
                _TextBox.SelectedText = value;
            }
        }
        /// 
        /// Gets or sets the number of characters selected in the text box.
        /// The number of characters selected in the text box.
        /// 
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Description("Gets or sets the number of characters selected in the text box."), Category("Appearance")]
        public virtual int SelectionLength
        {
            get
            {
                return _TextBox.SelectionLength;
            }
            set
            {
                _TextBox.SelectionLength = value;
            }
        }
        /// 
        /// Gets or sets the starting point of text selected in the text box.
        /// The starting position of text selected in the text box.
        /// 
        [Description("Gets or sets the starting point of text selected in the text box."), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Category("Appearance"), Browsable(false)]
        public int SelectionStart
        {
            get
            {
                return _TextBox.SelectionStart;
            }
            set
            {
                _TextBox.SelectionStart = value;
            }
        }
        /// 
        /// Gets the length of text in the control.Returns number of characters contained in the text of the control.
        /// 
        [Browsable(false)]
        public virtual int TextLength
        {
            get
            {
                return _TextBox.TextLength;
            }
        }
        /// 
        /// Appends text to the current text of a text box.
        /// 
        /// The text to append to the current contents of the text box. 
        public void AppendText(string text)
        {
            _TextBox.AppendText(text);
        }
        /// 
        /// Clears all text from the text box control.
        /// 
        public void Clear()
        {
            _TextBox.Clear();
        }
        /// 
        /// Clears information about the most recent operation from the undo buffer of the text box.
        /// 
        public void ClearUndo()
        {
            _TextBox.ClearUndo();
        }
        /// 
        /// Copies the current selection in the text box to the Clipboard.
        /// 
        [UIPermission(SecurityAction.Demand, Clipboard = UIPermissionClipboard.OwnClipboard)]
        public void Copy()
        {
            _TextBox.Copy();
        }
        /// 
        /// Moves the current selection in the text box to the Clipboard.
        /// 
        public void Cut()
        {
            _TextBox.Cut();
        }
        /// 
        /// Specifies that the value of the SelectionLength property is zero so that no characters are selected in the control.
        /// 
        public void DeselectAll()
        {
            _TextBox.DeselectAll();
        }
        /// 
        /// Retrieves the character that is closest to the specified location within the control.
        /// 
        /// The location from which to seek the nearest character. 
        /// The character at the specified location.
        public virtual char GetCharFromPosition(Point pt)
        {
            return _TextBox.GetCharFromPosition(pt);
        }
        /// 
        /// Retrieves the index of the character nearest to the specified location.
        /// 
        /// The location to search.
        /// The zero-based character index at the specified location.
        public virtual int GetCharIndexFromPosition(Point pt)
        {
            return _TextBox.GetCharIndexFromPosition(pt);
        }
        /// 
        /// Retrieves the index of the first character of a given line.
        /// 
        /// The line for which to get the index of its first character. 
        /// The zero-based character index in the specified line.
        public int GetFirstCharIndexFromLine(int lineNumber)
        {
            return _TextBox.GetFirstCharIndexFromLine(lineNumber);
        }
        /// 
        /// Retrieves the index of the first character of the current line.
        /// 
        /// The zero-based character index in the current line.
        public int GetFirstCharIndexOfCurrentLine()
        {
            return _TextBox.GetFirstCharIndexOfCurrentLine();
        }
        /// 
        /// Retrieves the line number from the specified character position within the text of the control.
        /// 
        /// The character index position to search. 
        /// The zero-based line number in which the character index is located.
        public virtual int GetLineFromCharIndex(int index)
        {
            return _TextBox.GetLineFromCharIndex(index);
        }
        /// 
        /// Retrieves the location within the control at the specified character index.
        /// 
        /// The index of the character for which to retrieve the location. 
        /// The location of the specified character.
        public virtual Point GetPositionFromCharIndex(int index)
        {
            return _TextBox.GetPositionFromCharIndex(index);
        }
        /// 
        /// Replaces the current selection in the text box with the contents of the Clipboard.
        /// 
        [UIPermission(SecurityAction.Demand, Clipboard = UIPermissionClipboard.OwnClipboard)]
        public void Paste()
        {
            _TextBox.Paste();
        }
        /// 
        /// Selects a range of text in the text box.
        /// 
        /// The position of the first character in the current text selection within the text box. 
        /// The number of characters to select. 
        public void Select(int start, int length)
        {
            _TextBox.Select(start, length);
        }
        /// 
        /// Selects all text in the text box.
        /// 
        public void SelectAll()
        {
            _TextBox.SelectAll();
        }
        /// 
        /// Undoes the last edit operation in the text box.
        /// 
        public void Undo()
        {
            _TextBox.Undo();
        }
        /// 
        /// Replaces the specified selection in the TextBox with the contents of the Clipboard.
        /// 
        /// The text to replace.
        public void Paste(string text)
        {
            _TextBox.Paste(text);
        }
        #endregion
    }
    #region TextBoxAutoCompleteSourceConverter
    internal class TextBoxAutoCompleteSourceConverter : EnumConverter
    {
        // Methods
        public TextBoxAutoCompleteSourceConverter(Type type)
            : base(type)
        {
        }
        public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            TypeConverter.StandardValuesCollection standardValues = base.GetStandardValues(context);
            ArrayList values = new ArrayList();
            int count = standardValues.Count;
            for (int i = 0; i < count; i++)
            {
                if (!standardValues[i].ToString().Equals("ListItems"))
                {
                    values.Add(standardValues[i]);
                }
            }
            return new TypeConverter.StandardValuesCollection(values);
        }
    }
    #endregion
}
#endif