using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
    #region Enums
    [System.Flags()]
    internal enum eDockingHintSide
    {
        Left = 1,
        Right = 2,
        Top = 4,
        Bottom = 8,
        DockTab = 16,
        All = (Left | Right | Top | Bottom | DockTab),
        Sides = (Left | Right | Top | Bottom)
    }
    internal enum eMouseOverHintSide
    {
        None,
        Left,
        Right,
        Top,
        Bottom,
        DockTab,
    }
    #endregion
    /// 
    /// Summary description for DockingHint.
    /// 
    [ToolboxItem(false)]
    internal class DockingHint : System.Windows.Forms.Form
    {
        #region Private Variables
        /// 
        /// Required designer variable.
        /// 
        private System.ComponentModel.Container components = null;
        private eDockingHintSide m_DockingHintSide = eDockingHintSide.All;
        private eMouseOverHintSide m_MouseOverHintSide = eMouseOverHintSide.None;
        private bool m_PendingRefresh = false;
        private GraphicsPath m_LeftHint = null;
        private GraphicsPath m_RightHint = null;
        private GraphicsPath m_BottomHint = null;
        private GraphicsPath m_TopHint = null;
        private GraphicsPath m_DockTabHint = null;
        private bool m_MiddleDockHint = false;
        #endregion
        #region Static Members
        // Static Images
        private static Bitmap s_ImageGuideTop = null;
        private static Bitmap s_ImageGuideBottom = null;
        private static Bitmap s_ImageGuideLeft = null;
        private static Bitmap s_ImageGuideRight = null;
        private static Bitmap s_ImageGuideTab = null;
        private static Bitmap s_ImageGuideAllSides = null;
        private static Bitmap s_ImageGuideTop2010 = null;
        private static Bitmap s_ImageGuideBottom2010 = null;
        private static Bitmap s_ImageGuideLeft2010 = null;
        private static Bitmap s_ImageGuideRight2010 = null;
        private static Bitmap s_ImageGuideTab2010 = null;
        private static Bitmap s_ImageGuideTabTopBottom2010 = null;
        private static Bitmap s_ImageGuideTabLeftRight2010 = null;
        private static Bitmap s_ImageGuideAllSides2010 = null;
        public static Bitmap ImageGuideTop
        {
            get
            {
                if (s_ImageGuideTop == null)
                    s_ImageGuideTop = BarFunctions.LoadBitmap("SystemImages.DockHintTop.png");
                return s_ImageGuideTop;
            }
        }
        public static Bitmap ImageGuideTop2010
        {
            get
            {
                if (s_ImageGuideTop2010 == null)
                    s_ImageGuideTop2010 = BarFunctions.LoadBitmap("SystemImages.DockHintTop2010.png");
                return s_ImageGuideTop2010;
            }
        }
        public static Bitmap ImageGuideBottom
        {
            get
            {
                if (s_ImageGuideBottom == null)
                    s_ImageGuideBottom = BarFunctions.LoadBitmap("SystemImages.DockHintBottom.png");
                return s_ImageGuideBottom;
            }
        }
        public static Bitmap ImageGuideBottom2010
        {
            get
            {
                if (s_ImageGuideBottom2010 == null)
                    s_ImageGuideBottom2010 = BarFunctions.LoadBitmap("SystemImages.DockHintBottom2010.png");
                return s_ImageGuideBottom2010;
            }
        }
        public static Bitmap ImageGuideLeft
        {
            get
            {
                if (s_ImageGuideLeft == null)
                    s_ImageGuideLeft = BarFunctions.LoadBitmap("SystemImages.DockHintLeft.png");// new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"SystemImages.DockHintLeft.png");
                return s_ImageGuideLeft;
            }
        }
        public static Bitmap ImageGuideLeft2010
        {
            get
            {
                if (s_ImageGuideLeft2010 == null)
                    s_ImageGuideLeft2010 = BarFunctions.LoadBitmap("SystemImages.DockHintLeft2010.png");// new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"SystemImages.DockHintLeft.png");
                return s_ImageGuideLeft2010;
            }
        }
        public static Bitmap ImageGuideRight
        {
            get
            {
                if (s_ImageGuideRight == null)
                    s_ImageGuideRight = BarFunctions.LoadBitmap("SystemImages.DockHintRight.png");
                return s_ImageGuideRight;
            }
        }
        public static Bitmap ImageGuideRight2010
        {
            get
            {
                if (s_ImageGuideRight2010 == null)
                    s_ImageGuideRight2010 = BarFunctions.LoadBitmap("SystemImages.DockHintRight2010.png");
                return s_ImageGuideRight2010;
            }
        }
        public static Bitmap ImageGuideTab
        {
            get
            {
                if (s_ImageGuideTab == null)
                    s_ImageGuideTab = BarFunctions.LoadBitmap("SystemImages.DockHintTab.png");
                return s_ImageGuideTab;
            }
        }
        public static Bitmap ImageGuideTab2010
        {
            get
            {
                if (s_ImageGuideTab2010 == null)
                    s_ImageGuideTab2010 = BarFunctions.LoadBitmap("SystemImages.DockHintTab2010.png");
                return s_ImageGuideTab2010;
            }
        }
        public static Bitmap ImageGuideAllTopBottom2010
        {
            get
            {
                if (s_ImageGuideTabTopBottom2010 == null)
                    s_ImageGuideTabTopBottom2010 = BarFunctions.LoadBitmap("SystemImages.DockHintTopBottom2010.png");
                return s_ImageGuideTabTopBottom2010;
            }
        }
        public static Bitmap ImageGuideAllLeftRight2010
        {
            get
            {
                if (s_ImageGuideTabLeftRight2010 == null)
                    s_ImageGuideTabLeftRight2010 = BarFunctions.LoadBitmap("SystemImages.DockHintLeftRight2010.png");
                return s_ImageGuideTabLeftRight2010;
            }
        }
        public static Bitmap ImageGuideAllSides
        {
            get
            {
                if (s_ImageGuideAllSides == null)
                    s_ImageGuideAllSides = BarFunctions.LoadBitmap("SystemImages.DockHintAllSides.png");
                return s_ImageGuideAllSides;
            }
        }
        public static Bitmap ImageGuideAllSides2010
        {
            get
            {
                if (s_ImageGuideAllSides2010 == null)
                    s_ImageGuideAllSides2010 = BarFunctions.LoadBitmap("SystemImages.DockHintAllSides2010.png");
                return s_ImageGuideAllSides2010;
            }
        }
        #endregion
        #region Constructor
        private eDotNetBarStyle _Style = eDotNetBarStyle.Office2003;
        public DockingHint(eDockingHintSide hintSide, eDotNetBarStyle style) : this(hintSide, false, style) { }
        public DockingHint(eDockingHintSide hintSide, bool middleDockingHint, eDotNetBarStyle style)
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            _Style = style;
            m_MiddleDockHint = middleDockingHint;
            this.SetStyle(ControlStyles.Selectable, false);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(DisplayHelp.DoubleBufferFlag, true);
            this.SetStyle(ControlStyles.Opaque, true);
            m_DockingHintSide = hintSide;
            UpdateControlRegion();
        }
        #endregion
        #region Internal Implemementation
        public void ShowFocusless()
        {
            Size size = this.Size;
            NativeFunctions.SetWindowPos(this.Handle, new IntPtr(NativeFunctions.HWND_TOP), 0, 0, size.Width, size.Height, NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE);
            //this.TopMost=true;
            if (!BarFunctions.ThemedOS)
                UpdateControlRegion();
        }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= (int)NativeFunctions.WS_EX_TOPMOST | (int)NativeFunctions.SWP_NOACTIVATE;
                return cp;
            }
        }
        /// 
        /// Clean up any resources being used.
        /// 
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }
        private void DisposeHintPaths()
        {
            DisposeHintPath(ref m_LeftHint);
            DisposeHintPath(ref m_RightHint);
            DisposeHintPath(ref m_TopHint);
            DisposeHintPath(ref m_BottomHint);
        }
        private void DisposeHintPath(ref GraphicsPath path)
        {
            if (path != null) path.Dispose();
            path = null;
        }
        /// 
        /// Update control region based on hint side
        /// 
        public void UpdateControlRegion()
        {
            System.Drawing.Region region = null;
            System.Drawing.Size size = Size.Empty;
            if (m_MiddleDockHint)
            {
                GraphicsPath path = new GraphicsPath();
                m_DockTabHint = this.GetHintPath(eDockingHintSide.DockTab);
                DisposeHintPaths();
                if (m_DockingHintSide == (eDockingHintSide.Left | eDockingHintSide.Right) && (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style)))
                {
                    m_LeftHint = this.GetHintPath(eDockingHintSide.Left);
                    m_RightHint = this.GetHintPath(eDockingHintSide.Right);
                    path.AddRectangle(new Rectangle(0, 36, 112, 40));
                }
                else if (m_DockingHintSide == (eDockingHintSide.Top | eDockingHintSide.Bottom) && (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style)))
                {
                    m_TopHint = this.GetHintPath(eDockingHintSide.Top);
                    m_BottomHint = this.GetHintPath(eDockingHintSide.Bottom);
                    path.AddRectangle(new Rectangle(36, 0, 40, 112));
                }
                else
                {
                    // Assign paths
                    if ((m_DockingHintSide & eDockingHintSide.Left) != 0)
                    {
                        m_LeftHint = this.GetHintPath(eDockingHintSide.Left);
                        path.AddPath(m_LeftHint, true);
                    }
                    else
                    {
                        if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                            path.AddLine(26, 36, 26, 76);
                        else
                            path.AddLine(23, 57, 23, 29);
                    }
                    if ((m_DockingHintSide & eDockingHintSide.Top) != 0)
                    {
                        m_TopHint = this.GetHintPath(eDockingHintSide.Top);
                        path.AddPath(m_TopHint, true);
                    }
                    else
                    {
                        if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                            path.AddLine(26, 36, 88, 36);
                        else
                            path.AddLine(29, 23, 57, 23);
                    }
                    if ((m_DockingHintSide & eDockingHintSide.Right) != 0)
                    {
                        m_RightHint = this.GetHintPath(eDockingHintSide.Right);
                        path.AddPath(m_RightHint, true);
                    }
                    else
                    {
                        if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                            path.AddLine(88, 36, 88, 76);
                        else
                            path.AddLine(64, 29, 64, 57);
                    }
                    if ((m_DockingHintSide & eDockingHintSide.Bottom) != 0)
                    {
                        m_BottomHint = this.GetHintPath(eDockingHintSide.Bottom);
                        path.AddPath(m_BottomHint, true);
                    }
                    else
                    {
                        if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                            path.AddLine(88, 76, 26, 76);
                        else
                            path.AddLine(57, 64, 29, 64);
                    }
                    path.CloseAllFigures();
                }
                if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    size = new Size(112, 112);
                else
                    size = new Size(88, 88);
                region = new Region(path);
            }
            else
            {
                if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    size = new Size(40, 40);
                else
                {
                    if ((m_DockingHintSide & eDockingHintSide.Left) != 0 || (m_DockingHintSide & eDockingHintSide.Right) != 0)
                        size = new Size(31, 29);
                    else
                        size = new Size(29, 31);
                }
                if ((m_DockingHintSide & eDockingHintSide.Left) != 0)
                {
                    m_LeftHint = new GraphicsPath();
                    m_LeftHint.AddRectangle(new Rectangle(Point.Empty, size));
                }
                if ((m_DockingHintSide & eDockingHintSide.Right) != 0)
                {
                    m_RightHint = new GraphicsPath();
                    m_RightHint.AddRectangle(new Rectangle(Point.Empty, size));
                }
                if ((m_DockingHintSide & eDockingHintSide.Top) != 0)
                {
                    m_TopHint = new GraphicsPath();
                    m_TopHint.AddRectangle(new Rectangle(Point.Empty, size));
                }
                if ((m_DockingHintSide & eDockingHintSide.Bottom) != 0)
                {
                    m_BottomHint = new GraphicsPath();
                    m_BottomHint.AddRectangle(new Rectangle(Point.Empty, size));
                }
                region = new Region(new Rectangle(Point.Empty, size));
            }
            this.Size = size;
            if (region != null)
                this.Region = region;
        }
        private Rectangle GetHintRect()
        {
            System.Drawing.Size size = Size.Empty;
            if ((m_DockingHintSide & eDockingHintSide.Bottom) == eDockingHintSide.Bottom)
            {
                SizeF sf = m_BottomHint.GetBounds().Size;
                size = new Size((int)sf.Width, (int)sf.Height);
            }
            if ((m_DockingHintSide & eDockingHintSide.Top) == eDockingHintSide.Top)
            {
                SizeF sf = m_TopHint.GetBounds().Size;
                size = new Size((int)sf.Width, (int)sf.Height);
            }
            if ((m_DockingHintSide & eDockingHintSide.Right) == eDockingHintSide.Right)
            {
                SizeF sf = m_RightHint.GetBounds().Size;
                size = new Size((int)sf.Width, (int)sf.Height);
            }
            if ((m_DockingHintSide & eDockingHintSide.DockTab) == eDockingHintSide.DockTab)
            {
                SizeF sf = m_DockTabHint.GetBounds().Size;
                size = new Size((int)sf.Width, (int)sf.Height);
            }
            if ((m_DockingHintSide & eDockingHintSide.Left) == eDockingHintSide.Left)
            {
                SizeF sf = m_LeftHint.GetBounds().Size;
                size = new Size((int)sf.Width, (int)sf.Height);
            }
            if (m_DockingHintSide == eDockingHintSide.Sides)
                size = new Size(88, 88);
            return new Rectangle(Point.Empty, size);
        }
        private Image GetImageGuideTab()
        {
            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
            {
                return DockingHint.ImageGuideTab2010;
            }
            return DockingHint.ImageGuideTab;
        }
        private Image GetImageGuideAllSides()
        {
            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
            {
                if (m_DockingHintSide == (eDockingHintSide.Left | eDockingHintSide.Right))
                    return DockingHint.ImageGuideAllLeftRight2010;
                else if (m_DockingHintSide == (eDockingHintSide.Top | eDockingHintSide.Bottom))
                    return DockingHint.ImageGuideAllTopBottom2010;
                return DockingHint.ImageGuideAllSides2010;
            }
            return DockingHint.ImageGuideAllSides;
        }
        private Image GetImageGuideLeft()
        {
            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                return DockingHint.ImageGuideLeft2010;
            return DockingHint.ImageGuideLeft;
        }
        private Image GetImageGuideRight()
        {
            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                return DockingHint.ImageGuideRight2010;
            return DockingHint.ImageGuideRight;
        }
        private Image GetImageGuideTop()
        {
            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                return DockingHint.ImageGuideTop2010;
            return DockingHint.ImageGuideTop;
        }
        private Image GetImageGuideBottom()
        {
            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                return DockingHint.ImageGuideBottom2010;
            return DockingHint.ImageGuideBottom;
        }
        private SolidBrush CreateOverlayMouseOverBrush()
        {
            return new SolidBrush(Color.FromArgb(48, Color.Navy));
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Color colorHot = Color.FromArgb(65, 112, 202);
            Color color = Color.FromArgb(228, 228, 228);
            SolidBrush brush = new SolidBrush(color);
            Pen pen = new Pen(colorHot, 1);
            try
            {
                if (m_MiddleDockHint)
                {
                    g.DrawImageUnscaled(GetImageGuideAllSides(), 0, 0);
                    if ((m_DockingHintSide & eDockingHintSide.DockTab) == eDockingHintSide.DockTab)
                    {
                        Image imageGuideTab = GetImageGuideTab();
                        if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                            g.DrawImageUnscaled(imageGuideTab, (this.Width - imageGuideTab.Width) / 2, (this.Height - imageGuideTab.Height) / 2);
                        else
                            g.DrawImageUnscaled(imageGuideTab, (this.Width - imageGuideTab.Width) / 2 + 2, (this.Height - imageGuideTab.Height) / 2 + 2);
                    }
                    if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    {
                    }
                    else
                    {
                        if ((m_DockingHintSide & eDockingHintSide.Bottom) != eDockingHintSide.Bottom)
                            g.FillRectangle(brush, 33, 60, 23, 26);
                        if ((m_DockingHintSide & eDockingHintSide.Top) != eDockingHintSide.Top)
                            g.FillRectangle(brush, 33, 4, 23, 26);
                        if ((m_DockingHintSide & eDockingHintSide.Left) != eDockingHintSide.Left)
                            g.FillRectangle(brush, 4, 33, 26, 23);
                        if ((m_DockingHintSide & eDockingHintSide.Right) != eDockingHintSide.Right)
                            g.FillRectangle(brush, 60, 33, 26, 23);
                    }
                }
                else
                {
                    if ((m_DockingHintSide & eDockingHintSide.Left) == eDockingHintSide.Left)
                    {
                        g.DrawImage(GetImageGuideLeft(), m_LeftHint.GetBounds());
                    }
                    if ((m_DockingHintSide & eDockingHintSide.Right) == eDockingHintSide.Right)
                    {
                        g.DrawImage(GetImageGuideRight(), m_RightHint.GetBounds());
                    }
                    if ((m_DockingHintSide & eDockingHintSide.Top) == eDockingHintSide.Top)
                    {
                        g.DrawImage(GetImageGuideTop(), m_TopHint.GetBounds());
                    }
                    if ((m_DockingHintSide & eDockingHintSide.Bottom) == eDockingHintSide.Bottom)
                    {
                        g.DrawImage(GetImageGuideBottom(), m_BottomHint.GetBounds());
                    }
                    else
                        g.FillRectangle(brush, 33, 84, 23, 26);
                }
                if (m_MouseOverHintSide == eMouseOverHintSide.Left)
                {
                    if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style)) 
                    {
                        Rectangle hintRect;
                        if (m_MiddleDockHint)
                            hintRect = new Rectangle(4, 40, 32, 32);
                        else
                            hintRect = new Rectangle(4, 4, 32, 32);
                        using (GraphicsPath mp = DisplayHelp.GetRoundedRectanglePath(hintRect, 1))
                        {
                            using(SolidBrush brush2=CreateOverlayMouseOverBrush())
                                g.FillPath(brush2, mp);
                        }
                    }
                    else
                    {
                        RectangleF r = m_LeftHint.GetBounds();
                        if (m_MiddleDockHint)
                        {
                            r.Inflate(0, -6);
                            r.Width -= 6;
                        }
                        g.DrawLine(pen, r.X, r.Y, r.Right, r.Y);
                        g.DrawLine(pen, r.X, r.Y, r.X, r.Bottom);
                        g.DrawLine(pen, r.X, r.Bottom - 1, r.Right, r.Bottom - 1);
                    }
                }
                if (m_MouseOverHintSide == eMouseOverHintSide.Right)
                {
                    if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    {
                        Rectangle hintRect;
                        if (m_MiddleDockHint)
                            hintRect = new Rectangle(76, 40, 32, 32);
                        else
                            hintRect = new Rectangle(4, 4, 32, 32);
                        using (GraphicsPath mp = DisplayHelp.GetRoundedRectanglePath(hintRect, 1))
                        {
                            using (SolidBrush brush2 = CreateOverlayMouseOverBrush())
                                g.FillPath(brush2, mp);
                        }
                    }
                    else
                    {
                        RectangleF r = m_RightHint.GetBounds();
                        if (m_MiddleDockHint)
                        {
                            r.Inflate(0, -6);
                            r.Width -= 6;
                            r.X += 6;
                        }
                        g.DrawLine(pen, r.X, r.Y, r.Right, r.Y);
                        g.DrawLine(pen, r.Right - 1, r.Y, r.Right - 1, r.Bottom);
                        g.DrawLine(pen, r.X, r.Bottom - 1, r.Right, r.Bottom - 1);
                    }
                }
                if (m_MouseOverHintSide == eMouseOverHintSide.Top)
                {
                    if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    {
                        Rectangle hintRect;
                        if (m_MiddleDockHint)
                            hintRect = new Rectangle(40, 4, 32, 32);
                        else
                            hintRect = new Rectangle(4, 4, 32, 32);
                        using (GraphicsPath mp = DisplayHelp.GetRoundedRectanglePath(hintRect, 1))
                        {
                            using (SolidBrush brush2 = CreateOverlayMouseOverBrush())
                                g.FillPath(brush2, mp);
                        }
                    }
                    else
                    {
                        RectangleF r = m_TopHint.GetBounds();
                        if (m_MiddleDockHint)
                        {
                            r.Inflate(-6, 0);
                            r.Height -= 6;
                        }
                        g.DrawLine(pen, r.X, r.Y, r.Right, r.Y);
                        g.DrawLine(pen, r.Right - 1, r.Y, r.Right - 1, r.Bottom);
                        g.DrawLine(pen, r.X, r.Y, r.X, r.Bottom);
                    }
                }
                if (m_MouseOverHintSide == eMouseOverHintSide.Bottom)
                {
                    if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    {
                        Rectangle hintRect;
                        if (m_MiddleDockHint)
                            hintRect = new Rectangle(40, 76, 32, 32);
                        else
                            hintRect = new Rectangle(4, 4, 32, 32);
                        using (GraphicsPath mp = DisplayHelp.GetRoundedRectanglePath(hintRect, 1))
                        {
                            using (SolidBrush brush2 = CreateOverlayMouseOverBrush())
                                g.FillPath(brush2, mp);
                        }
                    }
                    else
                    {
                        RectangleF r = m_BottomHint.GetBounds();
                        if (m_MiddleDockHint)
                        {
                            r.Inflate(-6, 0);
                            r.Height -= 6;
                            r.Y += 6;
                        }
                        g.DrawLine(pen, r.X, r.Bottom - 1, r.Right, r.Bottom - 1);
                        g.DrawLine(pen, r.Right - 1, r.Y, r.Right - 1, r.Bottom);
                        g.DrawLine(pen, r.X, r.Y, r.X, r.Bottom);
                    }
                }
                if (m_MouseOverHintSide == eMouseOverHintSide.DockTab)
                {
                    if ((_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style)) && m_MiddleDockHint)
                    {
                        Rectangle hintRect = new Rectangle(40, 40, 32, 32);
                        using (GraphicsPath mp = DisplayHelp.GetRoundedRectanglePath(hintRect, 1))
                        {
                            using (SolidBrush brush2 = CreateOverlayMouseOverBrush())
                                g.FillPath(brush2, mp);
                        }
                    }
                }
                
            }
            finally
            {
                brush.Dispose();
                pen.Dispose();
            }
        }
        public GraphicsPath GetHintPath(eDockingHintSide hintSide)
        {
            // Create top hint path then rotate depending on desired side
            GraphicsPath path = new GraphicsPath();
            if (hintSide == eDockingHintSide.DockTab)
            {
                if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                    path.AddRectangle(new Rectangle(40, 40, 32, 32));
                else
                    path.AddRectangle(new Rectangle(29, 29, 29, 29));
            }
            else
            {
                path.StartFigure();
                if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                {
                    //path.AddLine(26, 36, 36, 26);
                    //path.AddLine(36, 0, 76, 0);
                    //path.AddLine(76, 26, 86, 36);
                    path.AddLine(27, 35, 36, 26);
                    path.AddLine(36, 0, 76, 0);
                    path.AddLine(76, 26, 86, 35);
                }
                else
                {
                    path.AddLine(23, 28, 28, 23);
                    path.AddLine(29, 23, 29, 0);
                    path.AddLine(57, 0, 57, 23);
                    path.AddLine(58, 23, 63, 28);
                }
            }
            switch (hintSide)
            {
                case eDockingHintSide.Bottom:
                    {
                        using (Matrix matrix = new Matrix())
                        {
                            matrix.Rotate(180);
                            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                                matrix.Translate(-path.GetBounds().Width * 2 + 6, -path.GetBounds().Height * 2 - 42);
                            else
                                matrix.Translate(-path.GetBounds().Width * 2 - 6, -path.GetBounds().Height * 2 - 30);
                            path.Transform(matrix);
                        }
                        break;
                    }
                case eDockingHintSide.Left:
                    {
                        using (Matrix matrix = new Matrix())
                        {
                            matrix.Rotate(-90);
                            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                                matrix.Translate(-53, 0);
                            else
                                matrix.Translate(-46, 0);
                            path.Transform(matrix);
                            matrix.Reset();
                            matrix.Translate(0, path.GetBounds().Height);
                            path.Transform(matrix);
                        }
                        break;
                    }
                case eDockingHintSide.Right:
                    {
                        using (Matrix matrix = new Matrix())
                        {
                            matrix.Rotate(90);
                            path.Transform(matrix);
                            matrix.Reset();
                            if (_Style == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(_Style))
                                matrix.Translate(path.GetBounds().Width * 2 + 42, 0);
                            else
                                matrix.Translate(path.GetBounds().Width * 2 + 30, 0);
                            path.Transform(matrix);
                        }
                        break;
                    }
            }
            return path;
        }
        internal eMouseOverHintSide ExMouseMove(int x, int y)
        {
            if (this.Bounds.Contains(x, y))
            {
                Point p = this.PointToClient(new Point(x, y));
                if (m_LeftHint != null && m_LeftHint.IsVisible(p))
                {
                    this.MouseOverHintSide = eMouseOverHintSide.Left;
                }
                else if (m_RightHint != null && m_RightHint.IsVisible(p))
                {
                    this.MouseOverHintSide = eMouseOverHintSide.Right;
                }
                else if (m_TopHint != null && m_TopHint.IsVisible(p))
                {
                    this.MouseOverHintSide = eMouseOverHintSide.Top;
                }
                else if (m_BottomHint != null && m_BottomHint.IsVisible(p))
                {
                    this.MouseOverHintSide = eMouseOverHintSide.Bottom;
                }
                else if (m_DockTabHint != null && m_DockTabHint.IsVisible(p) && ((m_DockingHintSide & eDockingHintSide.DockTab) == eDockingHintSide.DockTab))
                {
                    this.MouseOverHintSide = eMouseOverHintSide.DockTab;
                }
                else
                    this.MouseOverHintSide = eMouseOverHintSide.None;
            }
            else
                this.MouseOverHintSide = eMouseOverHintSide.None;
            this.ProcessPendingRefresh();
            return this.MouseOverHintSide;
        }
        private eMouseOverHintSide MouseOverHintSide
        {
            get { return m_MouseOverHintSide; }
            set
            {
                if (m_MouseOverHintSide != value)
                {
                    m_MouseOverHintSide = value;
                    m_PendingRefresh = true;
                }
            }
        }
        private void ProcessPendingRefresh()
        {
            if (m_PendingRefresh)
            {
                m_PendingRefresh = false;
                this.Refresh();
            }
        }
        public eDockingHintSide DockingHintSides
        {
            get { return m_DockingHintSide; }
            set
            {
                if (m_DockingHintSide != value)
                {
                    m_DockingHintSide = value;
                    UpdateControlRegion();
                    if (this.IsHandleCreated)
                        this.Refresh();
                }
            }
        }
        public bool MiddleDockHint
        {
            get { return m_MiddleDockHint; }
            set { m_MiddleDockHint = value; }
        }
        #endregion
        #region Windows Form Designer generated code
        /// 
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// 
        private void InitializeComponent()
        {
            // 
            // DockingHint
            // 
            //			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            //			this.ClientSize = new System.Drawing.Size(24, 24);
            this.ControlBox = false;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.MinimizeBox = false;
            this.MaximizeBox = false;
            this.ControlBox = false;
            this.Name = "DockingHint";
            this.Text = "";
            this.ShowInTaskbar = false;
            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
            this.StartPosition = FormStartPosition.Manual;
        }
        #endregion
    }
}