using System;
using System.Drawing;
using System.Text;
using System.Xml;
#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 abstract class MarkupElement : IBlockExtended
{
#region Private Variables
private MarkupElementCollection m_Elements = null;
private MarkupElement m_Parent = null;
private Rectangle m_Bounds = Rectangle.Empty;
private bool m_Visible = true;
private bool m_SizeValid = false;
private Rectangle m_RenderBounds = Rectangle.Empty;
#endregion
#region Internal Implementation
public MarkupElement()
{
m_Elements = new MarkupElementCollection(this);
}
///
/// Returns whether markup element is an container so it receives full available size of parent control for layout.
///
public virtual bool IsBlockContainer
{
get { return false; }
}
///
/// Returns whether markup element is an block element that always consumes a whole line in layout.
///
public virtual bool IsBlockElement
{
get { return false; }
}
///
/// Returns whether layout manager switches to new line after processing this element.
///
public virtual bool IsNewLineAfterElement
{
get { return false; }
}
///
/// Returns whether layout manager can start new line with this element.
///
public virtual bool CanStartNewLine
{
get { return true; }
}
///
/// Gets the collection of child elements if any for this markup element.
///
public virtual MarkupElementCollection Elements
{
get
{
if (m_Elements == null)
m_Elements = new MarkupElementCollection(this);
return m_Elements;
}
}
internal void InvalidateElementsSize()
{
this.IsSizeValid = false;
if (m_Elements==null || m_Elements.Count == 0)
return;
foreach (MarkupElement e in m_Elements)
{
e.InvalidateElementsSize();
e.IsSizeValid = false;
}
}
///
/// Gets or sets whether element size is valid. When size is not valid element Measure method will be called to validate size.
///
public virtual bool IsSizeValid
{
get { return m_SizeValid; }
set { m_SizeValid = value; }
}
///
/// Gets element parent or null if parent is not set.
///
public virtual MarkupElement Parent
{
get { return m_Parent; }
}
internal void SetParent(MarkupElement parent)
{
m_Parent = parent;
}
///
/// Gets or sets actual rendering bounds.
///
public Rectangle Bounds
{
get { return m_Bounds; }
set { m_Bounds = value; }
}
///
/// Gets or sets whether markup element is visible.
///
public bool Visible
{
get { return m_Visible; }
set { m_Visible = value; }
}
private Padding _Margin = new Padding(0);
///
/// Gets or sets the element margin.
///
public Padding Margin
{
get { return _Margin; }
set { _Margin = value; }
}
///
/// Measures the element given available size.
///
/// Size available to element
/// Reference to graphics object
public abstract void Measure(Size availableSize, MarkupDrawContext d);
///
/// Measures the end tag of an element. Most implementations do not need to do anything but implementations like the ones
/// that change color should return state back at this time.
///
///
///
public virtual void MeasureEnd(Size availableSize, MarkupDrawContext d) { }
///
/// Renders element.
///
/// Provides markup drawing context information.
public abstract void Render(MarkupDrawContext d);
///
/// Renders element tag end. Most implementations do not need to do anything but mplementations like the ones
/// that change color should return state back at this time.
///
/// Provides markup drawing context information.
public virtual void RenderEnd(MarkupDrawContext d) { }
///
/// Provides final rectangle to element and lets it arrange it's content given new constraint.
///
/// Final rectangle.
///
protected abstract void ArrangeCore(Rectangle finalRect, MarkupDrawContext d);
///
/// Arranges the element given the final size. Layout is two step process with Measure followed by Arrange.
///
///
///
public void Arrange(Rectangle finalSize, MarkupDrawContext d)
{
this.ArrangeCore(finalSize, d);
}
public virtual void ReadAttributes(XmlTextReader reader) { }
///
/// Gets or sets actual rendered bounds for a give markup element if applicable.
///
public Rectangle RenderBounds
{
get { return m_RenderBounds; }
set { m_RenderBounds = value; }
}
#endregion
}
}