using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Text; using System.Windows.Forms; using DevComponents.DotNetBar.Rendering; using DevComponents.DotNetBar.Ribbon; namespace DevComponents.DotNetBar { /// /// Summary description for Office2003ButtonItemPainter. /// internal class Office2003ButtonItemPainter:ButtonItemPainter { protected virtual Color GetTextColor(ButtonItem button, ItemPaintArgs pa) { return ButtonItemPainterHelper.GetTextColor(button, pa); } protected virtual Rectangle GetDisplayRectangle(ButtonItem button) { return button.DisplayRectangle; } public override void PaintButton(ButtonItem button, ItemPaintArgs pa) { bool isOnMenu=IsOnMenu(button, pa); if(isOnMenu && button.Parent is ItemContainer) isOnMenu=false; bool bIsOnMenuBar=pa.IsOnMenuBar; bool bThemed=button.IsThemed; Graphics g = pa.Graphics; Region oldClip = g.Clip as Region; Rectangle itemRect = GetDisplayRectangle(button); try { g.SetClip(itemRect, CombineMode.Intersect); if (!pa.IsOnMenu && !bIsOnMenuBar && bThemed) { if (pa.ContainerControl is ButtonX) ThemedButtonXPainter.PaintButton(button, pa); else ThemedButtonItemPainter.PaintButton(button, pa); return; } Color textColor = GetTextColor(button, pa); CompositeImage image = button.GetImage(textColor); Rectangle imageRect = GetImageRectangle(button, pa, image); PaintButtonBackground(button, pa, image); Rectangle customizeCheckRect = GetCustomizeMenuCheckRectangle(button, pa); Rectangle checkRect = GetCheckRectangle(button, pa, image); Rectangle mouseOverRect = GetMouseOverRectangle(button, pa, image); bool mouseOver = button.IsMouseOver; if (button.Expanded && !isOnMenu) mouseOver = false; if (isOnMenu && button.Expanded && pa.ContainerControl != null && pa.ContainerControl.Parent != null) { if (!pa.ContainerControl.Parent.Bounds.Contains(System.Windows.Forms.Control.MousePosition)) mouseOver = true; } if (button.HotTrackingStyle != eHotTrackingStyle.None) { if (mouseOver || button.IsMouseDown && !button.DesignMode) PaintButtonMouseOver(button, pa, image, mouseOverRect); } if (isOnMenu && button.IsOnCustomizeMenu && button.Visible && !button.SystemItem) PaintCustomizeCheck(button, pa, customizeCheckRect); if (button.Checked && !button.IsOnCustomizeMenu && (button.GetEnabled(pa.ContainerControl) || isOnMenu)) PaintButtonCheck(button, pa, image, checkRect); if ((image != null || !string.IsNullOrEmpty(button.SymbolRealized)) && button.ButtonStyle != eButtonStyle.TextOnlyAlways) PaintButtonImage(button, pa, image, imageRect); if (!(button is ApplicationButton) || button.EffectiveStyle == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(button.EffectiveStyle)) PaintButtonText(button, pa, textColor, image); PaintExpandButton(button, pa); if (button.Focused && button.DesignMode) { Rectangle r = itemRect; r.Inflate(-1, -1); DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder); } if (image != null) image.Dispose(); } finally { if (oldClip != null) { g.Clip = oldClip; oldClip.Dispose(); } else g.ResetClip(); } } protected virtual bool IsOnMenu(ButtonItem button, ItemPaintArgs pa) { bool isOnMenu = pa.IsOnMenu; if (isOnMenu && button.Parent is ItemContainer) isOnMenu = false; return isOnMenu; } public override void PaintButtonImage(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle imagebounds) { bool isOnMenu = IsOnMenu(button, pa); if (imagebounds.Width <= 0 || imagebounds.Height <= 0) return; if (!string.IsNullOrEmpty(button.SymbolRealized)) { Font font = Symbols.GetFont(button.SymbolSize, button.SymbolSet); Color symbolColor = (button.SymbolColor.IsEmpty || !button.Enabled ? GetTextColor(button, pa) : button.SymbolColor); if (isOnMenu) TextDrawing.DrawStringLegacy(pa.Graphics, button.SymbolRealized, font, symbolColor, new Rectangle(imagebounds.X + imagebounds.Width / 2, imagebounds.Y, 0, 0), eTextFormat.Default | eTextFormat.HorizontalCenter); else TextDrawing.DrawStringLegacy(pa.Graphics, button.SymbolRealized, font, symbolColor, new Rectangle(imagebounds.X, imagebounds.Y - ((button.ImagePosition == eImagePosition.Bottom || Dpi.Factor.Width>1 || !pa.IsBackstageTab) ? 0 : 2), 0, 0), eTextFormat.Default); return; } if (button.EnableImageAnimation && button.CanAnimateImage) { if (!button.CurrentlyAnimatingImage) button.StartImageAnimation(image.Image); ImageAnimator.UpdateFrames(); } if (isOnMenu) { image.DrawImage(pa.Graphics, imagebounds); } else if (!button.IsMouseOver && button.HotTrackingStyle == eHotTrackingStyle.Color) { // Draw gray-scale image for this hover style... float[][] array = new float[5][]; array[0] = new float[5] { 0.2125f, 0.2125f, 0.2125f, 0, 0 }; array[1] = new float[5] { 0.5f, 0.5f, 0.5f, 0, 0 }; array[2] = new float[5] { 0.0361f, 0.0361f, 0.0361f, 0, 0 }; array[3] = new float[5] { 0, 0, 0, 1, 0 }; array[4] = new float[5] { 0.2f, 0.2f, 0.2f, 0, 1 }; ColorMatrix grayMatrix = new ColorMatrix(array); ImageAttributes att = new ImageAttributes(); att.SetColorMatrix(grayMatrix); image.DrawImage(pa.Graphics, imagebounds, 0, 0, image.ActualWidth, image.ActualHeight, GraphicsUnit.Pixel, att); } else { image.DrawImage(pa.Graphics, imagebounds); } } public override Rectangle GetImageRectangle(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { Rectangle imageRect = Rectangle.Empty; bool isOnMenu = IsOnMenu(button, pa); // Calculate image position if (image != null || !string.IsNullOrEmpty(button.SymbolRealized)) { Size imageSize = button.ImageSize; Rectangle displayRect = GetDisplayRectangle(button); if (pa.RightToLeft && isOnMenu) { imageRect = new Rectangle(displayRect.Right - (button.ImageDrawRect.X + imageSize.Width + 2), button.ImageDrawRect.Y + displayRect.Y, imageSize.Width, imageSize.Height); } else { if (!isOnMenu && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)) imageRect = new Rectangle(button.ImageDrawRect.X, button.ImageDrawRect.Y, displayRect.Width, button.ImageDrawRect.Height); else imageRect = new Rectangle(button.ImageDrawRect.X, button.ImageDrawRect.Y, button.ImageDrawRect.Width, button.ImageDrawRect.Height); imageRect.Offset(displayRect.Left, displayRect.Top); if ((button.EffectiveStyle == eDotNetBarStyle.Windows7 || button.EffectiveStyle == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(button.EffectiveStyle)) && (button is ApplicationButton || button is DevComponents.DotNetBar.Metro.MetroAppButton)) imageRect.Offset(14, (imageRect.Height - imageSize.Height) / 2); else imageRect.Offset((imageRect.Width - imageSize.Width) / 2, (imageRect.Height - imageSize.Height) / 2); imageRect.Width = imageSize.Width; imageRect.Height = imageSize.Height; } } return imageRect; } public override Rectangle GetCheckRectangle(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { Rectangle r = Rectangle.Empty; bool isOnMenu = IsOnMenu(button, pa); Rectangle displayRect = GetDisplayRectangle(button); if (isOnMenu) { //r=new Rectangle(button.DisplayRectangle.X+1,button.DisplayRectangle.Y,button.ImageDrawRect.Width-2,button.DisplayRectangle.Height); //r.Inflate(-1,-1); // This modification fixes the bug of the checkbox appearing on the wrong side of the button item in RightToLeft mode, thanks Brian! if (pa.RightToLeft) { r = new Rectangle(displayRect.Right - button.ImageDrawRect.Width + 1, displayRect.Y, button.ImageDrawRect.Width - 2, displayRect.Height); r.Inflate(-1, -1); } else { // LTR also adjusted by one pixel from original alignment to give more logical position. // TODO: Find out if MS Office 2007 positions like this or like the original. Original might be right. r = new Rectangle(displayRect.X, displayRect.Y, button.ImageDrawRect.Width - 2, displayRect.Height); r.Inflate(-1, -1); } } else if (button.HotTrackingStyle == eHotTrackingStyle.Image && image != null) { r = GetImageRectangle(button, pa, image); r.Inflate(2, 2); } else r = displayRect; return r; } public override Rectangle GetCustomizeMenuCheckRectangle(ButtonItem button, ItemPaintArgs pa) { bool isOnMenu = IsOnMenu(button, pa); Rectangle r = Rectangle.Empty; if (isOnMenu && button.IsOnCustomizeMenu && button.Visible && !button.SystemItem) { Rectangle displayRect = GetDisplayRectangle(button); r = new Rectangle(displayRect.Left, displayRect.Top, displayRect.Height, displayRect.Height); r.Inflate(-1, -1); //System.Diagnostics.Trace.WriteLine("r="+r.ToString()+" "+button.Text+" "+button.ImageDrawRect.ToString()+" "+button.DisplayRectangle.ToString()); } return r; } public override void PaintCustomizeCheck(ButtonItem button, ItemPaintArgs pa, Rectangle r) { Color clr=pa.Colors.ItemCheckedBackground; Graphics g=pa.Graphics; if(button.IsMouseOver && !pa.Colors.ItemHotBackground2.IsEmpty) { using(LinearGradientBrush gradient=BarFunctions.CreateLinearGradientBrush(r,pa.Colors.ItemHotBackground,pa.Colors.ItemHotBackground2,pa.Colors.ItemHotBackgroundGradientAngle)) { g.FillRectangle(gradient,r); } } else { if(button.IsMouseOver) clr=pa.Colors.ItemHotBackground; if(!pa.Colors.ItemCheckedBackground2.IsEmpty && !button.IsMouseOver) { using(LinearGradientBrush gradient=BarFunctions.CreateLinearGradientBrush(r,pa.Colors.ItemCheckedBackground,pa.Colors.ItemCheckedBackground2,pa.Colors.ItemCheckedBackgroundGradientAngle)) g.FillRectangle(gradient,r); } else { using(SolidBrush brush=new SolidBrush(clr)) g.FillRectangle(brush,r); } } Pen objPen=new Pen(pa.Colors.ItemCheckedBorder,Dpi.Width1); DisplayHelp.DrawRectangle(g,objPen,r); objPen.Dispose(); objPen=new Pen(pa.Colors.ItemCheckedText); // Draw checker... Point[] pt=new Point[3]; pt[0].X = r.Left + (r.Width - Dpi.Width5) / 2 - Dpi.Width1; pt[0].Y = r.Top + (r.Height - Dpi.Height6) / 2 + Dpi.Height3; pt[1].X = pt[0].X + Dpi.Width2; pt[1].Y = pt[0].Y + Dpi.Height2; pt[2].X = pt[1].X + Dpi.Width4; pt[2].Y = pt[1].Y - Dpi.Height4; g.DrawLines(objPen,pt); pt[0].X++; pt[1].X++; pt[2].X++; g.DrawLines(objPen,pt); objPen.Dispose(); } /// /// Paints state of the button, either hot, pressed or checked /// /// /// /// public override void PaintButtonMouseOver(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle r) { bool isMouseDown=button.IsMouseDown; bool isOnMenu = IsOnMenu(button, pa); Graphics g=pa.Graphics; Brush brush=null; Pen pen=null; if(isMouseDown && !isOnMenu) { if(pa.Colors.ItemPressedBackground2.IsEmpty) brush=new SolidBrush(pa.Colors.ItemPressedBackground); else brush=BarFunctions.CreateLinearGradientBrush(r,pa.Colors.ItemPressedBackground,pa.Colors.ItemPressedBackground2,pa.Colors.ItemPressedBackgroundGradientAngle); pen=new Pen(pa.Colors.ItemPressedBorder,1); } else { if(IsItemEnabled(button, pa)) { if(!pa.Colors.ItemHotBackground2.IsEmpty) brush=BarFunctions.CreateLinearGradientBrush(r,pa.Colors.ItemHotBackground,pa.Colors.ItemHotBackground2,pa.Colors.ItemHotBackgroundGradientAngle); else brush=new SolidBrush(pa.Colors.ItemHotBackground); pen = new Pen(pa.Colors.ItemHotBorder, 1); } else if(isOnMenu) pen=new Pen(pa.Colors.ItemHotBorder,1); } if(brush!=null) { //Rectangle rf=r; //rf.Width--; //rf.Height--; g.FillRectangle(brush,r); } if(pen!=null) DisplayHelp.DrawRectangle(g,pen,r); if(brush!=null) brush.Dispose(); if(pen!=null) pen.Dispose(); } protected virtual void PaintButtonCheckBackground(ButtonItem button, ItemPaintArgs pa, Rectangle r) { Graphics g = pa.Graphics; bool isOnMenu = IsOnMenu(button, pa); if (!button.IsMouseOver || isOnMenu) { DisplayHelp.FillRectangle(g, r, pa.Colors.ItemCheckedBackground, pa.Colors.ItemCheckedBackground2, pa.Colors.ItemCheckedBackgroundGradientAngle); DisplayHelp.DrawRectangle(g, pa.Colors.ItemCheckedBorder, r); } } public override void PaintButtonCheck(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle r) { if(r.IsEmpty) return; bool isOnMenu = IsOnMenu(button, pa); Graphics g=pa.Graphics; PaintButtonCheckBackground(button, pa, r); if((image==null && string.IsNullOrEmpty(button.SymbolRealized) || button.ButtonStyle==eButtonStyle.TextOnlyAlways) && isOnMenu) { // Draw checker... using (Pen pen = new Pen((IsItemEnabled(button, pa) ? pa.Colors.ItemCheckedText : pa.Colors.ItemDisabledText), Dpi.Width1)) { Point[] pt = new Point[3]; pt[0].X = r.Left + (r.Width - Dpi.Width5) / 2 - Dpi.Width1; pt[0].Y = r.Top + (r.Height - Dpi.Height6) / 2 + Dpi.Height3; pt[1].X = pt[0].X + Dpi.Width2; pt[1].Y = pt[0].Y + Dpi.Height2; pt[2].X = pt[1].X + Dpi.Width4; pt[2].Y = pt[1].Y - Dpi.Height4; g.DrawLines(pen, pt); pt[0].X += Dpi.Width1; //pt[0].Y pt[1].X += Dpi.Width1; //pt[1].Y; pt[2].X += Dpi.Width1; //pt[2].Y; g.DrawLines(pen, pt); } } } public override Rectangle GetMouseOverRectangle(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { Rectangle r = GetDisplayRectangle(button); if(button.HotTrackingStyle==eHotTrackingStyle.None || button.HotTrackingStyle==eHotTrackingStyle.Color) return Rectangle.Empty; if(button.HotTrackingStyle==eHotTrackingStyle.Image && image!=null) { r=GetImageRectangle(button,pa,image); r.Inflate(2,2); return r; } bool isOnMenu = IsOnMenu(button, pa); if(isOnMenu) { r.X++; r.Width-=2; } return r; } public override eTextFormat GetStringFormat(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { eTextFormat stringFormat=pa.ButtonStringFormat; bool isOnMenu = IsOnMenu(button, pa); if(!isOnMenu) { if(pa.ContainerControl is RibbonStrip && (image==null && string.IsNullOrEmpty(button.SymbolRealized) || button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom) || button._FixedSizeCenterText) stringFormat |= eTextFormat.HorizontalCenter; else if (pa.ContainerControl is ButtonX) { ButtonX buttonX = pa.ContainerControl as ButtonX; if(buttonX.TextAlignment== eButtonTextAlignment.Center) stringFormat |= eTextFormat.HorizontalCenter; else if(buttonX.TextAlignment== eButtonTextAlignment.Left) stringFormat |= eTextFormat.Left; else if (buttonX.TextAlignment == eButtonTextAlignment.Right && (image == null && string.IsNullOrEmpty(button.SymbolRealized) || button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)) stringFormat |= eTextFormat.Right; if (!buttonX.UseMnemonic) stringFormat |= eTextFormat.NoPrefix; } else if (pa.IsOnMenuBar || (pa.ContainerControl is Bar || pa.ContainerControl is ButtonX || button.Orientation == eOrientation.Vertical) && image == null && string.IsNullOrEmpty(button.SymbolRealized) || button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) stringFormat |= eTextFormat.HorizontalCenter; //if (pa.ContainerControl is RibbonBar) // VerticalCenter in this configuration was causing the bottom pixels to be cut off so remove it for all cases when images are on top or bottom { if (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) { if (image != null || !string.IsNullOrEmpty(button.SymbolRealized)) stringFormat |= eTextFormat.WordBreak; stringFormat = stringFormat & ~(stringFormat & eTextFormat.VerticalCenter) | eTextFormat.Top; } } } if (pa.RightToLeft) stringFormat |= eTextFormat.RightToLeft; return stringFormat; } protected virtual bool IsTextCentered(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { bool isOnMenu = IsOnMenu(button, pa); if (!isOnMenu) { System.Windows.Forms.Control cc = pa.ContainerControl; if (cc is RibbonStrip && (image == null && string.IsNullOrEmpty(button.SymbolRealized) || button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) || button.Name.StartsWith("sysgallery") || button._FixedSizeCenterText) return true; else if (cc is ButtonX) { ButtonX buttonX = cc as ButtonX; if (buttonX.TextAlignment == eButtonTextAlignment.Center) return true; } else if (pa.IsOnMenuBar || cc is Bar && image == null && string.IsNullOrEmpty(button.SymbolRealized) || (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)) return true; } return false; } protected virtual Rectangle GetTextRectangle(ButtonItem button, ItemPaintArgs pa, eTextFormat stringFormat, CompositeImage image) { Graphics g = pa.Graphics; bool isOnMenu = IsOnMenu(button, pa); bool isOnMenuBar = pa.IsOnMenuBar; Rectangle itemRect = GetDisplayRectangle(button); Rectangle textRect = button.TextDrawRect; Rectangle imageRect = button.ImageDrawRect; bool rightToLeft = pa.RightToLeft; // Draw menu item text if (isOnMenu || button.ButtonStyle != eButtonStyle.Default || image == null && string.IsNullOrEmpty(button.SymbolRealized) || (!isOnMenu && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))) { if (isOnMenu) { if (rightToLeft) { //rect = new Rectangle(26, button.TextDrawRect.Y, itemRect.Width - button.ImageDrawRect.Width - 28, button.TextDrawRect.Height); // This seems to give a better alignment match with the corresponding LTR alignment if(button.IsOnCustomizeMenu) textRect = new Rectangle(itemRect.Height, textRect.Y, itemRect.Width - imageRect.Width - 11 - itemRect.Height, textRect.Height); else textRect = new Rectangle(17, textRect.Y, itemRect.Width - imageRect.Width - 28, textRect.Height); } else textRect = new Rectangle(textRect.X, textRect.Y, itemRect.Width - imageRect.Right - 26, textRect.Height); } else { //rect = button.TextDrawRect; if (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) { if (button.Orientation != eOrientation.Vertical) { textRect = new Rectangle(1, textRect.Y + 2, itemRect.Width - 2, textRect.Height); if (button.SplitButton || pa.ContainerControl is RibbonBar) textRect.Y += 2; } } } if (image == null && string.IsNullOrEmpty(button.SymbolRealized) && (stringFormat & eTextFormat.HorizontalCenter) != eTextFormat.HorizontalCenter && !isOnMenu && !isOnMenuBar && textRect.X == 0 && !pa.RightToLeft) textRect.X = 3; textRect.Offset(itemRect.Left, itemRect.Top); if (button.Orientation == eOrientation.Vertical && !isOnMenu) { if (textRect.Bottom > itemRect.Bottom) textRect.Height = itemRect.Bottom - textRect.Y; } else { if (textRect.Right > itemRect.Right) textRect.Width = itemRect.Right - textRect.Left; } } return textRect; } public override void PaintButtonText(ButtonItem button, ItemPaintArgs pa, Color textColor, CompositeImage image) { if (!button.RenderText) return; Graphics g=pa.Graphics; eTextFormat stringFormat=GetStringFormat(button,pa,image); bool isOnMenu = IsOnMenu(button, pa); bool isOnMenuBar=pa.IsOnMenuBar; Rectangle itemRect = GetDisplayRectangle(button); Rectangle rect=GetTextRectangle(button, pa, stringFormat, image); Font font=button.GetFont(pa, false); bool rightToLeft = pa.RightToLeft; //if (isOnMenu && rightToLeft || (stringFormat & eTextFormat.Left) == eTextFormat.Left) // stringFormat |=eTextFormat.Right; // Draw menu item text if (isOnMenu || button.ButtonStyle != eButtonStyle.Default || image == null && string.IsNullOrEmpty(button.SymbolRealized) || (!isOnMenu && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))) { if(button.Orientation==eOrientation.Vertical && !isOnMenu) { g.RotateTransform(90); if (button.TextMarkupBody == null) { TextDrawing.DrawStringLegacy(g, GetDrawText(button.Text), font, textColor, new Rectangle(rect.Top, -rect.Right, rect.Height, rect.Width), stringFormat); } else { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rightToLeft); d.HotKeyPrefixVisible = !((stringFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); button.TextMarkupBody.Bounds = new Rectangle(rect.Top, -rect.Right, button.TextMarkupBody.Bounds.Width, button.TextMarkupBody.Bounds.Height); button.TextMarkupBody.Render(d); } g.ResetTransform(); } else { if (button.TextMarkupBody == null) { #if FRAMEWORK20 if (pa.GlassEnabled && (button.Parent is CaptionItemContainer || button.Parent is RibbonTabItemContainer && (button.EffectiveStyle == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(button.EffectiveStyle))) && !(pa.ContainerControl is QatToolbar)) { if (!pa.CachedPaint) Office2007RibbonControlPainter.PaintTextOnGlass(g, button.Text, font, rect, TextDrawing.GetTextFormat(stringFormat), textColor, true, !button.IsMouseOver && !ColorFunctions.IsEqual(textColor, Color.White), 7); } else #endif TextDrawing.DrawString(g, GetDrawText(button.Text), font, textColor, rect, stringFormat); } else { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rightToLeft); d.HotKeyPrefixVisible = !((stringFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); d.ContextObject = button; Rectangle mr = new Rectangle((rightToLeft && isOnMenu?rect.X+rect.Width-button.TextMarkupBody.Bounds.Width:rect.X), rect.Y + (rect.Height - button.TextMarkupBody.Bounds.Height) / 2 /*- (isOnMenu ? -1 : -1)*/+1, button.TextMarkupBody.Bounds.Width, button.TextMarkupBody.Bounds.Height); if (pa.ContainerControl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)) mr = new Rectangle(rect.X + (rect.Width - button.TextMarkupBody.Bounds.Width) / 2, rect.Y, button.TextMarkupBody.Bounds.Width, button.TextMarkupBody.Bounds.Height); else if (IsTextCentered(button, pa, image)) mr.Offset((rect.Width - mr.Width) / 2, 0); if (button._FixedSizeCenterText) mr.Y--; button.TextMarkupBody.Bounds = mr; button.TextMarkupBody.Render(d); } if(!button.DesignMode && button.Focused && !isOnMenu && !isOnMenuBar && !(pa.ContainerControl is ButtonX && !((ButtonX)pa.ContainerControl).FocusCuesEnabled)) { Rectangle r=itemRect; r.Inflate(-2, -2); ControlPaint.DrawFocusRectangle(g,r); } } } // Draw Shortcut text if needed if( button.DrawShortcutText!="" && isOnMenu && !button.IsOnCustomizeDialog) { stringFormat |= eTextFormat.HidePrefix; //if(rightToLeft) // stringFormat = stringFormat & ~(stringFormat & eTextFormat.Right) | eTextFormat.Left; //else stringFormat|=eTextFormat.Right; TextDrawing.DrawString(g, button.DrawShortcutText, font, textColor, rect, stringFormat); } } protected virtual Rectangle GetTotalSubItemsRect(ButtonItem button) { return button.GetTotalSubItemsRect(); } public override void PaintExpandButton(ButtonItem button, ItemPaintArgs pa) { Graphics g=pa.Graphics; bool isOnMenu = IsOnMenu(button, pa); Rectangle itemRect = GetDisplayRectangle(button); bool mouseOver=button.IsMouseOver; Color textColor = this.GetTextColor(button, pa); using (SolidBrush textBrush = new SolidBrush(textColor)) { // If it has subitems draw the triangle to indicate that if ((button.SubItems.Count > 0 || button.PopupType == ePopupType.Container) && button.ShowSubItems) { if (isOnMenu) { Point[] p = new Point[3]; if (pa.RightToLeft) { p[0].X = itemRect.Left + 8; p[0].Y = itemRect.Top + (itemRect.Height - 8) / 2; p[1].X = p[0].X; p[1].Y = p[0].Y + 8; p[2].X = p[0].X - 4; p[2].Y = p[0].Y + 4; } else { p[0].X = itemRect.Left + itemRect.Width - 12; p[0].Y = itemRect.Top + (itemRect.Height - 8) / 2; p[1].X = p[0].X; p[1].Y = p[0].Y + 8; p[2].X = p[0].X + 4; p[2].Y = p[0].Y + 4; } g.FillPolygon(textBrush, p); } else if (!button.SubItemsRect.IsEmpty) { if (IsItemEnabled(button, pa) && ((mouseOver || button.Checked) && !button.Expanded && button.HotTrackingStyle != eHotTrackingStyle.None && button.HotTrackingStyle != eHotTrackingStyle.Image) && !button.AutoExpandOnClick) { Rectangle r = GetTotalSubItemsRect(button); // button.SubItemsRect; r.Offset(itemRect.Location); using (Pen mypen = new Pen(mouseOver?pa.Colors.ItemHotBorder:pa.Colors.ItemCheckedBorder)) DisplayHelp.DrawRectangle(g, mypen, r); } PaintButtonExpandIndicator(button, pa); } } } } protected virtual void PaintMenuItemSide(ButtonItem button, ItemPaintArgs pa, Rectangle sideRect) { Graphics g = pa.Graphics; Region oldClip = g.Clip.Clone() as Region; g.SetClip(sideRect); sideRect.Inflate(0, 1); // Draw side bar if (button.MenuVisibility == eMenuVisibility.VisibleIfRecentlyUsed && !button.RecentlyUsed) { DisplayHelp.FillRectangle(g, sideRect, pa.Colors.MenuUnusedSide, pa.Colors.MenuUnusedSide2, pa.Colors.MenuUnusedSideGradientAngle); } else { DisplayHelp.FillRectangle(g, sideRect, pa.Colors.MenuSide, pa.Colors.MenuSide2, pa.Colors.MenuSideGradientAngle); } if (oldClip != null) g.Clip = oldClip; else g.ResetClip(); } public override void PaintButtonBackground(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { Graphics g = pa.Graphics; bool isOnMenu = IsOnMenu(button, pa); Rectangle displayRect = GetDisplayRectangle(button); if (isOnMenu) { Rectangle sideRect = new Rectangle(displayRect.Left, displayRect.Top, button.ImageDrawRect.Right, displayRect.Height); if (pa.RightToLeft) { sideRect = new Rectangle(displayRect.Right - button.ImageDrawRect.Right, displayRect.Top, button.ImageDrawRect.Right, displayRect.Height); } PaintMenuItemSide(button, pa, sideRect); } else { // Draw button background if (!pa.Colors.ItemBackground.IsEmpty) { if (pa.Colors.ItemBackground2.IsEmpty) { using (SolidBrush mybrush = new SolidBrush(pa.Colors.ItemBackground)) g.FillRectangle(mybrush, displayRect); } else { using (LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(displayRect, pa.Colors.ItemBackground, pa.Colors.ItemBackground2, pa.Colors.ItemBackgroundGradientAngle)) g.FillRectangle(gradient, displayRect); } } else if (!IsItemEnabled(button, pa) && !pa.Colors.ItemDisabledBackground.IsEmpty) { using (SolidBrush mybrush = new SolidBrush(pa.Colors.ItemDisabledBackground)) g.FillRectangle(mybrush, displayRect); } } Rectangle itemRect = displayRect; if (IsItemEnabled(button, pa) || button.DesignMode) { if (button.Expanded && !isOnMenu) { // DotNet Style if (pa.Colors.ItemExpandedBackground2.IsEmpty) { Rectangle rBack = displayRect; if (!pa.Colors.ItemExpandedShadow.IsEmpty) rBack.Width -= 2; using (SolidBrush mybrush = new SolidBrush(pa.Colors.ItemExpandedBackground)) g.FillRectangle(mybrush, rBack); } else { LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(new Rectangle(itemRect.Left, itemRect.Top, itemRect.Width - 2, itemRect.Height), pa.Colors.ItemExpandedBackground, pa.Colors.ItemExpandedBackground2, pa.Colors.ItemExpandedBackgroundGradientAngle); Rectangle rBack = new Rectangle(itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height); if (!pa.Colors.ItemExpandedShadow.IsEmpty) rBack.Width -= 2; g.FillRectangle(gradient, rBack); gradient.Dispose(); } Point[] p; if (button.Orientation == eOrientation.Horizontal && button.PopupSide == ePopupSide.Default) p = new Point[4]; else p = new Point[5]; p[0].X = itemRect.Left; p[0].Y = itemRect.Top + itemRect.Height - 1; p[1].X = itemRect.Left; p[1].Y = itemRect.Top; if (button.Orientation == eOrientation.Horizontal /*&& !pa.Colors.ItemExpandedShadow.IsEmpty*/) { if (!pa.Colors.ItemExpandedShadow.IsEmpty) p[2].X = itemRect.Left + itemRect.Width - 3; else p[2].X = itemRect.Right - 1; } else p[2].X = itemRect.Left + itemRect.Width - 1; p[2].Y = itemRect.Top; if (button.Orientation == eOrientation.Horizontal /*&& !pa.Colors.ItemExpandedShadow.IsEmpty*/) { if (!pa.Colors.ItemExpandedShadow.IsEmpty) p[3].X = itemRect.Left + itemRect.Width - 3; else p[3].X = itemRect.Right - 1; } else p[3].X = itemRect.Left + itemRect.Width - 1; p[3].Y = itemRect.Top + itemRect.Height - 1; if (button.Orientation == eOrientation.Vertical || button.PopupSide != ePopupSide.Default) { p[4].X = itemRect.Left; p[4].Y = itemRect.Top + itemRect.Height - 1; } if (!pa.Colors.ItemExpandedBorder.IsEmpty) { using (Pen mypen = new Pen(pa.Colors.ItemExpandedBorder, 1)) g.DrawLines(mypen, p); } // Draw the shadow if (!pa.Colors.ItemExpandedShadow.IsEmpty && button.Orientation == eOrientation.Horizontal) { using (SolidBrush shadow = new SolidBrush(pa.Colors.ItemExpandedShadow)) g.FillRectangle(shadow, itemRect.Left + itemRect.Width - 2, itemRect.Top + 2, 2, itemRect.Height - 2); // TODO: ADD GRADIENT SHADOW } } } } } }