using System; using System.Collections.Generic; using System.Text; using DevComponents.DotNetBar.Metro.ColorTables; using System.Drawing; using System.Drawing.Drawing2D; namespace DevComponents.DotNetBar.Metro.Rendering { internal class MetroTabStripPainter : MetroRenderer { public override void Render(MetroRendererInfo renderingInfo) { MetroTabStrip strip = (MetroTabStrip)renderingInfo.Control; Graphics g = renderingInfo.PaintEventArgs.Graphics; MetroTabStripColorTable ct = renderingInfo.ColorTable.MetroTab.TabStrip; Rectangle bounds = strip.ClientRectangle; if (ct.BackgroundStyle != null) { ElementStyleDisplayInfo di = new ElementStyleDisplayInfo(ct.BackgroundStyle, g, bounds); ElementStyleDisplay.PaintBackground(di); } if (strip.CaptionVisible) { if (strip.CaptionBounds.IsEmpty || strip.SystemCaptionItemBounds.IsEmpty || strip.QuickToolbarBounds.IsEmpty) SetQatAndCaptionItemBounds(strip, renderingInfo); Color captionTextColor = renderingInfo.ColorTable.MetroTab.ActiveCaptionText; eTextFormat textFormat = renderingInfo.ColorTable.MetroTab.CaptionTextFormat; System.Windows.Forms.Form form = strip.FindForm(); bool isFormActive = true; if (form != null && (form != System.Windows.Forms.Form.ActiveForm && form.MdiParent == null || form.MdiParent != null && form.MdiParent.ActiveMdiChild != form)) { captionTextColor = renderingInfo.ColorTable.MetroTab.InactiveCaptionText; isFormActive = false; } Font font = SystemFonts.DefaultFont; // System.Windows.Forms.SystemInformation.MenuFont; bool disposeFont = true; if (strip.CaptionFont != null) { font.Dispose(); font = strip.CaptionFont; disposeFont = false; } string text = strip.TitleText; if (string.IsNullOrEmpty(text) && form != null) text = form.Text; bool isTitleTextMarkup = strip.TitleTextMarkupBody != null; Rectangle captionRect = strip.CaptionBounds; const int CAPTION_TEXT_PADDING = 12; captionRect.X += CAPTION_TEXT_PADDING; captionRect.Width -= CAPTION_TEXT_PADDING; if(StyleManager.Style == eStyle.OfficeMobile2014) { captionRect.Y -= 2; captionRect.Height -= 2; // Center text in center of window instead of center of available space if (!strip.SystemCaptionItemBounds.IsEmpty && captionRect.Width > strip.SystemCaptionItemBounds.Width) { captionRect.X += strip.SystemCaptionItemBounds.Width / 2 + 18; captionRect.Width -= strip.SystemCaptionItemBounds.Width / 2 +18; } if (!strip.QuickToolbarBounds.IsEmpty && captionRect.Width > strip.QuickToolbarBounds.Width) { captionRect.X -= strip.QuickToolbarBounds.Width / 2; captionRect.Width += strip.QuickToolbarBounds.Width / 2; } } if (!isTitleTextMarkup) TextDrawing.DrawString(g, text, font, captionTextColor, captionRect, textFormat); else { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, captionTextColor, strip.RightToLeft == System.Windows.Forms.RightToLeft.Yes, captionRect, false); d.AllowMultiLine = false; d.IgnoreFormattingColors = !isFormActive; TextMarkup.BodyElement body = strip.TitleTextMarkupBody; if (strip.TitleTextMarkupLastArrangeBounds != captionRect) { body.Measure(captionRect.Size, d); body.Arrange(captionRect, d); strip.TitleTextMarkupLastArrangeBounds = captionRect; Rectangle mr = body.Bounds; if (mr.Width < captionRect.Width) mr.Offset((captionRect.Width - mr.Width) / 2, 0); if (mr.Height < captionRect.Height) mr.Offset(0, (captionRect.Height - mr.Height) / 2); body.Bounds = mr; } Region oldClip = g.Clip; g.SetClip(captionRect, CombineMode.Intersect); body.Render(d); g.Clip = oldClip; if (oldClip != null) oldClip.Dispose(); } if (disposeFont) font.Dispose(); } //g.FillRectangle(Brushes.Yellow, strip.QuickToolbarBounds); //g.FillRectangle(Brushes.Green, strip.CaptionBounds); //g.FillRectangle(Brushes.Indigo, strip.SystemCaptionItemBounds); } private void SetQatAndCaptionItemBounds(MetroTabStrip strip,MetroRendererInfo renderingInfo) { if (!strip.CaptionVisible) return; bool rightToLeft = (strip.RightToLeft == System.Windows.Forms.RightToLeft.Yes); System.Windows.Forms.Form form = strip.FindForm(); bool isMaximized = false; if (form != null) isMaximized = form.WindowState == System.Windows.Forms.FormWindowState.Maximized; // Get right most X position of the Quick Access Toolbar int right = 0, sysLeft = 0; Size qatSize = Size.Empty; for (int i = strip.QuickToolbarItems.Count - 1; i >= 0; i--) { BaseItem item = strip.QuickToolbarItems[i]; if (!item.Visible || !item.Displayed) continue; if (item is QatCustomizeItem) qatSize = item.DisplayRectangle.Size; if (item.ItemAlignment == eItemAlignment.Near && item.Visible && i > 0) { if (rightToLeft) right = item.DisplayRectangle.X; else right = item.DisplayRectangle.Right; break; } else if (item.ItemAlignment == eItemAlignment.Far && item.Visible) { if (rightToLeft) sysLeft = item.DisplayRectangle.Right; else sysLeft = item.DisplayRectangle.X; } } if (strip.CaptionContainerItem is CaptionItemContainer && ((CaptionItemContainer)strip.CaptionContainerItem).MoreItems != null) { if (rightToLeft) right = ((CaptionItemContainer)strip.CaptionContainerItem).MoreItems.DisplayRectangle.X; else right = ((CaptionItemContainer)strip.CaptionContainerItem).MoreItems.DisplayRectangle.Right; qatSize = ((CaptionItemContainer)strip.CaptionContainerItem).MoreItems.DisplayRectangle.Size; } Rectangle r = new Rectangle(right, 2, strip.CaptionContainerItem.WidthInternal - right - (strip.CaptionContainerItem.WidthInternal-sysLeft), strip.GetTotalCaptionHeight()); strip.CaptionBounds = r; if (sysLeft > 0) { if (rightToLeft) strip.SystemCaptionItemBounds = new Rectangle(r.X, r.Y, sysLeft, r.Height); else strip.SystemCaptionItemBounds = new Rectangle(sysLeft, r.Y, strip.CaptionContainerItem.WidthInternal - sysLeft, r.Height); } if (right == 0 || r.Height <= 0 || r.Width <= 0) return; BaseItem startButton = strip.GetApplicationButton(); if (startButton != null) { int startIndex = strip.QuickToolbarItems.IndexOf(startButton); if (strip.QuickToolbarItems.Count - 1 > startIndex) { BaseItem firstItem = strip.QuickToolbarItems[startIndex + 1]; if (rightToLeft) { r.Width -= r.Right - firstItem.DisplayRectangle.Right; } else { r.Width -= firstItem.DisplayRectangle.X - r.X; r.X = firstItem.DisplayRectangle.X; } } } r.Height = ((CaptionItemContainer)strip.CaptionContainerItem).MaxItemHeight + 6; r.X = 0; r.Width = right; strip.QuickToolbarBounds = r; } //private void PaintCaptionText(MetroTabStrip rs) //{ // if (!rs.CaptionVisible || rs.CaptionBounds.IsEmpty) // return; // Graphics g = e.Graphics; // bool isMaximized = false; // bool isFormActive = true; // Rendering.Office2007FormStateColorTable formct = m_ColorTable.Form.Active; // System.Windows.Forms.Form form = rs.FindForm(); // if (form != null && (form != System.Windows.Forms.Form.ActiveForm && form.MdiParent == null || // form.MdiParent != null && form.MdiParent.ActiveMdiChild != form)) // { // formct = m_ColorTable.Form.Inactive; // isFormActive = false; // } // string text = e.RibbonControl.TitleText; // string plainText = text; // bool isTitleTextMarkup = e.RibbonControl.RibbonStrip.TitleTextMarkupBody != null; // if (isTitleTextMarkup) // plainText = e.RibbonControl.RibbonStrip.TitleTextMarkupBody.PlainText; // if (form != null) // { // if (text == "") // { // text = form.Text; // plainText = text; // } // isMaximized = form.WindowState == System.Windows.Forms.FormWindowState.Maximized; // } // Rectangle captionRect = rs.CaptionBounds; // // Exclude quick access toolbar if any // if (!rs.QuickToolbarBounds.IsEmpty) // DisplayHelp.ExcludeEdgeRect(ref captionRect, rs.QuickToolbarBounds); // else // { // BaseItem sb = e.RibbonControl.GetApplicationButton(); // if (sb != null && sb.Visible && sb.Displayed) // DisplayHelp.ExcludeEdgeRect(ref captionRect, sb.Bounds); // else // DisplayHelp.ExcludeEdgeRect(ref captionRect, new Rectangle(0, 0, 22, 22)); // The system button in top-left corner // } // if (!rs.SystemCaptionItemBounds.IsEmpty) // DisplayHelp.ExcludeEdgeRect(ref captionRect, rs.SystemCaptionItemBounds); // // Array of the rectangles after they are split // ArrayList rects = new ArrayList(5); // ArrayList tempRemoveList = new ArrayList(5); // // Exclude Context Tabs Captions if any // if (rs.TabGroupsVisible) // { // foreach (RibbonTabItemGroup group in rs.TabGroups) // { // foreach (Rectangle r in group.DisplayPositions) // { // if (rects.Count > 0) // { // tempRemoveList.Clear(); // Rectangle[] arrCopy = new Rectangle[rects.Count]; // rects.CopyTo(arrCopy); // for (int irc = 0; irc < arrCopy.Length; irc++) // { // if (arrCopy[irc].IntersectsWith(r)) // { // tempRemoveList.Add(irc); // Rectangle[] splitRects = DisplayHelp.ExcludeRectangle(arrCopy[irc], r); // rects.AddRange(splitRects); // } // } // foreach (int idx in tempRemoveList) // rects.RemoveAt(idx); // } // else // { // if (r.IntersectsWith(captionRect)) // { // Rectangle[] splitRects = DisplayHelp.ExcludeRectangle(captionRect, r); // if (splitRects.Length > 0) // { // rects.AddRange(splitRects); // break; // } // } // } // } // } // } // Font font = System.Windows.Forms.SystemInformation.MenuFont; // bool disposeFont = true; // if (rs.CaptionFont != null) // { // font.Dispose(); // font = rs.CaptionFont; // disposeFont = false; // } // Size textSize = Size.Empty; // if (isTitleTextMarkup) // { // textSize = e.RibbonControl.RibbonStrip.TitleTextMarkupBody.Bounds.Size; // } // else // { // textSize = TextDrawing.MeasureString(g, plainText, font); // } // if (rects.Count > 0) // { // rs.CaptionTextBounds = (Rectangle[])rects.ToArray(typeof(Rectangle)); // if (e.RibbonControl.RightToLeft == System.Windows.Forms.RightToLeft.No) // rects.Reverse(); // captionRect = Rectangle.Empty; // foreach (Rectangle r in rects) // { // if (r.Width >= textSize.Width) // { // captionRect = r; // break; // } // else if (r.Width > captionRect.Width) // captionRect = r; // } // } // else // rs.CaptionTextBounds = new Rectangle[] { captionRect }; // if (captionRect.Width > 6 && captionRect.Height > 6) // { // if (e.GlassEnabled && e.ItemPaintArgs != null && e.ItemPaintArgs.ThemeWindow != null && !e.RibbonControl.IsDesignMode) // { // if (!e.ItemPaintArgs.CachedPaint || isMaximized) // PaintGlassText(g, plainText, font, captionRect, isMaximized); // } // else // { // if (!isTitleTextMarkup) // TextDrawing.DrawString(g, plainText, font, formct.CaptionText, captionRect, eTextFormat.VerticalCenter | eTextFormat.HorizontalCenter | eTextFormat.EndEllipsis | eTextFormat.NoPrefix); // else // { // TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, formct.CaptionText, e.RibbonControl.RightToLeft == System.Windows.Forms.RightToLeft.Yes, captionRect, false); // d.AllowMultiLine = false; // d.IgnoreFormattingColors = !isFormActive; // TextMarkup.BodyElement body = e.RibbonControl.RibbonStrip.TitleTextMarkupBody; // if (e.RibbonControl.RibbonStrip.TitleTextMarkupLastArrangeBounds != captionRect) // { // body.Measure(captionRect.Size, d); // body.Arrange(captionRect, d); // e.RibbonControl.RibbonStrip.TitleTextMarkupLastArrangeBounds = captionRect; // Rectangle mr = body.Bounds; // if (mr.Width < captionRect.Width) // mr.Offset((captionRect.Width - mr.Width) / 2, 0); // if (mr.Height < captionRect.Height) // mr.Offset(0, (captionRect.Height - mr.Height) / 2); // body.Bounds = mr; // } // Region oldClip = g.Clip; // g.SetClip(captionRect, CombineMode.Intersect); // body.Render(d); // g.Clip = oldClip; // if (oldClip != null) oldClip.Dispose(); // } // } // } // if (disposeFont) font.Dispose(); //} } }