360 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Summary description for SimpleElementLayout.
 | 
						|
	/// </summary>
 | 
						|
	internal class SimpleElementLayout
 | 
						|
	{
 | 
						|
        internal static void LayoutSimpleElement(SimpleElementLayoutInfo info)
 | 
						|
        {
 | 
						|
            Size textsize = Size.Empty;
 | 
						|
            Font font = info.Font;
 | 
						|
            int height = 0;
 | 
						|
            if (info.LayoutStyle.Font != null)
 | 
						|
                font = info.LayoutStyle.Font;
 | 
						|
 | 
						|
            // Calculate Text Width and Height
 | 
						|
            string text = info.Element.Text;
 | 
						|
            if (info.Element.FixedWidth == 0)
 | 
						|
            {
 | 
						|
                if (info.Element.TextVisible)
 | 
						|
                {
 | 
						|
                    if (!string.IsNullOrEmpty(text))
 | 
						|
                    {
 | 
						|
                        textsize = TextDrawing.MeasureString(info.Graphics, text, font);
 | 
						|
                        //textSize=info.Graphics.MeasureString(text,font);
 | 
						|
                        if (info.LayoutStyle != null && !info.LayoutStyle.TextShadowColor.IsEmpty && !info.LayoutStyle.TextShadowOffset.IsEmpty)
 | 
						|
                            textsize.Height += info.LayoutStyle.TextShadowOffset.Y;
 | 
						|
                        info.Element.TextSize = textsize;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                int availTextWidth = info.Element.FixedWidth -
 | 
						|
                    ElementStyleLayout.HorizontalStyleWhiteSpace(info.LayoutStyle);
 | 
						|
 | 
						|
                if (info.Element.ImageVisible)
 | 
						|
                    availTextWidth -= info.Element.ImageLayoutSize.Width;
 | 
						|
 | 
						|
                if (info.Element.TextVisible)
 | 
						|
                {
 | 
						|
                    int elementHeight = font.Height;
 | 
						|
                    if (info.LayoutStyle != null && !info.LayoutStyle.TextShadowColor.IsEmpty && !info.LayoutStyle.TextShadowOffset.IsEmpty)
 | 
						|
                        elementHeight += info.LayoutStyle.TextShadowOffset.Y;
 | 
						|
 | 
						|
                    if (info.LayoutStyle.WordWrap)
 | 
						|
                    {
 | 
						|
                        elementHeight = info.LayoutStyle.MaximumHeight - info.LayoutStyle.MarginTop -
 | 
						|
                                      info.LayoutStyle.MarginBottom - info.LayoutStyle.PaddingTop - info.LayoutStyle.PaddingBottom;
 | 
						|
                        if (availTextWidth > 0)
 | 
						|
                        {
 | 
						|
                            if (elementHeight > 0)
 | 
						|
                            {
 | 
						|
                                textsize = TextDrawing.MeasureString(info.Graphics, text, font,
 | 
						|
                                    new Size(availTextWidth, elementHeight), info.LayoutStyle.TextFormat);
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                                textsize = TextDrawing.MeasureString(info.Graphics, text, font, availTextWidth, info.LayoutStyle.TextFormat);
 | 
						|
                            info.Element.TextSize = textsize;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        if (!string.IsNullOrEmpty(text))
 | 
						|
                            info.Element.TextSize = TextDrawing.MeasureString(info.Graphics, text, font);
 | 
						|
                        textsize = new Size(availTextWidth, elementHeight);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (info.Element.TextVisible && !info.LayoutStyle.TextShadowColor.IsEmpty)
 | 
						|
            {
 | 
						|
                textsize.Height += info.LayoutStyle.TextShadowOffset.Y;
 | 
						|
            }
 | 
						|
            height = textsize.Height;
 | 
						|
 | 
						|
            if (info.VerticalPartAlignment)
 | 
						|
            {
 | 
						|
                if (info.Element.ImageVisible && info.Element.ImageLayoutSize.Height > 0)
 | 
						|
                    height += info.Element.ImageLayoutSize.Height;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (info.Element.ImageVisible && info.Element.ImageLayoutSize.Height > height)
 | 
						|
                    height = info.Element.ImageLayoutSize.Height;
 | 
						|
            }
 | 
						|
 | 
						|
            Rectangle r = new Rectangle(info.Left + ElementStyleLayout.LeftWhiteSpace(info.LayoutStyle),
 | 
						|
                info.Top + ElementStyleLayout.TopWhiteSpace(info.LayoutStyle)
 | 
						|
                , info.Element.FixedWidth - ElementStyleLayout.HorizontalStyleWhiteSpace(info.LayoutStyle), height);
 | 
						|
 | 
						|
            if (r.Width == 0)
 | 
						|
            {
 | 
						|
                if (info.VerticalPartAlignment)
 | 
						|
                {
 | 
						|
                    if (info.Element.TextVisible)
 | 
						|
                        r.Width = textsize.Width;
 | 
						|
                    if (info.Element.ImageVisible && info.Element.ImageLayoutSize.Width > r.Width)
 | 
						|
                        r.Width = (info.Element.ImageLayoutSize.Width + info.Element.ImageTextSpacing);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    if (info.Element.TextVisible)
 | 
						|
                        r.Width = textsize.Width;
 | 
						|
                    if (info.Element.ImageVisible && info.Element.ImageLayoutSize.Width > 0)
 | 
						|
                        r.Width += (info.Element.ImageLayoutSize.Width + info.Element.ImageTextSpacing);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            // Now that we have element bounds store them
 | 
						|
            Rectangle rElementBounds = new Rectangle(info.Left, info.Top, info.Element.FixedWidth, r.Height + info.LayoutStyle.MarginTop + info.LayoutStyle.MarginBottom + info.LayoutStyle.PaddingTop + info.LayoutStyle.PaddingBottom);
 | 
						|
            if (rElementBounds.Width == 0)
 | 
						|
                rElementBounds.Width = r.Width + ElementStyleLayout.HorizontalStyleWhiteSpace(info.LayoutStyle);
 | 
						|
            info.Element.Bounds = rElementBounds;
 | 
						|
 | 
						|
            // Set Position of the image
 | 
						|
            if (info.Element.ImageVisible && !info.Element.ImageLayoutSize.IsEmpty)
 | 
						|
            {
 | 
						|
                eVerticalAlign va = GetImageVerticalAlign(info.Element.ImageAlignment);
 | 
						|
                eHorizontalAlign ha = GetImageHorizontalAlign(info.Element.ImageAlignment, info.LeftToRight);
 | 
						|
                if (info.VerticalPartAlignment)
 | 
						|
                    info.Element.ImageBounds = AlignContentVertical(info.Element.ImageLayoutSize, ref r, ha, va, info.Element.ImageTextSpacing);
 | 
						|
                else
 | 
						|
                    info.Element.ImageBounds = AlignContent(info.Element.ImageLayoutSize, ref r, ha, va, info.Element.ImageTextSpacing);
 | 
						|
            }
 | 
						|
            else
 | 
						|
                info.Element.ImageBounds = Rectangle.Empty;
 | 
						|
 | 
						|
 | 
						|
            // Set position of the text
 | 
						|
            if (!textsize.IsEmpty)
 | 
						|
                info.Element.TextBounds = r;
 | 
						|
            else
 | 
						|
                info.Element.TextBounds = Rectangle.Empty;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
		private static Rectangle AlignContent(System.Drawing.Size contentSize, ref Rectangle boundingRectangle, eHorizontalAlign horizAlign, eVerticalAlign vertAlign, int contentSpacing)
 | 
						|
		{
 | 
						|
			Rectangle contentRect=new Rectangle(Point.Empty,contentSize);
 | 
						|
			switch(horizAlign)
 | 
						|
			{
 | 
						|
				case eHorizontalAlign.Right:
 | 
						|
				{
 | 
						|
					contentRect.X=boundingRectangle.Right-contentRect.Width;
 | 
						|
					boundingRectangle.Width-=(contentRect.Width+contentSpacing);
 | 
						|
					break;
 | 
						|
				}
 | 
						|
					//case eHorizontalAlign.Left:
 | 
						|
				default:
 | 
						|
				{
 | 
						|
					contentRect.X=boundingRectangle.X;
 | 
						|
					boundingRectangle.X=contentRect.Right+contentSpacing;
 | 
						|
					boundingRectangle.Width-=(contentRect.Width+contentSpacing);
 | 
						|
					break;
 | 
						|
				}
 | 
						|
					//				case eHorizontalAlign.Center:
 | 
						|
					//				{
 | 
						|
					//					contentRect.X=boundingRectangle.X+(boundingRectangle.Width-contentRect.Width)/2;
 | 
						|
					//					break;
 | 
						|
					//				}
 | 
						|
			}
 | 
						|
 | 
						|
			switch(vertAlign)
 | 
						|
			{
 | 
						|
				case eVerticalAlign.Top:
 | 
						|
				{
 | 
						|
					contentRect.Y=boundingRectangle.Y;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
				case eVerticalAlign.Middle:
 | 
						|
				{
 | 
						|
					contentRect.Y=boundingRectangle.Y+(boundingRectangle.Height-contentRect.Height)/2;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
				case eVerticalAlign.Bottom:
 | 
						|
				{
 | 
						|
					contentRect.Y=boundingRectangle.Bottom-contentRect.Height;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			return contentRect;
 | 
						|
		}
 | 
						|
 | 
						|
		private static Rectangle AlignContentVertical(System.Drawing.Size contentSize, ref Rectangle boundingRectangle, eHorizontalAlign horizAlign, eVerticalAlign vertAlign, int contentSpacing)
 | 
						|
		{
 | 
						|
			Rectangle contentRect=new Rectangle(Point.Empty,contentSize);
 | 
						|
			switch(horizAlign)
 | 
						|
			{
 | 
						|
				case eHorizontalAlign.Left:
 | 
						|
				{
 | 
						|
					contentRect.X=boundingRectangle.X;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
				case eHorizontalAlign.Right:
 | 
						|
				{
 | 
						|
					contentRect.X=boundingRectangle.Right-contentRect.Width;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
				case eHorizontalAlign.Center:
 | 
						|
				{
 | 
						|
					contentRect.X=boundingRectangle.X+(boundingRectangle.Width-contentRect.Width)/2;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			switch(vertAlign)
 | 
						|
			{
 | 
						|
				case eVerticalAlign.Bottom:
 | 
						|
				{
 | 
						|
					contentRect.Y=boundingRectangle.Bottom-contentRect.Height;
 | 
						|
					boundingRectangle.Height-=(contentRect.Height+contentSpacing);
 | 
						|
					break;
 | 
						|
				}
 | 
						|
					//case eVerticalAlign.Top:
 | 
						|
				default:
 | 
						|
				{
 | 
						|
					contentRect.Y=boundingRectangle.Y;
 | 
						|
					boundingRectangle.Y=contentRect.Bottom+contentSpacing;
 | 
						|
					boundingRectangle.Height-=(contentRect.Height+contentSpacing);
 | 
						|
					break;
 | 
						|
				}
 | 
						|
					//				case eVerticalAlign.Middle:
 | 
						|
					//				{
 | 
						|
					//					contentRect.Y=boundingRectangle.Y+(boundingRectangle.Height-contentRect.Height)/2;
 | 
						|
					//					break;
 | 
						|
					//				}
 | 
						|
			}
 | 
						|
 | 
						|
			return contentRect;
 | 
						|
		}
 | 
						|
 | 
						|
		private static eHorizontalAlign GetImageHorizontalAlign(eSimplePartAlignment align, bool leftToRight)
 | 
						|
		{
 | 
						|
			if(((align==eSimplePartAlignment.NearBottom || align==eSimplePartAlignment.NearCenter ||
 | 
						|
				align==eSimplePartAlignment.NearTop) && leftToRight) ||
 | 
						|
				((align==eSimplePartAlignment.FarBottom || align==eSimplePartAlignment.FarCenter ||
 | 
						|
				align==eSimplePartAlignment.FarTop) && !leftToRight))
 | 
						|
				return eHorizontalAlign.Left;
 | 
						|
			else if(align==eSimplePartAlignment.CenterBottom || align==eSimplePartAlignment.CenterTop)
 | 
						|
				return eHorizontalAlign.Center;
 | 
						|
			return eHorizontalAlign.Right;
 | 
						|
		}
 | 
						|
 | 
						|
		private static eVerticalAlign GetImageVerticalAlign(eSimplePartAlignment align)
 | 
						|
		{
 | 
						|
			eVerticalAlign va=eVerticalAlign.Middle;
 | 
						|
 | 
						|
			switch(align)
 | 
						|
			{
 | 
						|
				case eSimplePartAlignment.FarBottom:
 | 
						|
				case eSimplePartAlignment.NearBottom:
 | 
						|
				case eSimplePartAlignment.CenterBottom:
 | 
						|
					va=eVerticalAlign.Bottom;
 | 
						|
					break;
 | 
						|
				case eSimplePartAlignment.FarTop:
 | 
						|
				case eSimplePartAlignment.NearTop:
 | 
						|
				case eSimplePartAlignment.CenterTop:
 | 
						|
					va=eVerticalAlign.Top;
 | 
						|
					break;
 | 
						|
			}
 | 
						|
 | 
						|
			return va;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Indicates absolute vertical alignment of the content.
 | 
						|
		/// </summary>
 | 
						|
		private enum eVerticalAlign
 | 
						|
		{
 | 
						|
			/// <summary>
 | 
						|
			/// Content is aligned to the top
 | 
						|
			/// </summary>
 | 
						|
			Top,
 | 
						|
			/// <summary>
 | 
						|
			/// Content is aligned in the middle
 | 
						|
			/// </summary>
 | 
						|
			Middle,
 | 
						|
			/// <summary>
 | 
						|
			/// Content is aligned at the bottom
 | 
						|
			/// </summary>
 | 
						|
			Bottom
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Indicates absolute horizontal alignment
 | 
						|
		/// </summary>
 | 
						|
		private enum eHorizontalAlign
 | 
						|
		{
 | 
						|
			/// <summary>
 | 
						|
			/// Content is left aligned
 | 
						|
			/// </summary>
 | 
						|
			Left,
 | 
						|
			/// <summary>
 | 
						|
			/// Content is centered
 | 
						|
			/// </summary>
 | 
						|
			Center,
 | 
						|
			/// <summary>
 | 
						|
			/// Content is right aligned
 | 
						|
			/// </summary>
 | 
						|
			Right
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>Indicates alignment of a part of the cell like image or check box in relation to the text.</summary>
 | 
						|
	public enum eSimplePartAlignment:int
 | 
						|
	{
 | 
						|
		/// <summary>
 | 
						|
		/// Part is aligned to the left center of the text assuming left-to-right
 | 
						|
		/// orientation.
 | 
						|
		/// </summary>
 | 
						|
		NearCenter=0,
 | 
						|
		/// <summary>
 | 
						|
		/// Part is aligned to the right center of the text assuming left-to-right
 | 
						|
		/// orientation.
 | 
						|
		/// </summary>
 | 
						|
		FarCenter=1,
 | 
						|
		/// <summary>
 | 
						|
		/// Part is aligned to the top left of the text assuming left-to-right
 | 
						|
		/// orientation.
 | 
						|
		/// </summary>
 | 
						|
		NearTop=2,
 | 
						|
		/// <summary>Part is aligned above the text and centered.</summary>
 | 
						|
		CenterTop=3,
 | 
						|
		/// <summary>
 | 
						|
		/// Part is aligned to the top right of the text assuming left-to-right
 | 
						|
		/// orientation.
 | 
						|
		/// </summary>
 | 
						|
		FarTop=4,
 | 
						|
		/// <summary>
 | 
						|
		/// Part is aligned to the bottom left of the text assuming left-to-right
 | 
						|
		/// orientation.
 | 
						|
		/// </summary>
 | 
						|
		NearBottom=5,
 | 
						|
		/// <summary>Part is aligned below the text and centered.</summary>
 | 
						|
		CenterBottom=6,
 | 
						|
		/// <summary>
 | 
						|
		/// Part is aligned to the bottom right of the text assuming left-to-right
 | 
						|
		/// orientation.
 | 
						|
		/// </summary>
 | 
						|
		FarBottom=7
 | 
						|
	}
 | 
						|
 | 
						|
	internal class SimpleElementLayoutInfo
 | 
						|
	{
 | 
						|
		public ISimpleElement Element=null;
 | 
						|
		public System.Drawing.Graphics Graphics=null;
 | 
						|
		public System.Drawing.Font Font=null;
 | 
						|
		public int Left=0;
 | 
						|
		public int Top=0;
 | 
						|
		public ElementStyle LayoutStyle=null;
 | 
						|
		public bool LeftToRight=true;
 | 
						|
		public bool VerticalPartAlignment=false;
 | 
						|
	}
 | 
						|
}
 |