986 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			986 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Drawing;
 | |
| using System.Drawing.Text;
 | |
| using System.Windows.Forms;
 | |
| using System;
 | |
| using DevComponents.DotNetBar.Controls;
 | |
| using DevComponents.DotNetBar.Rendering;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Summary description for ButtonItemLayout.
 | |
|     /// </summary>
 | |
|     internal class ButtonItemLayout
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Arranges the button inner parts when button size has changed externally.
 | |
|         /// </summary>
 | |
|         /// <param name="button">Button to arrange inner parts for.</param>
 | |
|         public static void Arrange(ButtonItem button)
 | |
|         {
 | |
|             int minTextSize = Dpi.Width8;
 | |
|             bool isOnMenu = button.IsOnMenu;
 | |
|             if (isOnMenu && button.Parent is ItemContainer)
 | |
|                 isOnMenu = false;
 | |
|             bool hasImage = false;
 | |
| 
 | |
|             Size imageSize = Size.Empty;
 | |
|             if (!string.IsNullOrEmpty(button.SymbolRealized))
 | |
|             {
 | |
|                 hasImage = true;
 | |
|                 imageSize = button.ImageSize;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 using (CompositeImage buttonImage = button.GetImage())
 | |
|                 {
 | |
|                     if (buttonImage != null)
 | |
|                         hasImage = true;
 | |
|                 }
 | |
|                 imageSize = GetLayoutImageSize(button, hasImage, isOnMenu, false);
 | |
|             }
 | |
| 
 | |
|             bool rightToLeft = button.IsRightToLeft;
 | |
|             Rectangle bounds = button.DisplayRectangle;
 | |
| 
 | |
|             if (isOnMenu)
 | |
|             {
 | |
|                 // Add 4 pixel padding to the image size, 2 pixels on each side
 | |
|                 imageSize.Height += Dpi.Width2;
 | |
|                 imageSize.Width += Dpi.Width7;
 | |
|                 // Center image if any...
 | |
|                 //if (rightToLeft)
 | |
|                 //{
 | |
|                 //    if (button.IsOnCustomizeMenu)
 | |
|                 //        button.ImageDrawRect = new Rectangle(bounds.Width - (imageSize.Width + bounds.Height + 2), Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height);
 | |
|                 //    else
 | |
|                 //        button.ImageDrawRect = new Rectangle(bounds.Width - imageSize.Width - 1, Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height);
 | |
|                 //}
 | |
|                 //else
 | |
|                 {
 | |
|                     if (button.IsOnCustomizeMenu && !rightToLeft)
 | |
|                         button.ImageDrawRect = new Rectangle(bounds.Height + 2, Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height);
 | |
|                     else
 | |
|                         button.ImageDrawRect = new Rectangle(0, Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height);
 | |
|                 }
 | |
| 
 | |
|                 //if (rightToLeft)
 | |
|                 //    button.TextDrawRect = new Rectangle(Math.Max(0, button.ImageDrawRect.X - button.TextDrawRect.Width - 2), Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), button.TextDrawRect.Width, button.TextDrawRect.Height);
 | |
|                 //else
 | |
|                 button.TextDrawRect = new Rectangle(button.ImageDrawRect.Right + 8, Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), button.TextDrawRect.Width, button.TextDrawRect.Height);
 | |
| 
 | |
|                 return;
 | |
|             }
 | |
|             int x = 0;
 | |
|             if (!button.SubItemsRect.IsEmpty)
 | |
|             {
 | |
|                 Rectangle subItemsRect = button.SubItemsRect;
 | |
|                 if (button.ContainerControl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))
 | |
|                 {
 | |
|                     subItemsRect = new Rectangle(0, bounds.Height - subItemsRect.Height, bounds.Width, subItemsRect.Height);
 | |
|                     bounds.Height -= subItemsRect.Height;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (button.Orientation == eOrientation.Horizontal)
 | |
|                     {
 | |
|                         if (rightToLeft)
 | |
|                         {
 | |
|                             subItemsRect = new Rectangle(0, 0, subItemsRect.Width, bounds.Height);
 | |
|                             //bounds.Width -= subItemsRect.Width;
 | |
|                             //bounds.X += subItemsRect.Width;
 | |
|                             x = subItemsRect.Width;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             subItemsRect = new Rectangle(bounds.Width - subItemsRect.Width, 0, subItemsRect.Width, bounds.Height);
 | |
|                             bounds.Width -= subItemsRect.Width;
 | |
|                         }
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         subItemsRect = new Rectangle(0, 0, bounds.Width, subItemsRect.Height);
 | |
|                         bounds.Height -= subItemsRect.Height;
 | |
|                     }
 | |
|                 }
 | |
|                 button.SubItemsRect = subItemsRect;
 | |
|             }
 | |
| 
 | |
|             if (!hasImage || button.ButtonStyle == eButtonStyle.TextOnlyAlways)
 | |
|             {
 | |
|                 int newHeight = bounds.Height - 2;
 | |
|                 button.TextDrawRect = new Rectangle(2,
 | |
|                     Math.Max(0, (bounds.Height - newHeight) / 2), bounds.Width - 4, newHeight);
 | |
|                 return;
 | |
|             }
 | |
|             else if (button.ButtonStyle == eButtonStyle.Default && !(button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) || bounds.Width < imageSize.Width + minTextSize)
 | |
|             {
 | |
|                 // Display image only in center of the button
 | |
|                 button.ImageDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.ImageDrawRect.Width) / 2),
 | |
|                     Math.Max(0, (bounds.Height - button.ImageDrawRect.Height) / 2), button.ImageDrawRect.Width, button.ImageDrawRect.Height);
 | |
|                 if (bounds.Width < imageSize.Width + minTextSize)
 | |
|                     button.TextDrawRect = Rectangle.Empty;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             // Displays both image and text
 | |
|             if (button.ImagePosition == eImagePosition.Left && !rightToLeft || button.ImagePosition == eImagePosition.Right && rightToLeft)
 | |
|             {
 | |
|                 button.ImageDrawRect = new Rectangle(0, Math.Max(0, (bounds.Height - button.ImageDrawRect.Height) / 2),
 | |
|                     button.ImageDrawRect.Width, button.ImageDrawRect.Height);
 | |
|                 button.TextDrawRect = new Rectangle(button.ImageDrawRect.Right - 2, Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2),
 | |
|                     Math.Min(button.TextDrawRect.Width, bounds.Width - (button.ImageDrawRect.Right - 2)), button.TextDrawRect.Height);
 | |
