124 lines
2.9 KiB
C#

using System.Xml;
using MBS.Web.UI.HtmlControls;
namespace MBS.Web.UI;
public class WebPage : Control
{
public bool MobileFriendly { get; set; } = true;
public WebPage(Dictionary<string, string>? pathVariables = null) : base(pathVariables) { }
public IList<Control> HeaderControls { get; set; } = new List<Control>();
public IList<Control> Controls { get; set; } = new List<Control>();
public WebStyleSheet.WebStyleSheetCollection StyleSheets { get; } = new WebStyleSheet.WebStyleSheetCollection();
public string Title { get; set; } = "";
private bool ChildControlsCreated { get; set; } = false;
protected virtual void CreateChildControls()
{
}
protected override void PersistentInitializeInternal()
{
base.PersistentInitializeInternal();
Controls.Clear();
CreateChildControls();
/*
if (!ChildControlsCreated)
{
CreateChildControls();
ChildControlsCreated = true;
}
*/
}
protected virtual IEnumerable<Control> GetHeaderControls()
{
return new Control[0];
}
protected override string TagName => "html";
protected override void RenderBeginTag(XmlWriter writer)
{
EnsureInitialized();
writer.WriteStartElement(TagName, "http://www.w3.org/1999/xhtml");
writer.WriteStartElement("head");
writer.WriteElementString("title", Title);
if (MobileFriendly)
{
writer.WriteStartElement("meta");
writer.WriteAttributeString("name", "viewport");
writer.WriteAttributeString("content", "width=device-width, initial-scale=1.0");
writer.WriteEndElement();
}
List<Control> ctls = new List<Control>();
IEnumerable<Control> headerCtls = GetHeaderControls();
ctls.AddRange(headerCtls);
foreach (WebStyleSheet ss in StyleSheets)
{
if (ss.FileName != null)
{
ctls.Add(new HtmlLink("stylesheet", ss.ContentType, ss.FileName));
}
else if (ss.Content != null)
{
ctls.Add(new HtmlGenericControl("style", new KeyValuePair<string, string>[] { new KeyValuePair<string, string>("type", ss.ContentType) }, null, ss.Content));
}
}
foreach (Control control in ctls)
{
control.Context = Context;
control.Render(writer);
}
writer.WriteEndElement();
writer.WriteStartElement("body");
List<string> styleClasses = GetStyleClasses().ToList();
if (styleClasses.Count > 0)
{
writer.WriteStartAttribute("class");
for (int i = 0; i < styleClasses.Count; i++)
{
writer.WriteValue(styleClasses[i]);
if (i < styleClasses.Count - 1)
{
writer.WriteValue(" ");
}
}
writer.WriteEndAttribute();
}
writer.WriteStartElement("form");
writer.WriteAttributeString("method", "POST");
}
protected override void RenderContents(XmlWriter writer)
{
foreach (Control control in Controls)
{
control.Context = Context;
control.Render(writer);
}
}
protected override void RenderEndTag(XmlWriter writer)
{
base.RenderEndTag(writer);
writer.WriteEndElement();
writer.WriteEndElement();
}
}