using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
namespace DevComponents.AdvTree
{
	/// 
	/// Represents the text box for editing cell's text.
	/// 
	[Designer("System.Windows.Forms.Design.ControlDesigner, System.Design, Version= 2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),ToolboxItem(false)]
	internal class TextBoxEx:TextBox, ICellEditControl
	{
		#region Private variables
		private bool m_WordWrap=false;
		#endregion
		#region Events
		public event EventHandler EditComplete;
		public event EventHandler CancelEdit;
		#endregion
		#region Constructor
		public TextBoxEx():base()
		{
			this.AutoSize=false;
			this.BorderStyle=System.Windows.Forms.BorderStyle.None;
		}
		#endregion
		#region Internal Implementation
		protected override void OnKeyDown(KeyEventArgs e)
	{	
			base.OnKeyDown(e);
			if(e.KeyCode==Keys.Enter && !m_WordWrap || e.KeyCode==Keys.Enter && e.Modifiers==Keys.Control)
			{
				if(EditComplete!=null)
					EditComplete(this, new EventArgs());
			}
			else if(e.KeyCode==Keys.Escape)
			{
				if(CancelEdit!=null)
					CancelEdit(this,new EventArgs());
			}
		}
#if FRAMEWORK20
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (!m_WordWrap && _PreventEnterBeep && e.KeyChar == (char)Keys.Enter)
            {
                e.Handled = true;
            }
            base.OnKeyPress(e);
        }
#endif
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Tab)
            {
                if (EditComplete != null)
                    EditComplete(this, new EventArgs());
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
		protected override void OnTextChanged(EventArgs e)
		{
			base.OnTextChanged (e);
			ResizeControl();
		}
		private void ResizeControl()
		{
			Graphics g=this.CreateGraphics();
			SizeF size=g.MeasureString(this.Text,this.Font);
			int width=(int)Math.Ceiling(size.Width);
			int height=(int)Math.Ceiling(size.Height);
            if (this.Parent != null && this.Right + (width - this.Width) > (this.Parent.ClientRectangle.Right - SystemInformation.VerticalScrollBarWidth - 2))
                return;
            if (width > this.Width)
                this.Width = width;
			if(m_WordWrap)
			{
				if(this.Parent!=null && this.Bottom+(height-this.Height)>this.Parent.Bottom)
					return;
				if(height>this.Height)
					this.Height=height;
			}
		}
		#endregion
		#region Public Properties
		/// 
		/// Gets or sets whether the editing is in word-wrap mode.
		/// 
		public bool EditWordWrap
		{
			get {return m_WordWrap;}
			set
			{
				m_WordWrap=value;
				if(m_WordWrap)
				{
					this.Multiline=true;
					this.ScrollBars=ScrollBars.None;
				}
				else
				{
					this.Multiline=false;
				}
			}
		}
        private bool _PreventEnterBeep = false;
        /// 
        /// Gets or sets whether control prevents Beep sound when Enter key is pressed.
        /// 
        [DefaultValue(false), Category("Behavior"), Description("Gets or sets whether control prevents Beep sound when Enter key is pressed.")]
        public bool PreventEnterBeep
        {
            get { return _PreventEnterBeep; }
            set
            {
                _PreventEnterBeep = value;
            }
        }
        
		#endregion
        #region ICellEditControl Members
        public void BeginEdit()
        {
            
        }
        public void EndEdit()
        {
            
        }
        public object CurrentValue
        {
            get
            {
                return this.Text;
            }
            set
            {
                this.Text = value.ToString();
            }
        }
        #endregion
    }
}