260 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Drawing;
 | |
| using System.Collections;
 | |
| 
 | |
| #if AdvTree
 | |
| namespace DevComponents.Tree
 | |
| #elif DOTNETBAR
 | |
| namespace DevComponents.DotNetBar
 | |
| #endif
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Represents the layout for the element style.
 | |
| 	/// </summary>
 | |
| 	internal class ElementStyleLayout
 | |
| 	{
 | |
| 		public ElementStyleLayout()
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Calculates size of an style element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="style">Style to calculate size for.</param>
 | |
| 		/// <param name="defaultFont">Default font that will be used by style if style does not uses it's own font.</param>
 | |
| 		/// <returns>Size of the style element. At this time only Height member will be calculated.</returns>
 | |
| 		public static void CalculateStyleSize(ElementStyle style, Font defaultFont)
 | |
| 		{
 | |
| 			int height=defaultFont.Height;
 | |
| 		    bool disposeStyle = false;
 | |
|             ElementStyle s = ElementStyleDisplay.GetElementStyle(style, out disposeStyle);
 | |
| 			if(s.Font!=null)
 | |
| 				height=s.Font.Height;
 | |
| 			
 | |
| 			if(s.PaintTopBorder)
 | |
| 			{
 | |
| 				height+=s.BorderTopWidth;
 | |
| 			}
 | |
| 
 | |
| 			if(s.PaintBottomBorder)
 | |
| 			{
 | |
| 				height+=s.BorderBottomWidth;
 | |
| 			}
 | |
| 			
 | |
| 			height+=(s.MarginTop+style.MarginBottom);
 | |
| 			height+=(s.PaddingTop+s.PaddingBottom);
 | |
| 			
 | |
| 			style.SetSize(new Size(0,height));
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns the total white space for a style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to return white space for</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int HorizontalStyleWhiteSpace(ElementStyle es)
 | |
| 		{
 | |
| 			return LeftWhiteSpace(es)+RightWhiteSpace(es);
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns the total white space for a style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to return white space for.</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int VerticalStyleWhiteSpace(ElementStyle es)
 | |
| 		{
 | |
| 			return TopWhiteSpace(es)+BottomWhiteSpace(es);
 | |
| 		}
 | |
| 
 | |
|         private static readonly eSpacePart LeftWhiteSpaceParts = eSpacePart.Border | eSpacePart.Margin | eSpacePart.Padding;
 | |
| 		/// <summary>
 | |
| 		/// Returns total white space for left side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to return white space for.</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int LeftWhiteSpace(ElementStyle es)
 | |
| 		{
 | |
| 			return ElementStyleLayout.StyleSpacing(es,LeftWhiteSpaceParts,eStyleSide.Left);
 | |
| 		}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns total white space for left side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
|         /// </summary>
 | |
|         /// <param name="es">Style to return white space for.</param>
 | |
|         /// <returns></returns>
 | |
|         public static int LeftWhiteSpace(ElementStyle es, eSpacePart parts)
 | |
|         {
 | |
|             return ElementStyleLayout.StyleSpacing(es, parts, eStyleSide.Left);
 | |
|         }
 | |
| 
 | |
|         private static readonly eSpacePart RightWhiteSpaceParts = eSpacePart.Border | eSpacePart.Margin | eSpacePart.Padding;
 | |
| 		/// <summary>
 | |
| 		/// Returns total white space for right side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to return white space for.</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int RightWhiteSpace(ElementStyle es)
 | |
| 		{
 | |
| 			return ElementStyleLayout.StyleSpacing(es,RightWhiteSpaceParts,eStyleSide.Right);
 | |
| 		}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns total white space for right side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
|         /// </summary>
 | |
|         /// <param name="es">Style to return white space for.</param>
 | |
|         /// <returns></returns>
 | |
|         public static int RightWhiteSpace(ElementStyle es, eSpacePart parts)
 | |
|         {
 | |
|             return ElementStyleLayout.StyleSpacing(es, parts, eStyleSide.Right);
 | |
|         }
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns total white space for top side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to return white space for.</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int TopWhiteSpace(ElementStyle es)
 | |
| 		{
 | |
| 			return ElementStyleLayout.StyleSpacing(es,eSpacePart.Border | eSpacePart.Margin | eSpacePart.Padding,eStyleSide.Top);
 | |
| 		}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns total white space for top side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
|         /// </summary>
 | |
|         /// <param name="es">Style to return white space for.</param>
 | |
|         /// <returns></returns>
 | |
|         public static int TopWhiteSpace(ElementStyle es, eSpacePart parts)
 | |
|         {
 | |
|             return ElementStyleLayout.StyleSpacing(es, parts, eStyleSide.Top);
 | |
|         }
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns total white space for top side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to return white space for.</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int BottomWhiteSpace(ElementStyle es)
 | |
| 		{
 | |
| 			return ElementStyleLayout.StyleSpacing(es,eSpacePart.Border | eSpacePart.Margin | eSpacePart.Padding,eStyleSide.Bottom);
 | |
| 		}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns total white space for top side of the style. Whitespace is the space between the edge of the element and inner content of the element.
 | |
|         /// </summary>
 | |
|         /// <param name="es">Style to return white space for.</param>
 | |
|         /// <returns></returns>
 | |
|         public static int BottomWhiteSpace(ElementStyle es, eSpacePart parts)
 | |
|         {
 | |
|             return ElementStyleLayout.StyleSpacing(es, parts, eStyleSide.Bottom);
 | |
|         }
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns amount of spacing for specified style parts.
 | |
| 		/// </summary>
 | |
| 		/// <param name="es">Style to calculate spacing for.</param>
 | |
| 		/// <param name="part">Part of the style spacing is calculated for. Values can be combined.</param>
 | |
| 		/// <param name="side">Side of the style to use for calculation.</param>
 | |
| 		/// <returns></returns>
 | |
| 		public static int StyleSpacing(ElementStyle style, eSpacePart part, eStyleSide side)
 | |
| 		{
 | |
|             bool disposeStyle = false;
 | |
|             ElementStyle es = ElementStyleDisplay.GetElementStyle(style, out disposeStyle);
 | |
| 			int space=0;
 | |
| 			if((part & eSpacePart.Margin)==eSpacePart.Margin)
 | |
| 			{
 | |
| 				switch(side)
 | |
| 				{
 | |
| 					case eStyleSide.Bottom:
 | |
| 						space+=es.MarginBottom;
 | |
| 						break;
 | |
| 					case eStyleSide.Left:
 | |
| 						space+=es.MarginLeft;
 | |
| 						break;
 | |
| 					case eStyleSide.Right:
 | |
| 						space+=es.MarginRight;
 | |
| 						break;
 | |
| 					case eStyleSide.Top:
 | |
| 						space+=es.MarginTop;
 | |
| 						break;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if((part & eSpacePart.Padding)==eSpacePart.Padding)
 | |
| 			{
 | |
| 				switch(side)
 | |
| 				{
 | |
| 					case eStyleSide.Bottom:
 | |
| 						space+=es.PaddingBottom;
 | |
| 						break;
 | |
| 					case eStyleSide.Left:
 | |
| 						space+=es.PaddingLeft;
 | |
| 						break;
 | |
| 					case eStyleSide.Right:
 | |
| 						space+=es.PaddingRight;
 | |
| 						break;
 | |
| 					case eStyleSide.Top:
 | |
| 						space+=es.PaddingTop;
 | |
| 						break;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if((part & eSpacePart.Border)==eSpacePart.Border)
 | |
| 			{
 | |
| 				switch(side)
 | |
| 				{
 | |
| 					case eStyleSide.Bottom:
 | |
| 					{
 | |
| 						if(es.PaintBottomBorder)
 | |
| 							space+=es.BorderBottomWidth;
 | |
|                         if (es.BorderBottom == eStyleBorderType.Etched || es.BorderBottom == eStyleBorderType.Double)
 | |
|                             space += es.BorderBottomWidth;
 | |
| 						break;
 | |
| 					}
 | |
| 					case eStyleSide.Left:
 | |
| 					{
 | |
| 						if(es.PaintLeftBorder)
 | |
| 							space+=es.BorderLeftWidth;
 | |
|                         if (es.BorderLeft == eStyleBorderType.Etched || es.BorderLeft == eStyleBorderType.Double)
 | |
|                             space += es.BorderLeftWidth;
 | |
| 						break;
 | |
| 					}
 | |
| 					case eStyleSide.Right:
 | |
| 					{
 | |
| 						if(es.PaintRightBorder)
 | |
| 							space+=es.BorderRightWidth;
 | |
|                         if (es.BorderRight == eStyleBorderType.Etched || es.BorderRight == eStyleBorderType.Double)
 | |
|                             space += es.BorderRightWidth;
 | |
| 						break;
 | |
| 					}
 | |
| 					case eStyleSide.Top:
 | |
| 					{
 | |
| 						if(es.PaintTopBorder)
 | |
| 							space+=es.BorderTopWidth;
 | |
|                         if (es.BorderTop == eStyleBorderType.Etched || es.BorderTop == eStyleBorderType.Double)
 | |
|                             space += es.BorderTopWidth;
 | |
| 						break;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
|             if (disposeStyle) es.Dispose();
 | |
| 
 | |
| 			return space;
 | |
| 		}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets inner rectangle taking in account style padding, margins and border.
 | |
|         /// </summary>
 | |
|         public static Rectangle GetInnerRect(ElementStyle style, Rectangle bounds)
 | |
|         {
 | |
|             bounds.X += LeftWhiteSpace(style);
 | |
|             bounds.Width -= HorizontalStyleWhiteSpace(style);
 | |
|             bounds.Y += TopWhiteSpace(style);
 | |
|             bounds.Height -= VerticalStyleWhiteSpace(style);
 | |
| 
 | |
|             return bounds;
 | |
|         }
 | |
| 	}
 | |
| }
 |