114 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
						|
        
 | 
						|
    }
 | 
						|
}
 |