using System; using System.Text; using System.Drawing; 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 class Div : ContainerElement { #region Private Variables private eParagraphAlignment m_Align = eParagraphAlignment.Left; private eParagraphVerticalAlignment m_VAlign = eParagraphVerticalAlignment.Top; private int m_Width = 0; private int m_Height = 0; private Padding m_Padding = new Padding(0, 0, 0, 0); private Color m_BackColor = Color.Empty; #endregion #region Internal Implementation public override void Render(MarkupDrawContext d) { Rectangle r = this.Bounds; r.Offset(d.Offset); if (!m_BackColor.IsEmpty) { DisplayHelp.FillRectangle(d.Graphics, r, m_BackColor); } base.Render(d); } public eParagraphAlignment Align { get { return m_Align; } set { m_Align = value; } } protected override SerialContentLayoutManager GetLayoutManager(bool multiLine) { SerialContentLayoutManager sm = base.GetLayoutManager(multiLine); if (m_Align == eParagraphAlignment.Left) sm.ContentAlignment = eContentAlignment.Left; else if (m_Align == eParagraphAlignment.Right) sm.ContentAlignment = eContentAlignment.Right; else if (m_Align == eParagraphAlignment.Center) sm.ContentAlignment = eContentAlignment.Center; if (m_VAlign != eParagraphVerticalAlignment.Top) { sm.EvenHeight = false; sm.ContentVerticalAlignment = (m_VAlign == eParagraphVerticalAlignment.Bottom ? eContentVerticalAlignment.Bottom : eContentVerticalAlignment.Middle); //sm.BlockLineAlignment = (m_VAlign == eParagraphVerticalAlignment.Bottom ? eContentVerticalAlignment.Bottom : eContentVerticalAlignment.Middle); } return sm; } protected override Point GetContainerOffset() { if (m_Padding.Left == 0 && m_Padding.Top == 0) return base.GetContainerOffset(); Point p = base.GetContainerOffset(); p.X += m_Padding.Left; p.Y += m_Padding.Top; return p; } protected override void ArrangeInternal(Rectangle bounds, MarkupDrawContext d) { Rectangle r = bounds; int width = Dpi.Width(m_Width); if (width > 0) r.Width = width; int height = Dpi.Height(m_Height); if (height > 0) r.Height = height; Padding padding = Dpi.Size(m_Padding); if (padding.IsEmpty) { base.ArrangeInternal(r, d); if (width > 0) this.Bounds = new Rectangle(this.Bounds.X, this.Bounds.Y, width, height > 0 ? height : this.Bounds.Height + padding.Bottom); else if(height>0) this.Bounds = new Rectangle(this.Bounds.X, this.Bounds.Y, this.Bounds.Width, height); } else { r.X += padding.Left; r.Y += padding.Top; r.Width -= padding.Horizontal; r.Height -= padding.Vertical; base.ArrangeInternal(r, d); r = new Rectangle(bounds.X, bounds.Y, this.Bounds.Width + padding.Horizontal, this.Bounds.Height + padding.Vertical); if (width > 0) r.Width = width; if (height > 0) r.Height = height; this.Bounds = r; } } public override void ReadAttributes(XmlTextReader reader) { for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); if (reader.Name.ToLower() == "align") { string s = reader.Value.ToLower(); if (s == "left") m_Align = eParagraphAlignment.Left; else if (s == "right") m_Align = eParagraphAlignment.Right; else if (s == "center") m_Align = eParagraphAlignment.Center; } else if (reader.Name.ToLower() == "valign") { string s = reader.Value.ToLower(); if (s == "top") m_VAlign = eParagraphVerticalAlignment.Top; else if (s == "middle") m_VAlign = eParagraphVerticalAlignment.Middle; else if (s == "bottom") m_VAlign = eParagraphVerticalAlignment.Bottom; } else if (reader.Name.ToLower() == "width") { try { m_Width = Int32.Parse(reader.Value); } catch { m_Width = 0; } } else if (reader.Name.ToLower() == "height") { try { m_Height = Int32.Parse(reader.Value); } catch { m_Height = 0; } } else if (reader.Name.ToLower() == "padding") { try { string[] values = reader.Value.Split(','); if (values.Length > 0) m_Padding.Left = Int32.Parse(values[0]); if (values.Length > 1) m_Padding.Right = Int32.Parse(values[1]); if (values.Length > 2) m_Padding.Top = Int32.Parse(values[2]); if (values.Length > 3) m_Padding.Bottom = Int32.Parse(values[3]); } catch { m_Padding = new Padding(0,0,0,0); } } else if (reader.Name.ToLower() == "bgcolor") { try { string s = reader.Value; if (s.StartsWith("#")) { if (s.Length == 7) m_BackColor = ColorScheme.GetColor(s.Substring(1)); } else { m_BackColor = Color.FromName(s); } } catch { m_BackColor = Color.Empty; } } } } #endregion } #region eParagraphAlignment /// /// Indicates paragraph content alignment /// internal enum eParagraphAlignment { Left, Right, Center } /// /// Indicates paragraph content alignment /// internal enum eParagraphVerticalAlignment { Top, Middle, Bottom } #endregion }