179 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
using System.Text;
 | 
						|
using System.Xml;
 | 
						|
 | 
						|
#if TREEGX
 | 
						|
namespace DevComponents.Tree.TextMarkup
 | 
						|
#elif DOTNETBAR
 | 
						|
using DevComponents.UI.ContentManager;
 | 
						|
namespace DevComponents.DotNetBar.TextMarkup
 | 
						|
#elif SUPERGRID
 | 
						|
namespace DevComponents.SuperGrid.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);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns whether markup element is an block element that always consumes a whole line in layout.
 | 
						|
        /// </summary>
 | 
						|
        public virtual bool IsBlockElement
 | 
						|
        {
 | 
						|
            get { return false; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns whether layout manager switches to new line after processing this element.
 | 
						|
        /// </summary>
 | 
						|
        public virtual bool IsNewLineAfterElement
 | 
						|
        {
 | 
						|
            get { return false; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns whether layout manager can start new line with this element.
 | 
						|
        /// </summary>
 | 
						|
        public virtual bool CanStartNewLine
 | 
						|
        {
 | 
						|
            get { return true; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the collection of child elements if any for this markup element.
 | 
						|
        /// </summary>
 | 
						|
        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;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether element size is valid. When size is not valid element Measure method will be called to validate size.
 | 
						|
        /// </summary>
 | 
						|
        public virtual bool IsSizeValid
 | 
						|
        {
 | 
						|
            get { return m_SizeValid; }
 | 
						|
            set { m_SizeValid = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets element parent or null if parent is not set.
 | 
						|
        /// </summary>
 | 
						|
        public virtual MarkupElement Parent
 | 
						|
        {
 | 
						|
            get { return m_Parent; }
 | 
						|
        }
 | 
						|
 | 
						|
        internal void SetParent(MarkupElement parent)
 | 
						|
        {
 | 
						|
            m_Parent = parent;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets actual rendering bounds.
 | 
						|
        /// </summary>
 | 
						|
        public Rectangle Bounds
 | 
						|
        {
 | 
						|
            get { return m_Bounds; }
 | 
						|
            set { m_Bounds = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether markup element is visible.
 | 
						|
        /// </summary>
 | 
						|
        public bool Visible
 | 
						|
        {
 | 
						|
            get { return m_Visible; }
 | 
						|
            set { m_Visible = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Measures the element given available size.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="availableSize">Size available to element</param>
 | 
						|
        /// <param name="g">Reference to graphics object</param>
 | 
						|
        public abstract void Measure(Size availableSize, MarkupDrawContext d);
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 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.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="availableSize"></param>
 | 
						|
        /// <param name="d"></param>
 | 
						|
        public virtual void MeasureEnd(Size availableSize, MarkupDrawContext d) { }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Renders element.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="d">Provides markup drawing context information.</param>
 | 
						|
        public abstract void Render(MarkupDrawContext d);
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 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.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="d">Provides markup drawing context information.</param>
 | 
						|
        public virtual void RenderEnd(MarkupDrawContext d) { }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Provides final rectangle to element and lets it arrange it's content given new constraint.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="finalRect">Final rectangle.</param>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        protected abstract void ArrangeCore(Rectangle finalRect, MarkupDrawContext d);
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Arranges the element given the final size. Layout is two step process with Measure followed by Arrange.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="finalSize"></param>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        public void Arrange(Rectangle finalSize, MarkupDrawContext d)
 | 
						|
        {
 | 
						|
            this.ArrangeCore(finalSize, d);
 | 
						|
        }
 | 
						|
 | 
						|
        public virtual void ReadAttributes(XmlTextReader reader) { }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets actual rendered bounds for a give markup element if applicable.
 | 
						|
        /// </summary>
 | 
						|
        public Rectangle RenderBounds
 | 
						|
        {
 | 
						|
            get { return m_RenderBounds; }
 | 
						|
            set { m_RenderBounds = value; }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |