Esempio n. 1
0
		public static void PaintButton(ButtonItem button, ItemPaintArgs pa)
		{
			System.Drawing.Graphics g=pa.Graphics;
			ThemeToolbar theme=pa.ThemeToolbar;
			ThemeToolbarParts part=ThemeToolbarParts.Button;
			ThemeToolbarStates state=ThemeToolbarStates.Normal;
			Color textColor=ButtonItemPainterHelper.GetTextColor(button,pa);

			Rectangle rectImage=Rectangle.Empty;
			Rectangle itemRect=button.DisplayRectangle;
			
			Font font=null;
			CompositeImage image=button.GetImage();

			font=button.GetFont(pa, false);

			eTextFormat format= GetStringFormat(button, pa, image);

			bool bSplitButton=(button.SubItems.Count>0 || button.PopupType==ePopupType.Container) && button.ShowSubItems && !button.SubItemsRect.IsEmpty;

			if(bSplitButton)
				part=ThemeToolbarParts.SplitButton;

			// Calculate image position
			if(image!=null)
			{
				if(button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom)
					rectImage=new Rectangle(button.ImageDrawRect.X,button.ImageDrawRect.Y,itemRect.Width,button.ImageDrawRect.Height);
				else
					rectImage=new Rectangle(button.ImageDrawRect.X,button.ImageDrawRect.Y,button.ImageDrawRect.Width,button.ImageDrawRect.Height);

				rectImage.Offset(itemRect.Left,itemRect.Top);
				rectImage.Offset((rectImage.Width-button.ImageSize.Width)/2,(rectImage.Height-button.ImageSize.Height)/2);
				rectImage.Width=button.ImageSize.Width;
				rectImage.Height=button.ImageSize.Height;
			}

			// Set the state and text brush
			if(!ButtonItemPainter.IsItemEnabled(button, pa))
			{
				state=ThemeToolbarStates.Disabled;
			}
			else if(button.IsMouseDown)
			{
				state=ThemeToolbarStates.Pressed;
			}
			else if(button.IsMouseOver && button.Checked)
			{
				state=ThemeToolbarStates.HotChecked;
			}
			else if(button.IsMouseOver || button.Expanded)
			{
				state=ThemeToolbarStates.Hot;
			}
			else if(button.Checked)
			{
				state=ThemeToolbarStates.Checked;
			}
			
			Rectangle backRect=button.DisplayRectangle;
			if(button.HotTrackingStyle==eHotTrackingStyle.Image && image!=null)
			{
				backRect=rectImage;
				backRect.Inflate(3,3);
			}
			else if(bSplitButton)
			{
				backRect.Width=backRect.Width-button.SubItemsRect.Width;
			}

			// Draw Button Background
			if(button.HotTrackingStyle!=eHotTrackingStyle.None)
			{
				theme.DrawBackground(g,part,state,backRect);
			}

			// Draw Image
			if(image!=null && button.ButtonStyle!=eButtonStyle.TextOnlyAlways)
			{
				if(state==ThemeToolbarStates.Normal && 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};
					System.Drawing.Imaging.ColorMatrix grayMatrix = new System.Drawing.Imaging.ColorMatrix(array);
					System.Drawing.Imaging.ImageAttributes att = new System.Drawing.Imaging.ImageAttributes();
					att.SetColorMatrix(grayMatrix);
					//g.DrawImage(image,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,att);
					image.DrawImage(g,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,att);
				}
				else if(state==ThemeToolbarStates.Normal && !image.IsIcon)
				{
					// Draw image little bit lighter, I decied to use gamma it is easy
					System.Drawing.Imaging.ImageAttributes lightImageAttr = new System.Drawing.Imaging.ImageAttributes();
					lightImageAttr.SetGamma(.7f,System.Drawing.Imaging.ColorAdjustType.Bitmap);
					//g.DrawImage(image,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,lightImageAttr);
					image.DrawImage(g,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,lightImageAttr);
				}
				else
				{
					image.DrawImage(g,rectImage);
				}
			}

			// Draw Text
			if(button.ButtonStyle==eButtonStyle.ImageAndText || button.ButtonStyle==eButtonStyle.TextOnlyAlways || image==null)
			{
				Rectangle rectText=button.TextDrawRect;
				if(button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom)
				{
					if(button.Orientation==eOrientation.Vertical)
					{
						rectText=new Rectangle(button.TextDrawRect.X,button.TextDrawRect.Y,button.TextDrawRect.Width,button.TextDrawRect.Height);
					}
					else
					{
						rectText=new Rectangle(button.TextDrawRect.X,button.TextDrawRect.Y,itemRect.Width,button.TextDrawRect.Height);
						if((button.SubItems.Count>0 || button.PopupType==ePopupType.Container) && button.ShowSubItems)
							rectText.Width-=10;
					}
					format|=eTextFormat.HorizontalCenter;
				}

				rectText.Offset(itemRect.Left,itemRect.Top);

				if(button.Orientation==eOrientation.Vertical)
				{
					g.RotateTransform(90);
					TextDrawing.DrawStringLegacy(g,ButtonItemPainter.GetDrawText(button.Text),font,textColor,new Rectangle(rectText.Top,-rectText.Right,rectText.Height,rectText.Width),format);
					g.ResetTransform();
				}
				else
				{
					if(rectText.Right>button.DisplayRectangle.Right)
						rectText.Width=button.DisplayRectangle.Right-rectText.Left;
					TextDrawing.DrawString(g,ButtonItemPainter.GetDrawText(button.Text),font,textColor,rectText,format);
					if(!button.DesignMode && button.Focused && !pa.IsOnMenu && !pa.IsOnMenuBar)
					{
						//SizeF szf=g.MeasureString(m_Text,font,rectText.Width,format);
						Rectangle r=rectText;
						//r.Width=(int)Math.Ceiling(szf.Width);
						//r.Height=(int)Math.Ceiling(szf.Height);
						//r.Inflate(1,1);
						System.Windows.Forms.ControlPaint.DrawFocusRectangle(g,r);
					}
				}				
			}

			// If it has subitems draw the triangle to indicate that
			if(bSplitButton)
			{
				part=ThemeToolbarParts.SplitButtonDropDown;
				
				if(!ButtonItemPainter.IsItemEnabled(button, pa))
					state=ThemeToolbarStates.Disabled;
				else
					state=ThemeToolbarStates.Normal;

				if(button.HotTrackingStyle!=eHotTrackingStyle.None && button.HotTrackingStyle!=eHotTrackingStyle.Image && ButtonItemPainter.IsItemEnabled(button, pa))
				{
					if(button.Expanded || button.IsMouseDown)
						state=ThemeToolbarStates.Pressed;
					else if(button.IsMouseOver && button.Checked)
						state=ThemeToolbarStates.HotChecked;
					else if(button.Checked)
						state=ThemeToolbarStates.Checked;
					else if(button.IsMouseOver)
						state=ThemeToolbarStates.Hot;
				}

                if (!button.AutoExpandOnClick)
                {
                    if (button.Orientation == eOrientation.Horizontal)
                    {
                        Rectangle r = button.SubItemsRect;
                        r.Offset(itemRect.X, itemRect.Y);
                        theme.DrawBackground(g, part, state, r);
                    }
                    else
                    {
                        Rectangle r = button.SubItemsRect;
                        r.Offset(itemRect.X, itemRect.Y);
                        theme.DrawBackground(g, part, state, r);
                    }
                }
			}

			if(button.Focused && button.DesignMode)
			{
				Rectangle r=itemRect;
				r.Inflate(-1,-1);
				DesignTime.DrawDesignTimeSelection(g,r,pa.Colors.ItemDesignTimeBorder);
			}

			if(image!=null)
				image.Dispose();
		}
Esempio n. 2
0
		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;
            try
            {
                g.SetClip(button.DisplayRectangle, CombineMode.Intersect);

                if (!pa.IsOnMenu && !bIsOnMenuBar && bThemed)
                {
                    if (pa.ContainerControl is ButtonX)
                        ThemedButtonXPainter.PaintButton(button, pa);
                    else
                        ThemedButtonItemPainter.PaintButton(button, pa);
                    return;
                }

                Rectangle itemRect = button.DisplayRectangle;

                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.Symbol)) && button.ButtonStyle != eButtonStyle.TextOnlyAlways)
                    PaintButtonImage(button, pa, image, imageRect);

                if (!(button is ApplicationButton) || button.EffectiveStyle == eDotNetBarStyle.Office2010 || button.EffectiveStyle == eDotNetBarStyle.Metro)
                    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();
            }
		}
Esempio n. 3
0
        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)
            {
                button.SetDisplayRectangle(new Rectangle(button.DisplayRectangle.Location, button.FixedSize));
                LayoutButtonX(button);
                return;
            }

            bool isOnMenu = button.IsOnMenu;
            if (isOnMenu && button.Parent is ItemContainer)
                isOnMenu = false;
            bool bHasImage = false;
            bool isSymbolImage = false;
            if (!string.IsNullOrEmpty(button.Symbol))
            {
                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.GetFontAwesome(button.SymbolSize);
                    
                    if(button.IsOnMenu) // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest
                        imageSize = TextDrawing.MeasureString(g, "\uF00A", symFont);
                    else
                        imageSize = TextDrawing.MeasureString(g, button.Symbol, symFont);

                    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 + 10);
                }
                else if (button.RibbonWordWrap && bHasImage && imagePosition == eImagePosition.Top && objCtrl is RibbonBar && UseRibbonWordBreak(button))
                {
                    measureStringWidth = imageSize.Width + 4;
                    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 < 3)
                    {
                        measureStringWidth += increase;
                        textSize = ButtonItemLayout.MeasureItemText(button, g, measureStringWidth, font, stringFormat, rightToLeft, ribbonBarButton, imagePosition);
                        maxItt++;
                    }
                    if (/*!ribbonBarButton &&*/ objCtrl is RibbonBar && bHasImage && imagePosition == eImagePosition.Top)
                        textSize.Height += 2;
                }

                // See if this button is on menu, and do appropriate calculations
                if (isOnMenu)
                {
                    if (imageSize.IsEmpty)
                        imageSize = new Size(16, 16);

                    // Add 4 pixel padding to the image size, 2 pixels on each side
                    imageSize.Height += 2;
                    imageSize.Width += 7;

                    // Calculate item height
                    if (textSize.Height > imageSize.Height)
                        bounds.Height = (int)textSize.Height + 4;
                    else
                        bounds.Height = imageSize.Height + 4;

                    // Add Vertical Padding to it
                    bounds.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 + 2, (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 + 8 + 26);
                    bounds.Width += button.HorizontalPadding;
                }
                else
                {
                    bool bThemed = button.IsThemed;
                    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 += button.ImagePaddingHorizontal;

                        // Calculate item height
                        if (textSize.Height > imageSize.Height)
                            bounds.Height = (int)textSize.Height + button.ImagePaddingVertical;
                        else
                            bounds.Height = imageSize.Height + button.ImagePaddingVertical;

                        // Add Vertical Padding
                        bounds.Height += button.VerticalPadding;

                        if (bThemed && !button.IsOnMenuBar)
                            bounds.Height += 4;

                        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 + 6;
                                if (!bHasImage && button.IsOnMenuBar)
                                {
                                    bounds.Width += 6;
                                    textDrawRect = new Rectangle(2, 2, bounds.Width, bounds.Height - 4);
                                }
                                else
                                    textDrawRect = new Rectangle(2, 2, bounds.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 += 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 + button.ImagePaddingHorizontal;
                            else
                                bounds.Width = imageSize.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 + button.ImagePaddingVertical /*10*/);

                            // Add Horizontal/Vertical padding
                            bounds.Width += button.HorizontalPadding;
                            bounds.Height += button.VerticalPadding;

                            if (imagePosition == eImagePosition.Top)
                            {
                                imageDrawRect = new Rectangle(0, 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, 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 += 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 + 12);
                                else
                                    bounds.Height = (int)(textSize.Width + 6);
                            }
                            else
                                bounds.Height = imageSize.Height + 6;

                            if (imagePosition == eImagePosition.Top || imagePosition == eImagePosition.Left)
                            {
                                if (bHasImage)
                                    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.Height) / 2, 5, (int)textSize.Height, (int)textSize.Width + 5);
                                if (bHasImage)
                                    imageDrawRect = new Rectangle(0, textDrawRect.Bottom - 3, bounds.Width, imageSize.Height + 5);
                            }

                            // Add Vertical Padding
                            bounds.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;
        }
