236 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Summary description for ThemedButtonItemPainter.
 | 
						|
	/// </summary>
 | 
						|
	public class ThemedButtonItemPainter
 | 
						|
	{
 | 
						|
		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();
 | 
						|
		}
 | 
						|
 | 
						|
		private static eTextFormat GetStringFormat(ButtonItem button, ItemPaintArgs pa, CompositeImage image)
 | 
						|
		{
 | 
						|
			eTextFormat stringFormat=pa.ButtonStringFormat;
 | 
						|
			bool isOnMenu = IsOnMenu(button, pa);
 | 
						|
			if(!isOnMenu)
 | 
						|
			{
 | 
						|
				if(button.ContainerControl is RibbonStrip && (image==null || button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom))
 | 
						|
					stringFormat |= eTextFormat.HorizontalCenter;
 | 
						|
				else if(pa.IsOnMenuBar || pa.ContainerControl is Bar && image==null || button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom)
 | 
						|
					stringFormat |= eTextFormat.HorizontalCenter;
 | 
						|
			}
 | 
						|
			return stringFormat;
 | 
						|
		}
 | 
						|
 | 
						|
		private static bool IsOnMenu(ButtonItem button, ItemPaintArgs pa)
 | 
						|
		{
 | 
						|
			bool isOnMenu = pa.IsOnMenu;
 | 
						|
			if (isOnMenu && button.Parent is ItemContainer)
 | 
						|
				isOnMenu = false;
 | 
						|
			return isOnMenu;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |