using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.ComponentModel;

// by conmajia@gmail.com


namespace ryControls
{
    /// <summary>
    /// 多标签控件
    /// </summary>
    [ToolboxBitmap(typeof(System.Windows.Forms.TabControl))]
    public class TabControlEx : TabControl
    {
        #region Status Variables
        readonly bool mouseDown = false;
        //bool hijackParent = false;
        #endregion

        #region Graphics Variables
        Image icon;
        ImageAttributes ia;
        readonly ColorMatrix cm;
        readonly float[][] colorMatrix ={
            new float[]{0.299f, 0.299f, 0.299f, 0, 0},
            new float[]{0.587f, 0.587f, 0.587f, 0, 0},
            new float[]{0.114f, 0.114f, 0.114f, 0, 0},
            new float[]{0, 0, 0, 1, 0},
            new float[]{0, 0, 0, 1, 0}};
        #endregion

        #region Objects
        //Form parent;
        //int FORM_DELTA = 20;
        //int elapsed = 0;
        //Timer timer;
        //int lastLowerBound = 0;
        //int currentLowerBound = 0;
        #endregion

        #region Properties
        #endregion

        #region Initiates
        /// <summary>
        /// 
        /// </summary>
        public TabControlEx()
        {
            SetStyles();

            ia = new ImageAttributes();
            cm = new ColorMatrix(colorMatrix);
            ia.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            icon = new Bitmap(1, 1);
            TabBackground = new Bitmap(this.GetType(), "TabButtonBackground.bmp");
            //this.ItemSize = new Size(44, tabBackground.Height);
        }
        private TabBar tabbar;
        /// <summary>
		/// 获取对应的标签
		/// </summary>
		[Browsable(false)]
        public TabBar TabBar
        {
            get
            {
                return this.tabbar;
            }
        }
        internal TabBar InternalTabBar
        {
            get
            {
                return this.tabbar;
            }

            set
            {
                this.tabbar = value;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public Image TabBackground { get; set; }
        #endregion

        #region Private UI Methods

        private void SetStyles()
        {
            base.SetStyle(
                 ControlStyles.UserPaint |
                 ControlStyles.OptimizedDoubleBuffer |
                 ControlStyles.AllPaintingInWmPaint |
                 ControlStyles.ResizeRedraw |
                 ControlStyles.SupportsTransparentBackColor,
                 true);
            base.UpdateStyles();
        }

        // 计算控件底线
        private void SetLowBound(Control container)
        {
            int tmp = 0;
            Control c = null;
            for (int i = 0; i < container.Controls.Count; i++)
            {
                c = container.Controls[i];
                if (tmp < c.Bottom)
                    tmp = c.Bottom;
            }

            container.Tag = tmp;
        }
        #endregion

        #region Tab Overrides
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnControlAdded(ControlEventArgs e)
        {
            SetLowBound(e.Control);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSelecting(TabControlCancelEventArgs e)
        {

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSelected(TabControlEventArgs e)
        {
            //parent.Text = e.TabPage.Text;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnParentChanged(EventArgs e)
        {
            //if (parent == null)
            //    parent = this.FindForm();

            //parent.Text = this.TabPages[0].Text;
        }
        /// <summary>
        /// 
        /// </summary>
        public Color TabBackColor
        {
            get; set;
        } = Color.White;
        #endregion
        #region Paint Override

        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            Rectangle TabControlArea = this.ClientRectangle;

            Rectangle TabArea = new Rectangle(3, 24, this.ClientRectangle.Width - 7, this.ClientRectangle.Height - 28);// this.DisplayRectangle;

            //----------------------------
            // 控件内部颜色
            Brush br = new SolidBrush(TabBackColor);

            e.Graphics.FillRectangle(br, TabControlArea);

            br.Dispose();
            e.Graphics.TextRenderingHint
                = TextRenderingHint.AntiAlias;

            for (int i = 0; i < this.TabCount; i++)
            {
                if (this.SelectedIndex == i)
                {
                    if (TabBackground != null)
                        e.Graphics.DrawImage(TabBackground, this.GetTabRect(i));
                }

                if (this.ImageList != null && (this.TabPages[i].ImageIndex > -1 || !string.IsNullOrEmpty(this.TabPages[i].ImageKey)))
                {
                    if (this.ImageList.Images.Count > 0)
                    {
                        if (this.TabPages[i].ImageIndex > -1)
                        {
                            if (this.TabPages[i].ImageIndex < this.ImageList.Images.Count)
                            {
                                icon = this.ImageList.Images[this.TabPages[i].ImageIndex];
                            }
                            else
                            {
                                //icon = this.ImageList.Images[0];
                            }
                        }
                        else
                            if (!string.IsNullOrEmpty(this.TabPages[i].ImageKey) && this.ImageList.Images.ContainsKey(this.TabPages[i].ImageKey))
                            icon = this.ImageList.Images[this.TabPages[i].ImageKey];

                        if (mouseDown && (this.SelectedIndex != i))
                            e.Graphics.DrawImage(
                                icon,
                                new Rectangle(
                                    this.GetTabRect(i).X + (this.GetTabRect(i).Width - icon.Width) / 2,
                                    this.GetTabRect(i).Y,
                                    icon.Width,
                                    icon.Height),
                                0,
                                0,
                                icon.Width,
                                icon.Height,
                                GraphicsUnit.Pixel,
                                ia);
                        else
                            e.Graphics.DrawImage(
                                icon,
                                this.GetTabRect(i).X + (this.GetTabRect(i).Width - icon.Width) / 2,
                                this.GetTabRect(i).Y);
                    }

                }

                SizeF textSize
                    = e.Graphics.MeasureString(this.TabPages[i].Text, this.Font);

                e.Graphics.DrawString(
                    this.TabPages[i].Text,
                    this.Font,
                    SystemBrushes.ControlLightLight,
                    this.GetTabRect(i).X + (this.GetTabRect(i).Width - textSize.Width) / 2 + 1,
                    this.GetTabRect(i).Y + 40);

                e.Graphics.DrawString(
                    this.TabPages[i].Text,
                    this.Font,
                    SystemBrushes.ControlText,
                    this.GetTabRect(i).X + (this.GetTabRect(i).Width - textSize.Width) / 2,
                    this.GetTabRect(i).Y + 39);
            }
        }
        #endregion
    }
}