|             }
 | |
|             else if (button.ImagePosition == eImagePosition.Right && !rightToLeft || button.ImagePosition == eImagePosition.Left && rightToLeft)
 | |
|             {
 | |
|                 button.ImageDrawRect = new Rectangle(bounds.Width - button.ImageDrawRect.Width, Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2),
 | |
|                     button.ImageDrawRect.Width, button.ImageDrawRect.Height);
 | |
|                 button.TextDrawRect = new Rectangle(Math.Max(x, button.ImageDrawRect.X - button.TextDrawRect.Width + 2), Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2),
 | |
|                     Math.Min(button.TextDrawRect.Width, button.ImageDrawRect.X), button.TextDrawRect.Height);
 | |
|             }
 | |
|             else if (button.ImagePosition == eImagePosition.Top)
 | |
|             {
 | |
|                 int y = Math.Max(2, (bounds.Height - (button.TextDrawRect.Height + button.ImageDrawRect.Height - 2)) / 2);
 | |
|                 if (button.Name != "sysOverflowButton" && button.Parent is ItemContainer && ((ItemContainer)button.Parent).LayoutOrientation == eOrientation.Horizontal && ((ItemContainer)button.Parent).VerticalItemAlignment == eVerticalItemsAlignment.Top)
 | |
|                     y = 2;
 | |
| 
 | |
|                 button.ImageDrawRect = new Rectangle(0, y,
 | |
|                     bounds.Width, button.ImageDrawRect.Height);
 | |
| 
 | |
|                 button.TextDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.TextDrawRect.Width) / 2), button.ImageDrawRect.Bottom,
 | |
|                     button.TextDrawRect.Width, button.TextDrawRect.Height);
 | |
|             }
 | |
|             else if (button.ImagePosition == eImagePosition.Bottom)
 | |
|             {
 | |
|                 int y = Math.Max(0, (bounds.Height - (button.TextDrawRect.Height + button.ImageDrawRect.Height - 2)) / 2);
 | |
|                 //button.ImageDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.ImageDrawRect.Width) / 2), bounds.Height - y - button.ImageDrawRect.Height,
 | |
|                 //    button.ImageDrawRect.Width, button.ImageDrawRect.Height);
 | |
|                 button.ImageDrawRect = new Rectangle(0, bounds.Height - y - button.ImageDrawRect.Height,
 | |
|                     bounds.Width, button.ImageDrawRect.Height);
 | |
|                 button.TextDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.ImageDrawRect.Width) / 2), Math.Max(0, button.ImageDrawRect.Y + 2 - button.TextDrawRect.Height),
 | |
|                     button.TextDrawRect.Width, Math.Min(button.TextDrawRect.Height, button.ImageDrawRect.Y));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static Size MeasureItemText(BaseItem item, Graphics g, int containerWidth, Font font, eTextFormat stringFormat, bool rightToLeft)
 | |
|         {
 | |
|             return MeasureItemText(item, g, containerWidth, font, stringFormat, rightToLeft, false, eImagePosition.Left);
 | |
|         }
 | |
| 
 | |
|         public static Size MeasureItemText(BaseItem item, Graphics g, int containerWidth, Font font, eTextFormat stringFormat, bool rightToLeft, bool ribbonBarButton, eImagePosition imagePosition)
 | |
|         {
 | |
|             if (item.Text == "" && item.TextMarkupBody == null) return Size.Empty;
 | |
| 
 | |
|             Size textSize = Size.Empty;
 | |
| 
 | |
|             if (item.TextMarkupBody == null)
 | |
|             {
 | |
|                 textSize = TextDrawing.MeasureString(g, ButtonItemPainter.GetDrawText(item.Text), font, containerWidth, stringFormat);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Size availSize = new Size(containerWidth, 1);
 | |
|                 if (containerWidth == 0)
 | |
|                     availSize.Width = 1600;
 | |
|                 TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, Color.Empty, false);
 | |
|                 item.TextMarkupBody.Measure(availSize, d);
 | |
|                 availSize = item.TextMarkupBody.Bounds.Size;
 | |
|                 if (containerWidth != 0 && !(ribbonBarButton && imagePosition == eImagePosition.Top))
 | |
|                     availSize.Width = containerWidth;
 | |
|                 d.RightToLeft = rightToLeft;
 | |
|                 item.TextMarkupBody.Arrange(new Rectangle(0, 0, availSize.Width, availSize.Height), d);
 | |
| 
 | |
|                 textSize = item.TextMarkupBody.Bounds.Size;
 | |
|             }
 | |
| 
 | |
|             return textSize;
 | |
|         }
 | |
| 
 | |
|         public static void LayoutButton(ButtonItem button)
 | |
|         {
 | |
|             LayoutButton(button, false);
 | |
|         }
 | |
| 
 | |
|         private static bool UseRibbonWordBreak(ButtonItem button)
 | |
|         {
 | |
|             if (button.TextMarkupBody == null)
 | |
|                 return button.Text.IndexOf(' ') > 0 || button.Text.IndexOf(Environment.NewLine)> 0;
 | |
| 
 | |
|             return (button.Text.IndexOf(' ') > 0 && !button.TextMarkupBody.HasExpandElement || button.Text.Split(' ').Length > 2 && button.TextMarkupBody.HasExpandElement && button.ButtonStyle != eButtonStyle.Default);
 | |
|         }
 | |
| 
 | |
|         public static void LayoutButton(ButtonItem button, bool startButtonType)
 | |