Esempio n. 4
0
        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.Symbol))
            {
                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
                if (button.Orientation == eOrientation.Horizontal)
                {
                    if (rightToLeft)
                        subItemsRect = new Rectangle(0, 0, button.SubItemsExpandWidth, bounds.Height);
                    else
                        subItemsRect = new Rectangle(bounds.Width - button.SubItemsExpandWidth, 0, button.SubItemsExpandWidth, bounds.Height);
                    if (rightToLeft)
                        bounds.X += button.SubItemsExpandWidth + 1;
                    bounds.Width -= button.SubItemsExpandWidth + 1;
                }
                else
                {
                    subItemsRect = new Rectangle(0, bounds.Height - button.SubItemsExpandWidth, bounds.Width, button.SubItemsExpandWidth);
                    bounds.Height -= button.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.Symbol))
                {
                    Font symFont = Symbols.GetFontAwesome(button.SymbolSize);
                    imageSize = TextDrawing.MeasureStringLegacy(g, button.Symbol, 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 (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;
        }
Esempio n. 5
0
        /// <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 = 8;
            bool isOnMenu = button.IsOnMenu;
            if (isOnMenu && button.Parent is ItemContainer)
                isOnMenu = false;
            bool hasImage = false;

            Size imageSize = Size.Empty;
            if (!string.IsNullOrEmpty(button.Symbol))
            {
                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 += 2;
                imageSize.Width += 7;
                // 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));
            }
        }