X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Web%2FSystem.Web.UI.HtmlControls%2FHtmlHead.cs;h=a890fc10f4b80edf848071aabceea5ece6eb4b25;hb=48992d4b3f8b568be17180372160d2f3e03b8ccb;hp=1d80f45ff8986ecd3303867ae88360b143f10caf;hpb=ff228e1c801bda9666b6edab3ee962e05edcf480;p=mono.git diff --git a/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlHead.cs b/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlHead.cs index 1d80f45ff89..a890fc10f4b 100644 --- a/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlHead.cs +++ b/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlHead.cs @@ -1,165 +1,231 @@ -// -// System.Web.UI.HtmlControls.HtmlHead -// -// Authors: -// Lluis Sanchez Gual (lluis@novell.com) -// -// (C) 2004 Novell, Inc. - -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -#if NET_2_0 - -using System; -using System.ComponentModel; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Collections; - -namespace System.Web.UI.HtmlControls -{ - [ControlBuilder (typeof(HtmlHeadBuilder))] - public class HtmlHead: HtmlContainerControl, IPageHeader - { - HtmlTitle title; - Hashtable metadata; - ArrayList styleSheets; - StyleSheetBag styleSheet; - - public HtmlHead(): base("head") {} - - protected override void OnInit (EventArgs e) - { - Page.SetHeader (this); - } - - protected override void RenderChildren (HtmlTextWriter writer) - { - base.RenderChildren (writer); - if (metadata != null) { - foreach (DictionaryEntry entry in metadata) { - writer.AddAttribute ("name", entry.Key.ToString ()); - writer.AddAttribute ("content", entry.Value.ToString ()); - writer.RenderBeginTag (HtmlTextWriterTag.Meta); - writer.RenderEndTag (); - } - } - - if (styleSheet != null) - styleSheet.Render (writer); - } - - protected override void AddParsedSubObject (object ob) - { - if (ob is HtmlTitle) - title = (HtmlTitle) ob; - - base.AddParsedSubObject (ob); - } - - protected internal override void AddedControl (Control control, int index) - { - base.AddedControl (control, index); - } - - IList IPageHeader.LinkedStyleSheets { - get { - if (styleSheets == null) styleSheets = new ArrayList (); - return styleSheets; - } - } - - IDictionary IPageHeader.Metadata { - get { - if (metadata == null) metadata = new Hashtable (); - return metadata; - } - } - - IStyleSheet IPageHeader.StyleSheet { - get { - if (styleSheet == null) styleSheet = new StyleSheetBag (Page); - return styleSheet; - } - } - - string IPageHeader.Title { - get { return title.Text; } - set { title.Text = value; } - } - } - - internal class StyleSheetBag: IStyleSheet - { - ArrayList entries = new ArrayList (); - Page page; - - internal class StyleEntry - { - public Style Style; - public string Selection; - public IUrlResolutionService UrlResolver; - } - - public StyleSheetBag (Page page) - { - this.page = page; - } - - public void CreateStyleRule (Style style, string selection, IUrlResolutionService urlResolver) - { - StyleEntry entry = new StyleEntry (); - entry.Style = style; - entry.UrlResolver = urlResolver; - entry.Selection = selection; - entries.Add (entry); - } - - public void RegisterStyle (Style style, IUrlResolutionService urlResolver) - { - for (int n=0; n control requires a page."); + + //You can only have one control on a page. + if(page.Header != null) + throw new HttpException ("You can only have one control on a page."); + page.SetHeader (this); + } + + protected internal override void RenderChildren (HtmlTextWriter writer) + { + base.RenderChildren (writer); + if (title == null) { + writer.RenderBeginTag (HtmlTextWriterTag.Title); + if (!String.IsNullOrEmpty (titleText)) + writer.Write (titleText); + writer.RenderEndTag (); + } + if (descriptionMeta == null && descriptionText != null) { + writer.AddAttribute ("name", "description"); + writer.AddAttribute ("content", HttpUtility.HtmlAttributeEncode (descriptionText)); + writer.RenderBeginTag (HtmlTextWriterTag.Meta); + writer.RenderEndTag (); + } + + if (keywordsMeta == null && keywordsText != null) { + writer.AddAttribute ("name", "keywords"); + writer.AddAttribute ("content", HttpUtility.HtmlAttributeEncode (keywordsText)); + writer.RenderBeginTag (HtmlTextWriterTag.Meta); + writer.RenderEndTag (); + } + if (styleSheet != null) + styleSheet.Render (writer); + } + + protected internal override void AddedControl (Control control, int index) + { + //You can only have one element within the <head> element. + HtmlTitle t = control as HtmlTitle; + if (t != null) { + if (title != null) + throw new HttpException ("You can only have one <title> element within the <head> element."); + title = t; + } + + HtmlMeta meta = control as HtmlMeta; + if (meta != null) { + if (String.Compare ("keywords", meta.Name, StringComparison.OrdinalIgnoreCase) == 0) + keywordsMeta = meta; + else if (String.Compare ("description", meta.Name, StringComparison.OrdinalIgnoreCase) == 0) + descriptionMeta = meta; + } + base.AddedControl (control, index); + } + + protected internal override void RemovedControl (Control control) + { + if (title == control) + title = null; + + if (keywordsMeta == control) + keywordsMeta = null; + else if (descriptionMeta == control) + descriptionMeta = null; + base.RemovedControl (control); + } + public string Description { + get { + if (descriptionMeta != null) + return descriptionMeta.Content; + return descriptionText; + } + + set { + if (descriptionMeta != null) + descriptionMeta.Content = value; + else + descriptionText = value; + } + } + + public string Keywords { + get { + if (keywordsMeta != null) + return keywordsMeta.Content; + return keywordsText; + } + + set { + if (keywordsMeta != null) + keywordsMeta.Content = value; + else + keywordsText = value; + } + } + + public IStyleSheet StyleSheet { + get { + if (styleSheet == null) styleSheet = new StyleSheetBag (); + return styleSheet; + } + } + + public string Title { + get { + if (title != null) + return title.Text; + else + return titleText; + } + set { + if (title != null) + title.Text = value; + else + titleText = value; + } + } + } + + internal class StyleSheetBag: IStyleSheet + { + ArrayList entries = new ArrayList (); + + internal class StyleEntry + { + public Style Style; + public string Selection; + public IUrlResolutionService UrlResolver; + } + + public StyleSheetBag () + { + } + + public void CreateStyleRule (Style style, IUrlResolutionService urlResolver, string selection) + { + StyleEntry entry = new StyleEntry (); + entry.Style = style; + entry.UrlResolver = urlResolver; + entry.Selection = selection; + entries.Add (entry); + } + + public void RegisterStyle (Style style, IUrlResolutionService urlResolver) + { + for (int n=0; n<entries.Count; n++) { + if (((StyleEntry)entries[n]).Style == style) + return; + } + + string name = "aspnet_" + entries.Count; + style.SetRegisteredCssClass (name); + CreateStyleRule (style, urlResolver, "." + name); + } + + public void Render (HtmlTextWriter writer) + { + writer.AddAttribute ("type", "text/css", false); + writer.RenderBeginTag (HtmlTextWriterTag.Style); + + foreach (StyleEntry entry in entries) { + CssStyleCollection sts = entry.Style.GetStyleAttributes (entry.UrlResolver); + writer.Write ("\n" + entry.Selection + " {" + sts.Value + "}"); + } + + writer.RenderEndTag (); + } + } +} +