114 lines
3.4 KiB
C#

using System;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
#if AdvTree
namespace DevComponents.Tree.TextMarkup
#elif DOTNETBAR
using DevComponents.UI.ContentManager;
namespace DevComponents.DotNetBar.TextMarkup
#elif SUPERGRID
namespace DevComponents.SuperGrid.TextMarkup
#elif LAYOUT
namespace DevComponents.DotNetBar.Layout.TextMarkup
#endif
{
internal class ContainerElement : MarkupElement
{
#region Private Variables
private SerialContentLayoutManager m_Layout = null;
private MarkupLayoutManager m_MarkupLayout = null;
#endregion
#region Internal Implementation
public override void Measure(Size availableSize, MarkupDrawContext d)
{
ArrangeInternal(new Rectangle(Point.Empty, availableSize), d);
}
protected virtual SerialContentLayoutManager GetLayoutManager(bool mutliLine)
{
if (m_Layout == null)
{
m_Layout = new SerialContentLayoutManager();
m_Layout.MultiLine = mutliLine;
m_Layout.ContentVerticalAlignment = eContentVerticalAlignment.Top;
m_Layout.BlockLineAlignment = eContentVerticalAlignment.Top;
m_Layout.BlockSpacing = 0;
}
m_Layout.EvenHeight = true;
return m_Layout;
}
private MarkupLayoutManager GetMarkupLayout()
{
if (m_MarkupLayout == null)
{
m_MarkupLayout = new MarkupLayoutManager();
}
return m_MarkupLayout;
}
public override void Render(MarkupDrawContext d)
{
Point offset = this.GetContainerOffset();
d.Offset.Offset(offset.X, offset.Y);
try
{
foreach (MarkupElement e in this.Elements)
{
e.Render(d);
}
}
finally
{
d.Offset.Offset(-offset.X, -offset.Y);
}
}
protected virtual Point GetContainerOffset()
{
return this.Bounds.Location;
}
protected override void ArrangeCore(Rectangle finalRect, MarkupDrawContext d)
{
this.Bounds = finalRect;
ArrangeInternal(finalRect, d);
}
protected virtual void ArrangeInternal(Rectangle bounds, MarkupDrawContext d)
{
SerialContentLayoutManager layout = GetLayoutManager(d.AllowMultiLine);
layout.RightToLeft = d.RightToLeft;
MarkupLayoutManager markupLayout = GetMarkupLayout();
markupLayout.MarkupDrawContext = d;
try
{
MarkupElement[] blocks = new MarkupElement[this.Elements.Count];
this.Elements.CopyTo(blocks);
Rectangle r = layout.Layout(new Rectangle(Point.Empty, bounds.Size), blocks, markupLayout);
this.Bounds = new Rectangle(bounds.Location, r.Size);
}
finally
{
markupLayout.MarkupDrawContext = null;
}
}
/// <summary>
/// Returns whether markup element is an block element that always consumes a whole line in layout.
/// </summary>
public override bool IsBlockElement
{
get { return true; }
}
#endregion
}
}