|         {
 | |
|             Control objCtrl = button.ContainerControl as Control;
 | |
|             if (objCtrl == null || objCtrl.Disposing || objCtrl.IsDisposed) //if(!BarFunctions.IsHandleValid(objCtrl))
 | |
|                 return;
 | |
|             if (objCtrl is ButtonX && button._FitContainer)
 | |
|             {
 | |
|                 LayoutButtonX(button);
 | |
|                 return;
 | |
|             }
 | |
|             else if (button.FixedSize.Width > 0 && button.FixedSize.Height > 0)
 | |
|             {
 | |
|                 Size fixedSize=Dpi.Size(button.FixedSize);
 | |
|                 button.SetDisplayRectangle(new Rectangle(button.DisplayRectangle.Location, fixedSize));
 | |
|                 LayoutButtonX(button);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             bool isOnMenu = button.IsOnMenu;
 | |
|             if (isOnMenu && button.Parent is ItemContainer)
 | |
|                 isOnMenu = false;
 | |
|             bool bHasImage = false;
 | |
|             bool isSymbolImage = false;
 | |
|             eDotNetBarStyle effectiveStyle = button.EffectiveStyle;
 | |
|             bool ignoreImage = false;
 | |
|             if (startButtonType && (effectiveStyle == eDotNetBarStyle.Office2010 || effectiveStyle == eDotNetBarStyle.Office2013 || effectiveStyle == eDotNetBarStyle.Metro))
 | |
|                 ignoreImage = true;
 | |
|             if (!ignoreImage)
 | |
|             {
 | |
|                 if (!string.IsNullOrEmpty(button.SymbolRealized))
 | |
|                 {
 | |
|                     bHasImage = true;
 | |
|                     isSymbolImage = true;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     using (CompositeImage buttonImage = button.GetImage())
 | |
|                     {
 | |
|                         if (buttonImage != null || startButtonType)
 | |
|                             bHasImage = true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             eImagePosition imagePosition = button.ImagePosition;
 | |
|             bool rightToLeft = (objCtrl.RightToLeft == RightToLeft.Yes);
 | |
| 
 | |
|             Rectangle textDrawRect = Rectangle.Empty;
 | |
|             Rectangle imageDrawRect = Rectangle.Empty;
 | |
|             Rectangle subItemsRect = Rectangle.Empty;
 | |
|             Rectangle bounds = new Rectangle(button.DisplayRectangle.Location, Size.Empty); // Critical to preserve the location for compatibility reasons
 | |
| 
 | |
|             if (rightToLeft && button.Orientation == eOrientation.Horizontal)
 | |
|             {
 | |
|                 if (imagePosition == eImagePosition.Left)
 | |
|                     imagePosition = eImagePosition.Right;
 | |
|                 else if (imagePosition == eImagePosition.Right)
 | |
|                     imagePosition = eImagePosition.Left;
 | |
|             }
 | |
| 
 | |
|             int measureStringWidth = 0;
 | |
| 
 | |
|             if (button._FitContainer)
 | |
|                 measureStringWidth = button.DisplayRectangle.Width - 4;
 | |
| 
 | |
|             bounds.Width = 0;
 | |
|             bounds.Height = 0;
 | |
| 
 | |
|             Graphics g = BarFunctions.CreateGraphics(objCtrl);
 | |
|             try
 | |
|             {
 | |
|                 eTextFormat stringFormat = GetTextFormat(button);
 | |
| 
 | |
|                 // Get the right image size that we will use for calculation
 | |
|                 Size imageSize = Size.Empty;
 | |
|                 if (isSymbolImage)
 | |
|                 {
 | |
|                     Font symFont = Symbols.GetFont(button.SymbolSize, button.SymbolSet);
 | |
|                     
 | |
|                     if(button.IsOnMenu || objCtrl is SideNavStrip) // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest
 | |
|                         imageSize = TextDrawing.MeasureStringLegacy(g, "\uF00A", symFont, Size.Empty, eTextFormat.Default);
 | |
|                     else
 | |
|                         imageSize = TextDrawing.MeasureStringLegacy(g, button.SymbolRealized, symFont, Size.Empty, eTextFormat.Default);
 | |
| 
 | |
|                     //int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) *
 | |
|                     //symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style)));
 | |
|                     //imageSize.Height -= descent;
 | |
|                     button.ImageSize = imageSize;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     imageSize = GetLayoutImageSize(button, bHasImage, isOnMenu, startButtonType);
 | |
|                 }
 | |
|                 bool ribbonBarButton = false;
 | |
|                 if (button._FitContainer && bHasImage && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right))
 | |
|                 {
 | |
|                     measureStringWidth -= (imageSize.Width + Dpi.Width10);
 | |
|                 }
 | |
|                 else if (button.RibbonWordWrap && bHasImage && imagePosition == eImagePosition.Top && objCtrl is RibbonBar && UseRibbonWordBreak(button))
 | |
|                 {
 | |
|                     measureStringWidth = imageSize.Width + Dpi.Width4;
 | |
|                     stringFormat |= eTextFormat.WordBreak;
 | |
|                     ribbonBarButton = true;
 | |
|                 }
 | |
| 
 | |
|                 // Measure string
 | |
|                 Font font = button.GetFont(null, true);
 | |
| 
 | |
|                 SizeF textSize = SizeF.Empty;
 | |
| 
 | |
|                 if ((button.Text != "" || button.TextMarkupBody != null) && (!bHasImage || isOnMenu || button.ButtonStyle != eButtonStyle.Default || button.ImagePosition != eImagePosition.Left && bHasImage))
 | |
|                 {
 | |
|                     textSize = ButtonItemLayout.MeasureItemText(button, g, measureStringWidth, font, stringFormat, rightToLeft, ribbonBarButton, imagePosition);
 | |
|                     //if (button.HotFontBold) textSize.Width += textSize.Width * .15f;
 | |
|                     int maxItt = 0;
 | |
|                     int increase = Math.Max(14, imageSize.Width / 2);
 | |
|                     while (ribbonBarButton && textSize.Height > font.Height * 2.2 && maxItt < 4)
 | |
|                     {
 | |
|                         measureStringWidth += increase;
 | |
|                         textSize = ButtonItemLayout.MeasureItemText(button, g, measureStringWidth, font, stringFormat, rightToLeft, ribbonBarButton, imagePosition);
 | |
|                         maxItt++;
 | |
|                     }
 | |
|                     if (maxItt > 0)
 | |
|                     {
 | |
|                         measureStringWidth += increase;
 | |
|                         textSize = ButtonItemLayout.MeasureItemText(button, g, measureStringWidth, font, stringFormat, rightToLeft, ribbonBarButton, imagePosition);
 | |
|                     }
 | |
|                     if (/*!ribbonBarButton &&*/ objCtrl is RibbonBar && bHasImage && imagePosition == eImagePosition.Top)
 | |
|                         textSize.Height += Dpi.Width2;
 | |
|                     if (startButtonType && ignoreImage)
 | |
|                         textSize.Width = Dpi.Width((int)Math.Max(51, textSize.Width+6));
 | |
|                 }
 | |
| 
 | |
|                 // See if this button is on menu, and do appropriate calculations
 | |
|                 if (isOnMenu)
 | |
|                 {
 | |
|                     if (imageSize.IsEmpty)
 | |
|                         imageSize = new Size(Dpi.Width16, Dpi.Height16);
 | |
| 
 | |
|                     // Add 4 pixel padding to the image size, 2 pixels on each side
 | |
|                     imageSize.Height += Dpi.Width2;
 | |
|                     imageSize.Width += Dpi.Width7;
 | |
| 
 | |
|                     // Calculate item height
 | |
|                     if (textSize.Height > imageSize.Height)
 | |
|                         bounds.Height = (int)textSize.Height + Dpi.Height4;
 | |
|                     else
 | |
|                         bounds.Height = imageSize.Height + Dpi.Height4;
 | |
| 
 | |
|                     // Add Vertical Padding to it
 | |
|                     bounds.Height += Dpi.Height(button.VerticalPadding);
 | |
| 
 | |
|                     // We know the image position now, we will center it into this area
 | |
|                     if (button.IsOnCustomizeMenu && !rightToLeft)
 | |
|                         imageDrawRect = new Rectangle(bounds.Height + Dpi.Width2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                     else
 | |
|                         imageDrawRect = new Rectangle(0, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
| 
 | |
|                     bounds.Width = (int)textSize.Width;
 | |
|                     // Add short-cut size if we have short-cut
 | |
|                     if (button.DrawShortcutText != "")
 | |
|                     {
 | |
|                         Size objSizeShortcut = TextDrawing.MeasureString(g, button.DrawShortcutText, font, 0, stringFormat);
 | |
|                         bounds.Width += (objSizeShortcut.Width + 14); // 14 distance between text and shortcut
 | |
|                     }
 | |
| 
 | |
|                     textDrawRect = new Rectangle(imageDrawRect.Right + 8, 2, bounds.Width, bounds.Height - 4);
 | |
| 
 | |
|                     // 8 pixels distance between image and text, 22 pixels if this item has sub items
 | |
|                     bounds.Width += (imageDrawRect.Right + Dpi.Width34);
 | |
|                     bounds.Width += Dpi.Width(button.HorizontalPadding);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     bool bThemed = button.IsThemed;
 | |
|                     if (StyleManager.Style == eStyle.OfficeMobile2014)
 | |
|                     {
 | |
|                         imageSize.Width += Dpi.Width6; imageSize.Height += Dpi.Height4;
 | |
|                     }
 | |
|                     else if (StyleManager.Style == eStyle.Office2016)
 | |
|                     {
 | |
|                         imageSize.Width += Dpi.Width4; imageSize.Height += Dpi.Width2;
 | |
|                     }
 | |
|                     if (button.Orientation == eOrientation.Horizontal && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right))
 | |
|                     {
 | |
|                         // Recalc size for the Bar button
 | |
|                         // Add 8 pixel padding to the image size, 4 pixels on each side
 | |
|                         //objImageSize.Height+=4;
 | |
|                         imageSize.Width += Dpi.Width(button.ImagePaddingHorizontal);
 | |
| 
 | |
|                         // Calculate item height
 | |
|                         if (textSize.Height > imageSize.Height)
 | |
|                             bounds.Height = (int)textSize.Height + Dpi.Height(button.ImagePaddingVertical);
 | |
|                         else
 | |
|                             bounds.Height = imageSize.Height + Dpi.Height(button.ImagePaddingVertical);
 | |
| 
 | |
|                         // Add Vertical Padding
 | |
|                         bounds.Height += Dpi.Height(button.VerticalPadding);
 | |
| 
 | |
|                         if (bThemed && !button.IsOnMenuBar)
 | |
|                             bounds.Height += Dpi.Height4;
 | |
| 
 | |
|                         imageDrawRect = Rectangle.Empty;
 | |
|                         if (button.ButtonStyle != eButtonStyle.TextOnlyAlways && bHasImage)
 | |
|                         {
 | |
|                             // We know the image position now, we will center it into this area
 | |
|                             imageDrawRect = new Rectangle(0, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                         }
 | |
| 
 | |
|                         // Draw Text only if needed
 | |
|                         textDrawRect = Rectangle.Empty;
 | |
|                         if (button.ButtonStyle != eButtonStyle.Default || !bHasImage)
 | |
|                         {
 | |
|                             if (imageDrawRect.Right > 0)
 | |
|                             {
 | |
|                                 bounds.Width = (int)textSize.Width + 1;
 | |
|                                 textDrawRect = new Rectangle(imageDrawRect.Right - 2, 2, bounds.Width, bounds.Height - 4);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 bounds.Width = (int)textSize.Width + Dpi.Width6;
 | |
|                                 if (!bHasImage && button.IsOnMenuBar)
 | |
|                                 {
 | |
|                                     bounds.Width += Dpi.Width6;
 | |
|                                     textDrawRect = new Rectangle(2, 2, bounds.Width, bounds.Height - 4);
 | |
|                                 }
 | |
|                                 else
 | |
|                                     textDrawRect = new Rectangle(2, 2, bounds.Width + Dpi.Width(button.HorizontalPadding - 4), bounds.Height - 4);
 | |
|                             }
 | |
|                         }
 | |
|                         bounds.Width += imageDrawRect.Right;
 | |
| 
 | |
|                         if (imagePosition == eImagePosition.Right && imageDrawRect.Right > 0 && bHasImage)
 | |
|                         {
 | |
|                             textDrawRect.X = 3;
 | |
|                             imageDrawRect.X = bounds.Width - imageDrawRect.Width;
 | |
|                         }
 | |
| 
 | |
|                         // Add Horizontal padding
 | |
|                         bounds.Width += Dpi.Width(button.HorizontalPadding);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         // Image is on top or bottom
 | |
|                         // Calculate width, that is easy
 | |
|                         if (button.Orientation == eOrientation.Horizontal)
 | |
|                         {
 | |
| 
 | |
|                             if (textSize.Width > imageSize.Width)
 | |
|                                 bounds.Width = (int)textSize.Width + Dpi.Width(button.ImagePaddingHorizontal);
 | |
|                             else
 | |
|                                 bounds.Width = imageSize.Width + Dpi.Width(button.ImagePaddingHorizontal);
 | |
| 
 | |
|                             // Calculate item height 3 padding on top and bottom and 2 pixels distance between the image and text
 | |
|                             bounds.Height = (int)(imageSize.Height + textSize.Height + Dpi.Height(button.ImagePaddingVertical) /*10*/);
 | |
| 
 | |
|                             // Add Horizontal/Vertical padding
 | |
|                             bounds.Width += Dpi.Width(button.HorizontalPadding);
 | |
|                             bounds.Height += Dpi.Height(button.VerticalPadding);
 | |
| 
 | |
|                             if (imagePosition == eImagePosition.Top)
 | |
|                             {
 | |
|                                 imageDrawRect = new Rectangle(0, Dpi.Height(button.VerticalPadding) / 2 + 2, bounds.Width, imageSize.Height/*+2*/);
 | |
|                                 textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, imageDrawRect.Bottom, (int)textSize.Width, (int)textSize.Height + 5);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, Dpi.Height(button.VerticalPadding) / 2, (int)textSize.Width, (int)textSize.Height + 2);
 | |
|                                 imageDrawRect = new Rectangle(0, textDrawRect.Bottom, bounds.Width, imageSize.Height + 5);
 | |
|                             }
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             if (textSize.Height > imageSize.Width && button.ButtonStyle != eButtonStyle.Default)
 | |
|                                 bounds.Width = (int)textSize.Height + 6;
 | |
|                             else
 | |
|                                 bounds.Width = imageSize.Width + 10;
 | |
| 
 | |
|                             // Add Horizontal Padding
 | |
|                             bounds.Width += Dpi.Width(button.HorizontalPadding);
 | |
| 
 | |
|                             // Calculate item height 3 padding on top and bottom and 2 pixels distance between the image and text
 | |
|                             if (button.ButtonStyle != eButtonStyle.Default || !bHasImage)
 | |
|                             {
 | |
|                                 if (bHasImage)
 | |
|                                     bounds.Height = (int)(imageSize.Height + textSize.Width + Dpi.Width12);
 | |
|                                 else
 | |
|                                     bounds.Height = (int)(textSize.Width + Dpi.Width6);
 | |
|                             }
 | |
|                             else
 | |
|                                 bounds.Height = imageSize.Height + Dpi.Height6;
 | |
| 
 | |
|                             if (imagePosition == eImagePosition.Top || imagePosition == eImagePosition.Left)
 | |
|                             {
 | |
|                                 if (bHasImage)
 | |
|                                     imageDrawRect = new Rectangle(0, 0, bounds.Width, imageSize.Height + Dpi.Height6);
 | |
|                                 textDrawRect = new Rectangle((int)(bounds.Width - textSize.Height) / 2, imageDrawRect.Bottom + Dpi.Width2, (int)textSize.Height, (int)textSize.Width + Dpi.Width5);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 textDrawRect = new Rectangle((int)(bounds.Width - textSize.Height) / 2, Dpi.Height5, (int)textSize.Height, (int)textSize.Width + Dpi.Width5);
 | |
|                                 if (bHasImage)
 | |
|                                     imageDrawRect = new Rectangle(0, textDrawRect.Bottom - Dpi.Height3, bounds.Width, imageSize.Height + Dpi.Height5);
 | |
|                             }
 | |
| 
 | |
|                             // Add Vertical Padding
 | |
|                             bounds.Height += Dpi.Height(button.VerticalPadding);
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     if (HasExpandPart(button))
 | |
|                     {
 | |
|                         subItemsRect = GetSubItemsButtonBounds(button, bounds, rightToLeft);
 | |
|                         // Add small button to expand the item
 | |
|                         Rectangle rTemp = subItemsRect;
 | |
|                         rTemp.Offset(bounds.Location);
 | |
| 
 | |
|                         if (rightToLeft && !(objCtrl is RibbonBar &&
 | |
|                             (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)))
 | |
|                         {
 | |
|                             if (!textDrawRect.IsEmpty)
 | |
|                                 textDrawRect.Offset(subItemsRect.Width + 1, 0);
 | |
|                             if (!imageDrawRect.IsEmpty && (button.Orientation == eOrientation.Horizontal && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right)))
 | |
|                                 imageDrawRect.Offset(subItemsRect.Width, 0);
 | |
|                             bounds.X += subItemsRect.Width;
 | |
|                         }
 | |
| 
 | |
|                         bounds = Rectangle.Union(bounds, rTemp);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 g.TextRenderingHint = TextRenderingHint.SystemDefault;
 | |
|                 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
 | |
|                 g.Dispose();
 | |
|             }
 | |
|             objCtrl = null;
 | |
| 
 | |
|             button.SetDisplayRectangle(bounds);
 | |
|             button.ImageDrawRect = imageDrawRect;
 | |
|             button.TextDrawRect = textDrawRect;
 | |
|             button.SubItemsRect = subItemsRect;
 | |
|         }
 | |
| 
 | |
|         private static bool HasExpandPart(ButtonItem button)
 | |
|         {
 | |
|             return (button.SubItems.Count > 0 || button.PopupType == ePopupType.Container) && button.ShowSubItems && !button.IsOnMenuBar &&
 | |
|                         !(button.TextMarkupBody != null && button.TextMarkupBody.HasExpandElement && button.ButtonStyle != eButtonStyle.Default);
 | |
|         }
 | |
| 
 | |
|         //private static ButtonTextSize GetTextSize(ButtonItem button, int containerWidth, bool measureShortcut)
 | |
|         //{
 | |
|         //    ButtonTextSize textSize = new ButtonTextSize();
 | |
|         //    Control ctrl = button.ContainerControl as Control;
 | |
|         //    Graphics g = BarFunctions.CreateGraphics(ctrl);
 | |
|         //    try
 | |
|         //    {
 | |
|         //        eTextFormat stringFormat = GetTextFormat(button);
 | |
|         //        Font font = button.GetFont(null);
 | |
| 
 | |
|         //        if (button.TextMarkupBody == null)
 | |
|         //        {
 | |
|         //            textSize.TextSize = TextDrawing.MeasureString(g, ButtonItemPainter.GetDrawText(button.Text), font, containerWidth, stringFormat);
 | |
|         //        }
 | |
|         //        else
 | |
|         //        {
 | |
|         //            Size availSize = new Size(containerWidth, 1);
 | |
|         //            if (containerWidth == 0)
 | |
|         //                availSize.Width = 1600;
 | |
|         //            TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, Color.Empty, false);
 | |
|         //            button.TextMarkupBody.Measure(availSize, d);
 | |
|         //            availSize = button.TextMarkupBody.Bounds.Size;
 | |
|         //            if (containerWidth != 0)
 | |
|         //                availSize.Width = containerWidth;
 | |
|         //            d.RightToLeft = button.IsRightToLeft;
 | |
|         //            button.TextMarkupBody.Arrange(new Rectangle(0, 0, availSize.Width, availSize.Height), d);
 | |
| 
 | |
|         //            textSize.TextSize = button.TextMarkupBody.Bounds.Size;
 | |
|         //        }
 | |
| 
 | |
|         //        if (measureShortcut && button.DrawShortcutText != "")
 | |
|         //            textSize.ShortcutTextSize = TextDrawing.MeasureString(g, button.DrawShortcutText, font, 0, stringFormat);
 | |
|         //    }
 | |
|         //    finally
 | |
|         //    {
 | |
|         //        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
 | |
|         //        g.TextRenderingHint = TextRenderingHint.SystemDefault;
 | |
|         //        g.Dispose();
 | |
|         //    }
 | |
|         //    return textSize;
 | |
|         //}
 | |
| 
 | |
|         private static Size GetLayoutImageSize(ButtonItem button, bool hasImage, bool isOnMenu, bool startButtonType)
 | |
|         {
 | |
|             // Get the right image size that we will use for calculation
 | |
|             Size imageSize = Size.Empty;
 | |
|             if (button.Parent != null && button.ImageFixedSize.IsEmpty && button.UseParentSubItemsImageSize)
 | |
|             {
 | |
|                 ImageItem parentImageItem = button.Parent as ImageItem;
 | |
|                 if (parentImageItem != null && !parentImageItem.SubItemsImageSize.IsEmpty)
 | |
|                 {
 | |
|                     if (!hasImage || isOnMenu)
 | |
|                         imageSize = new Size(parentImageItem.SubItemsImageSize.Width, parentImageItem.SubItemsImageSize.Height);
 | |
|                     else
 | |
|                     {
 | |
|                         if (button.Orientation == eOrientation.Horizontal)
 | |
|                             imageSize = new Size(button.ImageSize.Width, Math.Max(parentImageItem.SubItemsImageSize.Height, button.ImageSize.Height));
 | |
|                         else
 | |
|                             imageSize = new Size(Math.Max(parentImageItem.SubItemsImageSize.Width, button.ImageSize.Width), button.ImageSize.Height);
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                     imageSize = button.ImageSize;
 | |
|             }
 | |
|             else if(startButtonType && !button.ImageFixedSize.IsEmpty)
 | |
|                 imageSize = button.ImageFixedSize;
 | |
|             else if (!button.ImageFixedSize.IsEmpty)
 | |
|                 imageSize = Dpi.Size(button.ImageFixedSize);
 | |
|             else
 | |
|                 imageSize = button.ImageSize;
 | |
| 
 | |
|             if (startButtonType)
 | |
|             {
 | |
|                 Office2007Renderer renderer = GlobalManager.Renderer as Office2007Renderer;
 | |
|                 if (renderer != null && renderer.ColorTable is Office2007ColorTable)
 | |
|                 {
 | |
|                     Office2007ColorTable table = renderer.ColorTable as Office2007ColorTable;
 | |
|                     if (table.RibbonControl.StartButtonDefault != null)
 | |
|                     {
 | |
|                         if (imageSize.Width < table.RibbonControl.StartButtonDefault.Width)
 | |
|                             imageSize.Width = table.RibbonControl.StartButtonDefault.Width;
 | |
|                         if (imageSize.Height < table.RibbonControl.StartButtonDefault.Height)
 | |
|                             imageSize.Height = table.RibbonControl.StartButtonDefault.Height;
 | |
|                     }
 | |
|                 }
 | |
|                 imageSize = Dpi.ImageSize(imageSize);
 | |
|             }
 | |
| 
 | |
|             return imageSize;
 | |
|         }
 | |
| 
 | |
|         public static Rectangle GetSubItemsButtonBounds(ButtonItem button, Rectangle buttonBounds, bool rightToLeft)
 | |
|         {
 | |
|             Rectangle subItemsRect = Rectangle.Empty;
 | |
| 
 | |
|             int subItemsExpandWidth = Dpi.Width(button.SubItemsExpandWidth);
 | |
|             if (button.ContainerControl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))
 | |
|             {
 | |
|                 subItemsRect = new Rectangle(0, buttonBounds.Height, buttonBounds.Width, subItemsExpandWidth);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 // Add small button to expand the item
 | |
|                 if (button.Orientation == eOrientation.Horizontal)
 | |
|                 {
 | |
|                     if (button.IsThemed)
 | |
|                     {
 | |
|                         if (rightToLeft)
 | |
|                             subItemsRect = new Rectangle(0, 0, subItemsExpandWidth, buttonBounds.Height);
 | |
|                         else
 | |
|                             subItemsRect = new Rectangle(buttonBounds.Width, 0, subItemsExpandWidth, buttonBounds.Height);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         if (rightToLeft)
 | |
|                             subItemsRect = new Rectangle(0, 0, subItemsExpandWidth, buttonBounds.Height);
 | |
|                         else
 | |
|                             subItemsRect = new Rectangle(buttonBounds.Width + 1, 0, subItemsExpandWidth, buttonBounds.Height);
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     subItemsRect = new Rectangle(0, buttonBounds.Height - 2, buttonBounds.Width, subItemsExpandWidth);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return subItemsRect;
 | |
|         }
 | |
| 
 | |
|         public static eTextFormat GetTextFormat(ButtonItem button)
 | |
|         {
 | |
|             eTextFormat format = eTextFormat.Default;
 | |
|             if (!button._FitContainer)
 | |
|             {
 | |
|                 format |= eTextFormat.SingleLine;
 | |
|             }
 | |
|             else
 | |
|                 format |= eTextFormat.WordBreak;
 | |
| 
 | |
|             format |= eTextFormat.VerticalCenter;
 | |
|             return format;
 | |
|         }
 | |
| 
 | |
|         public static void LayoutButtonX(ButtonItem button)
 | |
|         {
 | |
|             Control objCtrl = button.ContainerControl as Control;
 | |
|             ButtonX btnX = button.ContainerControl as ButtonX;
 | |
|             if (!BarFunctions.IsHandleValid(objCtrl))
 | |
|                 return;
 | |
|             bool isOnMenu = button.IsOnMenu;
 | |
|             if (isOnMenu && button.Parent is ItemContainer)
 | |
|                 isOnMenu = false;
 | |
|             bool bHasImage = false;
 | |
| 
 | |
|             if (!string.IsNullOrEmpty(button.SymbolRealized))
 | |
|             {
 | |
|                 bHasImage = true;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 using (CompositeImage buttonImage = button.GetImage())
 | |
|                 {
 | |
|                     if (buttonImage != null)
 | |
|                         bHasImage = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             eImagePosition imagePosition = button.ImagePosition;
 | |
|             bool rightToLeft = (objCtrl.RightToLeft == RightToLeft.Yes);
 | |
| 
 | |
|             Rectangle textDrawRect = Rectangle.Empty;
 | |
|             Rectangle imageDrawRect = Rectangle.Empty;
 | |
|             Rectangle subItemsRect = Rectangle.Empty;
 | |
|             Rectangle bounds = button.Bounds;
 | |
| 
 | |
|             // Calculate sub-items rectangle
 | |
|             if (button.SubItems.Count > 0 && button.ShowSubItems &&
 | |
|                         !(button.TextMarkupBody != null && button.TextMarkupBody.HasExpandElement && button.ButtonStyle != eButtonStyle.Default))
 | |
|             {
 | |
|                 // Add small button to expand the item
 | |
|                 int subItemsExpandWidth = Dpi.Width(button.SubItemsExpandWidth);
 | |
|                 if (button.Orientation == eOrientation.Horizontal)
 | |
|                 {
 | |
|                     if (rightToLeft)
 | |
|                         subItemsRect = new Rectangle(0, 0, subItemsExpandWidth, bounds.Height);
 | |
|                     else
 | |
|                         subItemsRect = new Rectangle(bounds.Width - subItemsExpandWidth, 0, subItemsExpandWidth, bounds.Height);
 | |
|                     if (rightToLeft)
 | |
|                         bounds.X += subItemsExpandWidth + 1;
 | |
|                     bounds.Width -= subItemsExpandWidth + 1;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     subItemsRect = new Rectangle(0, bounds.Height - subItemsExpandWidth, bounds.Width, subItemsExpandWidth);
 | |
|                     bounds.Height -= subItemsExpandWidth + 1;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Adjust image position
 | |
|             if (rightToLeft && button.Orientation == eOrientation.Horizontal)
 | |
|             {
 | |
|                 if (imagePosition == eImagePosition.Left)
 | |
|                     imagePosition = eImagePosition.Right;
 | |
|                 else if (imagePosition == eImagePosition.Right)
 | |
|                     imagePosition = eImagePosition.Left;
 | |
|             }
 | |
| 
 | |
|             int measureStringWidth = 0;
 | |
| 
 | |
|             measureStringWidth = bounds.Width;
 | |
| 
 | |
|             Graphics g = BarFunctions.CreateGraphics(objCtrl);
 | |
|             try
 | |
|             {
 | |
| 
 | |
|                 // Get the right image size that we will use for calculation
 | |
|                 Size imageSize = Size.Empty;
 | |
|                 if (!string.IsNullOrEmpty(button.SymbolRealized))
 | |
|                 {
 | |
|                     Font symFont = Symbols.GetFont(button.SymbolSize, button.SymbolSet);
 | |
|                     imageSize = TextDrawing.MeasureStringLegacy(g, button.SymbolRealized, symFont, Size.Empty, eTextFormat.Default);
 | |
|                     int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) *
 | |
|                     symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style)));
 | |
|                     imageSize.Height -= descent;
 | |
|                     button.ImageSize = imageSize;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (!button.ImageFixedSize.IsEmpty)
 | |
|                         imageSize = button.ImageFixedSize;
 | |
|                     else
 | |
|                         imageSize = button.ImageSize;
 | |
|                 }
 | |
| 
 | |
|                 if (bHasImage && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right))
 | |
|                 {
 | |
|                     if (btnX != null)
 | |
|                         measureStringWidth -= imageSize.Width + btnX.ImageTextSpacing * 2 + 3;
 | |
|                     else
 | |
|                         measureStringWidth -= (imageSize.Width + 8);
 | |
|                 }
 | |
| 
 | |
|                 if (bHasImage && !imageSize.IsEmpty && btnX != null && btnX.ImageTextSpacing != 0)
 | |
|                 {
 | |
|                     if (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right)
 | |
|                         imageSize.Width += btnX.ImageTextSpacing * 2;
 | |
|                     else
 | |
|                         imageSize.Height += btnX.ImageTextSpacing * 2;
 | |
|                 }
 | |
| 
 | |
|                 // Measure string
 | |
|                 Font font = button.GetFont(null, true);
 | |
| 
 | |
|                 SizeF textSize = SizeF.Empty;
 | |
|                 eTextFormat stringFormat = eTextFormat.Default | eTextFormat.VerticalCenter;
 | |
| #if FRAMEWORK20
 | |
|                 if (BarFunctions.IsWindowsXP && BarUtilities.UseTextRenderer) stringFormat |= eTextFormat.LeftAndRightPadding;
 | |
| #endif
 | |
|                 if (btnX != null || objCtrl is RibbonBar && button.RibbonWordWrap) stringFormat |= eTextFormat.WordBreak;
 | |
|                 if (btnX != null && !btnX.UseMnemonic) stringFormat |= eTextFormat.NoPrefix;
 | |
| 
 | |
|                 if (button.Text != "")
 | |
|                 {
 | |
|                     if (button.TextMarkupBody == null)
 | |
|                     {
 | |
|                         if (button.Orientation == eOrientation.Vertical && !isOnMenu)
 | |
|                             textSize = TextDrawing.MeasureStringLegacy(g, ButtonItemPainter.GetDrawText(button.Text), font, new Size(measureStringWidth, 0), stringFormat);
 | |
|                         else
 | |
|                         {
 | |
|                             textSize = TextDrawing.MeasureString(g, ButtonItemPainter.GetDrawText(button.Text), font, measureStringWidth, stringFormat);
 | |
| #if FRAMEWORK20
 | |
|                             if (BarFunctions.IsWindowsXP && BarUtilities.UseTextRenderer) textSize.Width += 2;
 | |
| #endif
 | |
|                         }
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         Size availSize = new Size(measureStringWidth, 1);
 | |
|                         if (measureStringWidth == 0)
 | |
|                             availSize.Width = 1600;
 | |
|                         TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, Color.Empty, false);
 | |
|                         d.RightToLeft = rightToLeft;
 | |
|                         button.TextMarkupBody.Measure(availSize, d);
 | |
|                         availSize = button.TextMarkupBody.Bounds.Size;
 | |
|                         button.TextMarkupBody.Arrange(new Rectangle(0, 0, availSize.Width, availSize.Height), d);
 | |
| 
 | |
|                         textSize = button.TextMarkupBody.Bounds.Size;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 if (button.Orientation == eOrientation.Horizontal && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right))
 | |
|                 {
 | |
|                     // Recalc size for the Bar button
 | |
|                     // Add 8 pixel padding to the image size, 4 pixels on each side
 | |
|                     if (button.ButtonStyle != eButtonStyle.Default || !bHasImage)
 | |
|                         imageSize.Width += 4;
 | |
| 
 | |
|                     imageDrawRect = Rectangle.Empty;
 | |
|                     if (button.ButtonStyle != eButtonStyle.TextOnlyAlways && bHasImage)
 | |
|                     {
 | |
|                         // We know the image position now, we will center it into this area
 | |
|                         if (imagePosition == eImagePosition.Left)
 | |
|                         {
 | |
|                             if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Left)
 | |
|                                 imageDrawRect = new Rectangle(2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             else if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Right)
 | |
|                                 imageDrawRect = new Rectangle(bounds.Width - (imageSize.Width + (int)Math.Ceiling(textSize.Width) + 4), (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             else if (btnX != null)
 | |
|                                 imageDrawRect = new Rectangle(/*bounds.X+*/(int)(bounds.Width - (textSize.Width + imageSize.Width)) / 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             else
 | |
|                             {
 | |
|                                 if (subItemsRect.IsEmpty && button.ButtonStyle == eButtonStyle.Default)
 | |
|                                     imageDrawRect = new Rectangle((bounds.Width - imageSize.Width) / 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                                 else
 | |
|                                     imageDrawRect = new Rectangle(0, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             }
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Left)
 | |
|                                 imageDrawRect = new Rectangle((int)textSize.Width + 4, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             else if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Right)
 | |
|                                 imageDrawRect = new Rectangle(bounds.Width - imageSize.Width, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             else if (btnX != null)
 | |
|                                 imageDrawRect = new Rectangle(bounds.Width - (int)(bounds.Width - (textSize.Width + imageSize.Width)) / 2 - (imageSize.Width), (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                             else
 | |
|                                 imageDrawRect = new Rectangle(bounds.Width - imageSize.Width, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     // Draw Text only if needed
 | |
|                     textDrawRect = Rectangle.Empty;
 | |
|                     if (button.ButtonStyle != eButtonStyle.Default || !bHasImage)
 | |
|                     {
 | |
|                         if (bHasImage)
 | |
|                         {
 | |
|                             if (imagePosition == eImagePosition.Left)
 | |
|                             {
 | |
|                                 if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Center)
 | |
|                                     textDrawRect = new Rectangle(imageDrawRect.Right + 1, (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width, (int)textSize.Height);
 | |
|                                 else if (btnX != null && (btnX.TextAlignment == eButtonTextAlignment.Right || btnX.TextAlignment == eButtonTextAlignment.Left))
 | |
|                                     textDrawRect = new Rectangle(imageDrawRect.Right + 1, (int)((bounds.Height - textSize.Height) / 2), bounds.Width - 3 - imageDrawRect.Width, (int)textSize.Height);
 | |
|                                 else
 | |
|                                     textDrawRect = new Rectangle(imageDrawRect.Right + 1, (int)((bounds.Height - textSize.Height) / 2), bounds.Width - 3 - imageDrawRect.Width, (int)textSize.Height);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Center)
 | |
|                                     textDrawRect = new Rectangle((int)(imageDrawRect.X - textSize.Width) - 1, (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width, (int)textSize.Height);
 | |
|                                 else if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Right)
 | |
|                                     textDrawRect = new Rectangle(imageDrawRect.X - ((int)textSize.Width + 4), (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width + 2, (int)textSize.Height);
 | |
|                                 else
 | |
|                                     textDrawRect = new Rectangle(3, (int)((bounds.Height - textSize.Height) / 2), imageDrawRect.X - 2, (int)textSize.Height);
 | |
|                             }
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Center || button._FixedSizeCenterText)
 | |
|                                 textDrawRect = new Rectangle(/*bounds.X+*/(int)((bounds.Width - textSize.Width) / 2), (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width, (int)textSize.Height);
 | |
|                             else
 | |
|                                 textDrawRect = new Rectangle(/*bounds.X +*/ 3, (int)((bounds.Height - textSize.Height) / 2), bounds.Width - 6, (int)textSize.Height);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     // Image is on top or bottom
 | |
|                     // Calculate width, that is easy
 | |
|                     if (button.Orientation == eOrientation.Horizontal)
 | |
|                     {
 | |
| 
 | |
|                         if (imagePosition == eImagePosition.Top)
 | |
|                         {
 | |
|                             imageDrawRect = new Rectangle(0, (int)(bounds.Height - (imageSize.Height + textSize.Height)) / 2, bounds.Width, imageSize.Height/*+2*/);
 | |
|                             textDrawRect = new Rectangle(0, imageDrawRect.Bottom, (int)textSize.Width, (int)textSize.Height + 5);
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, (int)(bounds.Height - (imageSize.Height + textSize.Height)) / 2, (int)textSize.Width, (int)textSize.Height);
 | |
|                             imageDrawRect = new Rectangle(0, textDrawRect.Bottom, bounds.Width, imageSize.Height + 5);
 | |
|                         }
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         if (imagePosition == eImagePosition.Top || imagePosition == eImagePosition.Left)
 | |
|                         {
 | |
|                             if (bHasImage)
 | |
|                             {
 | |
|                                 if (subItemsRect.IsEmpty && button.ButtonStyle == eButtonStyle.Default)
 | |
|                                     imageDrawRect = new Rectangle((bounds.Width - imageSize.Width) / 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
 | |
|                                 else
 | |
|                                     imageDrawRect = new Rectangle(0, 0, bounds.Width, imageSize.Height + 6);
 | |
|                             }
 | |
|                             textDrawRect = new Rectangle((int)(bounds.Width - textSize.Height) / 2, imageDrawRect.Bottom + 2, (int)textSize.Height, (int)textSize.Width + 5);
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, 0, (int)textSize.Height, (int)textSize.Width + 5);
 | |
|                             if (bHasImage)
 | |
|                                 imageDrawRect = new Rectangle(0, textDrawRect.Bottom + 2, bounds.Width, imageSize.Height + 5);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 g.TextRenderingHint = TextRenderingHint.SystemDefault;
 | |
|                 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
 | |
|                 g.Dispose();
 | |
|             }
 | |
| 
 | |
|             button.ImageDrawRect = imageDrawRect;
 | |
|             button.TextDrawRect = textDrawRect;
 | |
|             button.SubItemsRect = subItemsRect;
 | |
|         }
 | |
| 
 | |
|         private struct ButtonTextSize
 | |
|         {
 | |
|             public Size TextSize;
 | |
|             public Size ShortcutTextSize;
 | |
|         }
 | |
|     }
 | |
| }
 |