// Authors:
// Lluis Sanchez Gual (lluis@novell.com)
//
-// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2010 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0
-
using System.ComponentModel;
using System.Collections;
using System.Security.Permissions;
[AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
// attributes
[ControlBuilder (typeof(HtmlHeadBuilder))]
- public sealed class HtmlHead: HtmlGenericControl, IPageHeader, IParserAccessor
+ public sealed class HtmlHead: HtmlGenericControl, IParserAccessor
{
+#if NET_4_0
+ string descriptionText;
+ string keywordsText;
+ HtmlMeta descriptionMeta;
+ HtmlMeta keywordsMeta;
+#endif
+ string titleText;
HtmlTitle title;
- Hashtable metadata;
- ArrayList styleSheets;
+ //Hashtable metadata;
StyleSheetBag styleSheet;
public HtmlHead(): base("head") {}
protected internal override void OnInit (EventArgs e)
{
- Page.SetHeader (this);
+ base.OnInit (e);
+ Page page = Page;
+
+ if (page == null)
+ throw new HttpException ("The <head runat=\"server\"> control requires a page.");
+
+ //You can only have one <head runat="server"> control on a page.
+ if(page.Header != null)
+ throw new HttpException ("You can only have one <head runat=\"server\"> control on a page.");
+ page.SetHeader (this);
}
protected internal override void RenderChildren (HtmlTextWriter writer)
{
+ EnsureTitleControl ();
+
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 (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 internal override void AddedControl (Control control, int index)
{
- if (control is HtmlTitle)
- title = (HtmlTitle) control;
+ //You can only have one <title> 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;
+ }
+#if NET_4_0
+ 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;
+ }
+#endif
base.AddedControl (control, index);
}
if (title == control)
title = null;
+#if NET_4_0
+ if (keywordsMeta == control)
+ keywordsMeta = null;
+ else if (descriptionMeta == control)
+ descriptionMeta = null;
+#endif
base.RemovedControl (control);
}
- IList IPageHeader.LinkedStyleSheets {
+ void EnsureTitleControl () {
+ if (title != null)
+ return;
+
+ HtmlTitle t = new HtmlTitle ();
+ t.Text = titleText;
+ Controls.Add (t);
+ }
+
+// IList LinkedStyleSheets {
+// get {
+// if (styleSheets == null) styleSheets = new ArrayList ();
+// return styleSheets;
+// }
+// }
+//
+// IDictionary Metadata {
+// get {
+// if (metadata == null) metadata = new Hashtable ();
+// return metadata;
+// }
+// }
+
+#if NET_4_0
+ public string Description {
get {
- if (styleSheets == null) styleSheets = new ArrayList ();
- return styleSheets;
+ if (descriptionMeta != null)
+ return descriptionMeta.Content;
+ return descriptionText;
}
- }
-
- IDictionary IPageHeader.Metadata {
+
+ set {
+ if (descriptionMeta != null)
+ descriptionMeta.Content = value;
+ else
+ descriptionText = value;
+ }
+ }
+
+ public string Keywords {
get {
- if (metadata == null) metadata = new Hashtable ();
- return metadata;
+ if (keywordsMeta != null)
+ return keywordsMeta.Content;
+ return keywordsText;
+ }
+
+ set {
+ if (keywordsMeta != null)
+ keywordsMeta.Content = value;
+ else
+ keywordsText = value;
}
}
+#endif
- IStyleSheet IPageHeader.StyleSheet {
+ public IStyleSheet StyleSheet {
get {
if (styleSheet == null) styleSheet = new StyleSheetBag ();
return styleSheet;
}
}
- string IPageHeader.Title {
- get { return title.Text; }
- set { title.Text = value; }
+ public string Title {
+ get {
+ if (title != null)
+ return title.Text;
+ else
+ return titleText;
+ }
+ set {
+ if (title != null)
+ title.Text = value;
+ else
+ titleText = value;
+ }
}
}
{
}
- public void CreateStyleRule (Style style, string selection, IUrlResolutionService urlResolver)
+ public void CreateStyleRule (Style style, IUrlResolutionService urlResolver, string selection)
{
StyleEntry entry = new StyleEntry ();
entry.Style = style;
string name = "aspnet_" + entries.Count;
style.SetRegisteredCssClass (name);
- CreateStyleRule (style, "." + name, urlResolver);
+ CreateStyleRule (style, urlResolver, "." + name);
}
public void Render (HtmlTextWriter writer)
{
- writer.AddAttribute ("type", "text/css");
+ writer.AddAttribute ("type", "text/css", false);
writer.RenderBeginTag (HtmlTextWriterTag.Style);
foreach (StyleEntry entry in entries) {
}
}
-#endif