using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace LYFZ.ComponentLibrary
{
    public partial class ComboBoxTreeViewEx : ComboBox
    {
        private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203;
        ToolStripControlHost treeViewHost;
        ToolStripDropDown dropDown;
        public ComboBoxTreeViewEx()
        {
            TreeView treeView = new TreeView();
            treeView.AfterSelect += new TreeViewEventHandler(treeView_AfterSelect);
            treeView.BorderStyle = BorderStyle.None;

            treeViewHost = new ToolStripControlHost(treeView);
            dropDown = new ToolStripDropDown();
            dropDown.Width = this.Width;
            dropDown.Items.Add(treeViewHost);

        }
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        //public void treeView_AfterSelect(object sender, TreeViewEventArgs e)
        //{
        //    if (e.Node.Nodes.Count <= 0)//判断选中节点是否有子节点
        //    { 
        //        this.Text = TreeView.SelectedNode.Text; 
        //        dropDown.Close();
        //    }
        //}
        public TreeView TreeView
        {
            get { return treeViewHost.Control as TreeView; }
        }
        private void ShowDropDown()
        {
            if (dropDown != null)
            {
                treeViewHost.Size = new Size(DropDownWidth - 2, DropDownHeight);
                dropDown.Show(this, 0, this.Height);
            }
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN)
            {
                ShowDropDown();
                return;
            }
            base.WndProc(ref m);
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (dropDown != null)
                {
                    dropDown.Dispose();
                    dropDown = null;
                }
            }
            base.Dispose(disposing);
        }

        #region 定义文本框值更改后触发事件
        //定义delegate
        public delegate void ComboBoxTreeView_TextChanged(object sender, TreeViewEventArgs e);
        //用event 关键字声明事件对象
        /// <summary>
        /// 
        /// </summary>
        [Category("控件扩展事件"), Description("文本框值修改时")]
        public event ComboBoxTreeView_TextChanged ComboBoxTreeViewEx_TextChanged;

        private bool _dropdownshow = false;
        /// <summary>
        /// 控件下拉是否展开还是隐藏
        /// </summary>
        public bool DropDownShow
        {
            get { return _dropdownshow; }
            set { _dropdownshow = value; }
        }
        /// <summary>
        /// 节点选择事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Nodes.Count <= 0)//判断选中节点是否有子节点
            {
                if (DropDownShow && e.Node.Level == 0)
                {
                    this.Name = "";
                    this.Text = "";
                    dropDown.Show();
                }
                else
                {
                    this.Name = TreeView.SelectedNode.Name.ToString();
                    if (Name != "")
                    {
                        this.Tag = TreeView.SelectedNode.Tag.ToString();
                        this.Text = TreeView.SelectedNode.Text.ToString();
                        dropDown.Close();
                    }
                }
            }
            if (this.ComboBoxTreeViewEx_TextChanged != null)
                ComboBoxTreeViewEx_TextChanged(sender, e);
        }
        #endregion
    }
}