DotNet 4.8.1 build of DotNetBar
This commit is contained in:
359
PROMS/DotNetBar Source Code/Ribbon/SimpleElementLayout.cs
Normal file
359
PROMS/DotNetBar Source Code/Ribbon/SimpleElementLayout.cs
Normal file
@@ -0,0 +1,359 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user