195 lines
6.7 KiB
C#
195 lines
6.7 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
|
|
namespace DevComponents.DotNetBar.Presentation
|
|
{
|
|
internal class Shape
|
|
{
|
|
#region Private Variables
|
|
private Location m_Location = new Location();
|
|
private SizeInfo m_Size = new SizeInfo();
|
|
private ShapeCollection m_Children = null;
|
|
private PaddingInfo m_Padding = null;
|
|
private bool m_SetChildClip = false;
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
/// <summary>
|
|
/// Gets the location of the shape.
|
|
/// </summary>
|
|
public Location Location
|
|
{
|
|
get { return m_Location; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the size of the shape.
|
|
/// </summary>
|
|
public SizeInfo Size
|
|
{
|
|
get { return m_Size; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the shape padding. Padding is the inside spacing between shape and it's child shapes.
|
|
/// </summary>
|
|
public PaddingInfo Padding
|
|
{
|
|
get { return m_Padding; }
|
|
set
|
|
{
|
|
m_Padding = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the collection of child shapes.
|
|
/// </summary>
|
|
public ShapeCollection Children
|
|
{
|
|
get
|
|
{
|
|
if (m_Children == null)
|
|
m_Children = new ShapeCollection();
|
|
return m_Children;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether this shape will set the ShapePaintInfo.ChildContentClip property to the region that represents the inside content of the shape.
|
|
/// This is used when there is inside content of the shape which is not part of the shape itself and calling routine needs
|
|
/// access to the region that defines the shape inside bounds.
|
|
/// </summary>
|
|
public bool SetChildClip
|
|
{
|
|
get { return m_SetChildClip; }
|
|
set { m_SetChildClip = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Paints the shape on canvas. If overriden base implementation must be called to paint any child shapes.
|
|
/// </summary>
|
|
/// <param name="p">Shape paint information.</param>
|
|
public virtual void Paint(ShapePaintInfo p)
|
|
{
|
|
if (m_Children != null && m_Children.Count > 0)
|
|
{
|
|
System.Drawing.Rectangle originalBounds = p.Bounds;
|
|
System.Drawing.Rectangle bounds = new System.Drawing.Rectangle(this.GetLocation(p.Bounds), this.GetSize(p.Bounds));
|
|
|
|
if (m_Padding != null)
|
|
{
|
|
bounds.Width -= m_Padding.HorizontalPadding;
|
|
bounds.Height -= m_Padding.VerticalPadding;
|
|
bounds.X += m_Padding.Left;
|
|
bounds.Y += m_Padding.Top;
|
|
}
|
|
|
|
p.Bounds = bounds;
|
|
Region clip = ClipChildren(p.Graphics, bounds);
|
|
if (m_SetChildClip && p.Graphics.Clip!=null)
|
|
{
|
|
p.ChildContentClip = p.Graphics.Clip as Region;
|
|
}
|
|
|
|
foreach (Shape shape in m_Children)
|
|
{
|
|
shape.Paint(p);
|
|
}
|
|
if (p.ChildContentClip != null)
|
|
{
|
|
p.ChildContentClip.Dispose();
|
|
p.ChildContentClip = null;
|
|
}
|
|
if (clip != null)
|
|
{
|
|
p.Graphics.Clip = clip;
|
|
clip.Dispose();
|
|
}
|
|
else
|
|
p.Graphics.ResetClip();
|
|
p.Bounds = originalBounds;
|
|
if (clip != null) clip.Dispose();
|
|
}
|
|
}
|
|
|
|
protected virtual Region ClipChildren(Graphics g, System.Drawing.Rectangle childBounds)
|
|
{
|
|
Region clip = g.Clip;
|
|
g.SetClip(childBounds);
|
|
return clip;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns absolute location of the shape based on parent bounds.
|
|
/// </summary>
|
|
/// <param name="bounds">Parent absolute bounds.</param>
|
|
/// <returns>Absolute location of the shape</returns>
|
|
protected virtual Point GetLocation(System.Drawing.Rectangle bounds)
|
|
{
|
|
return GetLocation(bounds, m_Location);
|
|
}
|
|
|
|
protected virtual Point GetLocation(System.Drawing.Rectangle bounds, Location refLocation)
|
|
{
|
|
Point loc = bounds.Location;
|
|
|
|
if (refLocation.RelativeX == eRelativeLocation.Right)
|
|
loc.X = bounds.Right;
|
|
else if (refLocation.RelativeX == eRelativeLocation.Top)
|
|
loc.X = bounds.Y;
|
|
else if (refLocation.RelativeX == eRelativeLocation.Bottom)
|
|
loc.X = bounds.Bottom;
|
|
|
|
if (refLocation.RelativeY == eRelativeLocation.Bottom)
|
|
loc.Y = bounds.Bottom;
|
|
else if (refLocation.RelativeY == eRelativeLocation.Right)
|
|
loc.Y = bounds.Right;
|
|
else if (refLocation.RelativeY == eRelativeLocation.Left)
|
|
loc.Y = bounds.X;
|
|
|
|
loc.Offset(refLocation.X, refLocation.Y);
|
|
|
|
return loc;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns absolute size of the shape based on the parent bounds.
|
|
/// </summary>
|
|
/// <param name="bounds">Absolute parent bounds.</param>
|
|
/// <returns>Absolute size of the shape.</returns>
|
|
protected virtual Size GetSize(System.Drawing.Rectangle bounds)
|
|
{
|
|
Size size = bounds.Size;
|
|
|
|
if (m_Size.RelativeWidth == eRelativeSize.Width)
|
|
size.Width = bounds.Width + m_Size.Width;
|
|
else if (m_Size.RelativeWidth == eRelativeSize.Height)
|
|
size.Width = bounds.Height + m_Size.Height;
|
|
else if (m_Size.Width != 0)
|
|
size.Width = m_Size.Width;
|
|
|
|
if (m_Size.RelativeHeight == eRelativeSize.Height)
|
|
size.Height = bounds.Height + m_Size.Height;
|
|
else if (m_Size.RelativeHeight == eRelativeSize.Width)
|
|
size.Height = bounds.Width + m_Size.Height;
|
|
else if (m_Size.Height != 0)
|
|
size.Height = m_Size.Height;
|
|
|
|
return size;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the absolute bounds of the shape.
|
|
/// </summary>
|
|
/// <param name="parentBounds">Parent bounds.</param>
|
|
/// <returns>Absolute bounds of the shape.</returns>
|
|
protected virtual System.Drawing.Rectangle GetBounds(System.Drawing.Rectangle parentBounds)
|
|
{
|
|
return new System.Drawing.Rectangle(GetLocation(parentBounds), GetSize(parentBounds));
|
|
}
|
|
#endregion
|
|
}
|
|
}
|