public override void OnRenderRibbonPanelBackground(RibbonPanelRenderEventArgs e)
 {
     if (e.Panel.OverflowMode && !(e.Canvas is RibbonPanelPopup))
     {
         if (e.Panel.Pressed)
         {
             DrawPanelOverflowPressed(e);
         }
         else if (e.Panel.Selected)
         {
             DrawPannelOveflowSelected(e);
         }
         else
         {
             DrawPanelOverflowNormal(e);
         }
     }
     else
     {
         if (e.Panel.Selected)
         {
             DrawPanelSelected(e);
         }
         else
         {
             DrawPanelNormal(e);
         }
     }
 }
        public override void OnRenderRibbonPanelText(RibbonPanelRenderEventArgs e)
        {
            if (e.Panel.OverflowMode && !(e.Canvas is RibbonPanelPopup))
            {
                return;
            }

            var textArea =
                Rectangle.FromLTRB(
                    e.Panel.Bounds.Left + 1,
                    e.Panel.ContentBounds.Bottom,
                    e.Panel.Bounds.Right - 1,
                    e.Panel.Bounds.Bottom - 1);

            var sf = new StringFormat {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center};

            using (Brush b = new SolidBrush(GetTextColor(e.Panel.Enabled, ColorTable.PanelText)))
            {
                e.Graphics.DrawString(e.Panel.Text, e.Ribbon.Font, b, textArea, sf);
            }
        }
        /// <summary>
        /// Draws a panel in selected state
        /// </summary>
        /// <param name="e"></param>
        public void DrawPanelSelected(RibbonPanelRenderEventArgs e)
        {
            var darkBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left,
                e.Panel.Bounds.Top,
                e.Panel.Bounds.Right,
                e.Panel.Bounds.Bottom);

            var lightBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left + 1,
                e.Panel.Bounds.Top + 1,
                e.Panel.Bounds.Right - 1,
                e.Panel.Bounds.Bottom - 1);

            var textArea =
                Rectangle.FromLTRB(
                    e.Panel.Bounds.Left + 1,
                    e.Panel.ContentBounds.Bottom,
                    e.Panel.Bounds.Right - 1,
                    e.Panel.Bounds.Bottom - 1);

            var dark = RoundRectangle(darkBorder, 3);
            var light = RoundRectangle(lightBorder, 3);
            var txt = RoundRectangle(textArea, 3, Corners.SouthEast | Corners.SouthWest);

            using (var p = new Pen(ColorTable.PanelLightBorder))
            {
                e.Graphics.DrawPath(p, light);
            }

            using (var p = new Pen(ColorTable.PanelDarkBorder))
            {
                e.Graphics.DrawPath(p, dark);
            }

            using (var b = new SolidBrush(ColorTable.PanelBackgroundSelected))
            {
                e.Graphics.FillPath(b, light);
            }

            using (var b = new SolidBrush(ColorTable.PanelTextBackgroundSelected))
            {
                e.Graphics.FillPath(b, txt);
            }

            if (e.Panel.ButtonMoreVisible)
            {
                if (e.Panel.ButtonMorePressed)
                {
                    DrawButtonPressed(e.Graphics, e.Panel.ButtonMoreBounds, Corners.SouthEast);
                }
                else if(e.Panel.ButtonMoreSelected)
                {
                    DrawButtonSelected(e.Graphics, e.Panel.ButtonMoreBounds, Corners.SouthEast);
                }

                DrawButtonMoreGlyph(e.Graphics, e.Panel.ButtonMoreBounds, e.Panel.ButtonMoreEnabled && e.Panel.Enabled);
            }

            txt.Dispose();
            dark.Dispose();
            light.Dispose();
        }
        /// <summary>
        /// Draws an overflown panel in selected state
        /// </summary>
        /// <param name="e"></param>
        public void DrawPannelOveflowSelected(RibbonPanelRenderEventArgs e)
        {
            var darkBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left,
                e.Panel.Bounds.Top,
                e.Panel.Bounds.Right,
                e.Panel.Bounds.Bottom);

            var lightBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left + 1,
                e.Panel.Bounds.Top + 1,
                e.Panel.Bounds.Right - 1,
                e.Panel.Bounds.Bottom - 1);

            var dark = RoundRectangle(darkBorder, 3);
            var light = RoundRectangle(lightBorder, 3);

            using (var p = new Pen(ColorTable.PanelLightBorder))
            {
                e.Graphics.DrawPath(p, light);
            }

            using (var p = new Pen(ColorTable.PanelDarkBorder))
            {
                e.Graphics.DrawPath(p, dark);
            }

            using (var b = new LinearGradientBrush(
                lightBorder, ColorTable.PanelOverflowBackgroundSelectedNorth, Color.Transparent, 90))
            {
                e.Graphics.FillPath(b, light);
            }

            DrawPanelOverflowImage(e);

            dark.Dispose();
            light.Dispose();
        }
        /// <summary>
        /// Draws an overflown panel in pressed state
        /// </summary>
        /// <param name="e"></param>
        public void DrawPanelOverflowPressed(RibbonPanelRenderEventArgs e)
        {
            var darkBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left,
                e.Panel.Bounds.Top,
                e.Panel.Bounds.Right,
                e.Panel.Bounds.Bottom);

            var lightBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left + 1,
                e.Panel.Bounds.Top + 1,
                e.Panel.Bounds.Right - 1,
                e.Panel.Bounds.Bottom - 1);

            var glossy = Rectangle.FromLTRB(
                e.Panel.Bounds.Left,
                e.Panel.Bounds.Top,
                e.Panel.Bounds.Right,
                e.Panel.Bounds.Top + 17);

            var dark = RoundRectangle(darkBorder, 3);
            var light = RoundRectangle(lightBorder, 3);

            using (var b = new LinearGradientBrush(lightBorder,
                                                   ColorTable.PanelOverflowBackgroundPressed,
                                                   ColorTable.PanelOverflowBackgroundSelectedSouth, 90))
            {
                b.WrapMode = WrapMode.TileFlipXY;
                e.Graphics.FillPath(b, dark);
            }

            using (var path = RoundRectangle(glossy, 3, Corners.NorthEast | Corners.NorthWest))
            {
                using (var b = new LinearGradientBrush(
                    glossy,
                    Color.FromArgb(150, Color.White),
                    Color.FromArgb(50, Color.White), 90
                    ))
                {
                    b.WrapMode = WrapMode.TileFlipXY;
                    e.Graphics.FillPath(b, path);
                }
            }

            using (var p = new Pen(Color.FromArgb(40, Color.White)))
            {
                e.Graphics.DrawPath(p, light);
            }

            using (var p = new Pen(ColorTable.PanelDarkBorder))
            {
                e.Graphics.DrawPath(p, dark);
            }

            DrawPanelOverflowImage(e);

            DrawPressedShadow(e.Graphics, glossy);

            dark.Dispose();
            light.Dispose();
        }
        /// <summary>
        /// Draws an overflown panel in normal state
        /// </summary>
        /// <param name="e"></param>
        public void DrawPanelOverflowNormal(RibbonPanelRenderEventArgs e)
        {
            var darkBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left,
                e.Panel.Bounds.Top,
                e.Panel.Bounds.Right,
                e.Panel.Bounds.Bottom);

            var lightBorder = Rectangle.FromLTRB(
                e.Panel.Bounds.Left + 1,
                e.Panel.Bounds.Top + 1,
                e.Panel.Bounds.Right - 1,
                e.Panel.Bounds.Bottom - 1);

            var dark = RoundRectangle(darkBorder, 3);
            var light = RoundRectangle(lightBorder, 3);

            using (var p = new Pen(ColorTable.PanelLightBorder))
            {
                e.Graphics.DrawPath(p, light);
            }

            using (var p = new Pen(ColorTable.PanelDarkBorder))
            {
                e.Graphics.DrawPath(p, dark);
            }

            DrawPanelOverflowImage(e);

            dark.Dispose();
            light.Dispose();
        }
        /// <summary>
        /// Draws the image of the panel when collapsed
        /// </summary>
        /// <param name="e"></param>
        public void DrawPanelOverflowImage(RibbonPanelRenderEventArgs e)
        {
            const int margin = 3;
            var imgSquareSize = new Size(32, 32);
            var imgSquareR = new Rectangle(new Point(
                                               e.Panel.Bounds.Left + (e.Panel.Bounds.Width - imgSquareSize.Width) / 2,
                                               e.Panel.Bounds.Top+ 5), imgSquareSize);

            var imgSquareBottomR = Rectangle.FromLTRB(
                imgSquareR.Left, imgSquareR.Bottom - 10, imgSquareR.Right, imgSquareR.Bottom);

            var textR = Rectangle.FromLTRB(
                e.Panel.Bounds.Left + margin,
                imgSquareR.Bottom + margin,
                e.Panel.Bounds.Right - margin,
                e.Panel.Bounds.Bottom - margin);

            var imgSq = RoundRectangle(imgSquareR, 5);
            var imgSqB = RoundRectangle(imgSquareBottomR, 5, Corners.South);

            using (var b = new LinearGradientBrush(
                imgSquareR, ColorTable.TabContentNorth, ColorTable.TabContentSouth, 90
                ))
            {
                e.Graphics.FillPath(b, imgSq);
            }

            using (var b = new SolidBrush(ColorTable.PanelTextBackground))
            {
                e.Graphics.FillPath(b, imgSqB);
            }

            using (var p = new Pen(ColorTable.PanelDarkBorder))
            {
                e.Graphics.DrawPath(p, imgSq);
            }

            if (e.Panel.Image != null)
            {
                e.Graphics.DrawImage(e.Panel.Image,
                                     new Point(
                                         imgSquareR.Left + (imgSquareR.Width - e.Panel.Image.Width) / 2,
                                         imgSquareR.Top + ((imgSquareR.Height - imgSquareBottomR.Height) - e.Panel.Image.Height) / 2));

            }

            using (var b = new SolidBrush(GetTextColor(e.Panel.Enabled)))
            {
                var sf = new StringFormat
                             {
                                 Alignment = StringAlignment.Center,
                                 LineAlignment = StringAlignment.Near,
                                 Trimming = StringTrimming.Character
                             };

                e.Graphics.DrawString(e.Panel.Text, e.Ribbon.Font, b, textR, sf);
            }

            var bounds = LargeButtonDropDownArrowBounds(e.Graphics, e.Panel.Owner.Font, e.Panel.Text, textR);

            if (bounds.Right < e.Panel.Bounds.Right)
            {

                var boundsLight = bounds; boundsLight.Offset(0, 1);

                var lt = ColorTable.ArrowLight;
                var dk = ColorTable.Arrow;

                DrawArrow(e.Graphics, boundsLight, lt, RibbonArrowDirection.Down);
                DrawArrow(e.Graphics, bounds, dk, RibbonArrowDirection.Down);

            }
            imgSq.Dispose();
            imgSqB.Dispose();
        }
 /// <summary>
 /// Renders the text of the specified panel
 /// </summary>
 /// <param name="e">Event data and paint tools</param>
 public virtual void OnRenderRibbonPanelText(RibbonPanelRenderEventArgs e)
 {
 }
 /// <summary>
 /// Renders the background of the specified ribbon panel
 /// </summary>
 /// <param name="e">Event data and paint tools</param>
 public virtual void OnRenderRibbonPanelBackground(RibbonPanelRenderEventArgs e)
 {
 }