using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms.Design.Behavior; namespace System.Windows.Forms { public class RibbonTabGlyph : Glyph { private readonly BehaviorService _behaviorService; private readonly Ribbon _ribbon; private RibbonDesigner _componentDesigner; private Rectangle _bounds; public RibbonTabGlyph(BehaviorService behaviorService, RibbonDesigner designer, Ribbon ribbon) : base(new RibbonTabGlyphBehavior(designer, ribbon)) { _behaviorService = behaviorService; _componentDesigner = designer; _ribbon = ribbon; } public override Rectangle Bounds { get { Point edge = _behaviorService.ControlToAdornerWindow(_ribbon); _bounds = new Rectangle(5, _ribbon.OrbBounds.Bottom + 5, 60, 16); //If ribbon has tabs if (_ribbon.Tabs.Count > 0) { //Place glyph next to the last tab RibbonTab t = _ribbon.Tabs[_ribbon.Tabs.Count - 1]; _bounds = _ribbon.LayoutHelper.CalcNewPosition(t.Bounds, _bounds, LayoutHelper.RTLLayoutPosition.Far, 5); _bounds.Y = t.Bounds.Top + 2; } //If ribbon has contexts foreach (RibbonContext item in _ribbon.Contexts) { // Contexts not used on a RibbonTab will appear at the end of the tabs if (item.ContextualTabsCount == 0) { //Place glyph next to the last tab _bounds = _ribbon.LayoutHelper.CalcNewPosition(item.Bounds, _bounds, LayoutHelper.RTLLayoutPosition.Far, 5); } } _bounds.Offset(edge); return _bounds; } } public override Cursor GetHitTest(Point p) { if (Bounds.Contains(p)) { return Cursors.Hand; } return null; } public override void Paint(PaintEventArgs pe) { SmoothingMode smbuff = pe.Graphics.SmoothingMode; pe.Graphics.SmoothingMode = SmoothingMode.AntiAlias; using (GraphicsPath p = RibbonProfessionalRenderer.RoundRectangle(Bounds, 2)) { using (SolidBrush b = new SolidBrush(Color.FromArgb(50, Color.Blue))) { pe.Graphics.FillPath(b, p); } } StringFormat sf = StringFormatFactory.Center(); pe.Graphics.DrawString("Add Tab", SystemFonts.DefaultFont, Brushes.White, Bounds, sf); pe.Graphics.SmoothingMode = smbuff; } } public class RibbonTabGlyphBehavior : Behavior { private readonly RibbonDesigner _designer; public RibbonTabGlyphBehavior(RibbonDesigner designer, Ribbon ribbon) { _designer = designer; } public override bool OnMouseUp(Glyph g, MouseButtons button) { _designer.AddTabVerb(this, EventArgs.Empty); return base.OnMouseUp(g, button); } } }