using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using SysFuns;
using ryCommon;
namespace ryControls
{
    /// <summary>
    /// 热键文本框
    /// </summary>
    public partial class HotkeyTextBox : UserControl,IMessageFilter
    {
        Keys m_Modifiers =Keys.None;
        Keys m_Key =Keys.None;
        /// <summary>
        /// 热键文本框
        /// </summary>
        public HotkeyTextBox()
        {
            InitializeComponent();
            //定义KeyPress事件
            //base.KeyPress += delegate(object sender, KeyPressEventArgs e) { e.Handled = true; };
            TxtHotKey.ReadOnly = true;
            TxtHotKey.BackColor = Color.White;
            TxtHotKey.KeyDown += TxtHotKey_KeyDown;
            TxtHotKey.KeyUp += TxtHotKey_KeyUp;
            TxtHotKey.Top = (Height - TxtHotKey.Height) / 2;
            //Application.AddMessageFilter(this);
            base.BackColor = Color.White;
        }
        /// <summary>
        /// 
        /// </summary>
        ~HotkeyTextBox()
        {
           // Application.RemoveMessageFilter(this);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        public bool PreFilterMessage(ref Message m)
        {
            //if (m.Msg == 0x0100)
            //{
            //     var key=(Keys)(m.WParam.ToInt32());
            //     return false;
            //}
            return false;
        }
        /// <summary>
        /// 在控件大小变化时发生
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSizeChanged(EventArgs e)
        {
            TxtHotKey.Top = (Height - TxtHotKey.Height) / 2;
            TxtHotKey.Width = Width - BtnClear.Width - 2;
            BtnClear.Top = 0;
            BtnClear.Left = TxtHotKey.Left + TxtHotKey.Width;
            BtnClear.Height = Height;
        }
        private void TxtHotKey_KeyDown(object sender, KeyEventArgs e)
        {
            OnKeyDown(e);
        }
        private void TxtHotKey_KeyUp(object sender, KeyEventArgs e)
        {
            OnKeyUp(e);
        }
        //使文本属性失效掉
        /// <summary>
        /// 此属性无效
        /// </summary>
        [Description("此属性无效")]
        public new string Text
        {
            get { return TxtHotKey.Text; }
            set
            {
                LoadHotKey(value);
            }
        }
        /// <summary>
        /// 载入热键配置
        /// </summary>
        /// <param name="hotkey"></param>
        public void LoadHotKey(string hotkey)
        {
            T_Modifiers = 0;
            T_Key = Keys.None;
            try
            {
                string[] item = hotkey.Split('+');
                if (item.Length == 1 && item[0].IsInt())
                {
                    T_Modifiers = 0;
                    T_Key = (Keys)item[0].ToInt(0);
                }
                else if (item.Length == 2 && item[0].IsInt() && item[1].IsInt())
                {
                    T_Modifiers = item[0].ToInt(0);
                    T_Key = (Keys)item[1].ToInt(0);
                }
            }
            catch
            {

            }
            UpdateText();
        }
        private void UpdateText()
        {
            HotkeyValue xvalue = new HotkeyValue(T_Modifiers, (int)T_Key);
            base.Text = xvalue.ToString();
            TxtHotKey.Text = base.Text;
            TxtHotKey.SelectionLength = 0;
            TxtHotKey.SelectionStart = 0;
        }
        /// <summary>
        /// 保存热键
        /// </summary>
        /// <returns></returns>
        public string SaveHotKey()
        {
            if(T_Key==Keys.None)
            { return "0+0"; }
            return T_Modifiers.ToString() + "+" + ((int)T_Key).ToString();
        }
        /// <summary>
        /// 是否含义热键
        /// </summary>
        public bool HaveHotKey
        {
            get { return m_Key != Keys.None || (T_Modifiers==0 && T_Key>Keys.A && T_Key<Keys.Z); }
        }
        /// <summary>
        /// 读取或设置热键
        /// </summary>
        public string HotKey
        {
            get { return SaveHotKey(); }
            set { LoadHotKey(value); }
        }
        /// <summary>
        /// 功能键
        /// </summary>
        [Description("功能键")]
        public int T_Modifiers
        {
            get
            {
                int i_Keys = 0;
                if ((m_Modifiers & Keys.Alt) != 0)
                { i_Keys |= 1; }
                if ((m_Modifiers & Keys.Control) != 0)
                { i_Keys |= 2; }
                if ((m_Modifiers & Keys.Shift) != 0 || (m_Modifiers & Keys.LShiftKey) != 0 || (m_Modifiers & Keys.RShiftKey) != 0)
                { i_Keys |= 4; }
                if ((m_Modifiers & Keys.LWin) != 0 || (m_Modifiers & Keys.RWin) != 0)
                { i_Keys |= 8; }
                return i_Keys;
            }
            set
            {
                m_Modifiers =Keys.None;
                if ((value & 1) != 0)
                { m_Modifiers |=Keys.Alt; }
                if ((value & 2) != 0)
                { m_Modifiers |= Keys.Control; }
                if ((value & 4) != 0)
                { m_Modifiers |= Keys.Shift; }
                if ((value & 8) != 0)
                { m_Modifiers |= Keys.LWin; }
                UpdateText();
            }
        }
        /// <summary>
        /// 热键按键
        /// </summary>
        [Description("热键按键")]
        public Keys T_Key
        {
            get
            {
                return m_Key;
            }
            set
            {
                m_Key = value;
                UpdateText();
            }
        }
        //TextBox的KeyDown事件
        /// <summary>
        /// KeyDown事件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnKeyDown(KeyEventArgs e)
        {
            //if (e.Modifiers == 0) //没有修改键
            //{
            //    e.Handled = true;
            //    return;
            //}
            HotkeyValue value;
            if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Menu || e.KeyCode == Keys.None)
            {//除修改键外，没有按键
                value = new HotkeyValue(e.Modifiers, Keys.None);
            }
            else
            {
                value = new HotkeyValue(e.Modifiers, e.KeyCode);
            }
            m_Modifiers = value.Modifiers;
            m_Key = value.KeyCode;
            base.Text = value.ToString();//赋值
            TxtHotKey.Text = base.Text;
            e.Handled = true;
            base.OnKeyDown(e);
        }
        //TextBox的KeyDown事件
        /// <summary>
        /// KeyDown事件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnKeyUp(KeyEventArgs e)
        {
            if(m_Modifiers!=Keys.None && m_Key==Keys.None)
            {
                m_Modifiers = Keys.None;
                TxtHotKey.Text = "错误的热键";
            }
            e.Handled = false;
            base.OnKeyUp(e);
        }
        private void BtnClear_Click(object sender, EventArgs e)
        {
            m_Modifiers =Keys.None;
            m_Key = Keys.None;
            UpdateText();
        }

        private void CtlHotkey_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(213, 216, 223)), new Rectangle(0, 0, this.Width - 1, this.Height - 1));
        }
    }
}
