**** Merged r40732-r40872 from MCS ****
[mono.git] / mcs / class / System.Web / System.Web.UI.HtmlControls / HtmlHead.cs
1 //\r
2 // System.Web.UI.HtmlControls.HtmlHead\r
3 //\r
4 // Authors:\r
5 //      Lluis Sanchez Gual (lluis@novell.com)\r
6 //\r
7 // (C) 2004 Novell, Inc.\r
8 \r
9 //\r
10 // Permission is hereby granted, free of charge, to any person obtaining\r
11 // a copy of this software and associated documentation files (the\r
12 // "Software"), to deal in the Software without restriction, including\r
13 // without limitation the rights to use, copy, modify, merge, publish,\r
14 // distribute, sublicense, and/or sell copies of the Software, and to\r
15 // permit persons to whom the Software is furnished to do so, subject to\r
16 // the following conditions:\r
17 // \r
18 // The above copyright notice and this permission notice shall be\r
19 // included in all copies or substantial portions of the Software.\r
20 // \r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
28 //\r
29 \r
30 #if NET_2_0\r
31 \r
32 using System;\r
33 using System.ComponentModel;\r
34 using System.Web;\r
35 using System.Web.UI;\r
36 using System.Web.UI.WebControls;\r
37 using System.Collections;\r
38 \r
39 namespace System.Web.UI.HtmlControls\r
40 {\r
41         [ControlBuilder (typeof(HtmlHeadBuilder))]\r
42         public class HtmlHead: HtmlContainerControl, IPageHeader\r
43         {\r
44                 HtmlTitle title;\r
45                 Hashtable metadata;\r
46                 ArrayList styleSheets;\r
47                 StyleSheetBag styleSheet;\r
48                 \r
49                 public HtmlHead(): base("head") {}\r
50 \r
51                 protected override void OnInit (EventArgs e)\r
52                 {\r
53                         Page.SetHeader (this);\r
54                 }\r
55                 \r
56                 protected override void RenderChildren (HtmlTextWriter writer)\r
57                 {\r
58                         base.RenderChildren (writer);\r
59                         if (metadata != null) {\r
60                                 foreach (DictionaryEntry entry in metadata) {\r
61                                         writer.AddAttribute ("name", entry.Key.ToString ());\r
62                                         writer.AddAttribute ("content", entry.Value.ToString ());\r
63                                         writer.RenderBeginTag (HtmlTextWriterTag.Meta);\r
64                                         writer.RenderEndTag ();\r
65                                 }\r
66                         }\r
67                         \r
68                         if (styleSheet != null)\r
69                                 styleSheet.Render (writer);\r
70                 }\r
71                 \r
72                 protected override void AddParsedSubObject (object ob)\r
73                 {\r
74                         if (ob is HtmlTitle)\r
75                                 title = (HtmlTitle) ob;\r
76                         \r
77                         base.AddParsedSubObject (ob);\r
78                 }\r
79                 \r
80                 protected internal override void AddedControl (Control control, int index)\r
81                 {\r
82                         base.AddedControl (control, index);\r
83                 }\r
84                 \r
85                 IList IPageHeader.LinkedStyleSheets {\r
86                         get {\r
87                                 if (styleSheets == null) styleSheets = new ArrayList ();\r
88                                 return styleSheets;\r
89                         }\r
90                 } \r
91                 \r
92                 IDictionary IPageHeader.Metadata {\r
93                         get {\r
94                                 if (metadata == null) metadata = new Hashtable ();\r
95                                 return metadata;\r
96                         }\r
97                 }\r
98                 \r
99                 IStyleSheet IPageHeader.StyleSheet {\r
100                         get {\r
101                                 if (styleSheet == null) styleSheet = new StyleSheetBag (Page);\r
102                                 return styleSheet;\r
103                         }\r
104                 }\r
105                 \r
106                 string IPageHeader.Title {\r
107                         get { return title.Text; }\r
108                         set { title.Text = value; }\r
109                 }\r
110         }\r
111         \r
112         internal class StyleSheetBag: IStyleSheet\r
113         {\r
114                 ArrayList entries = new ArrayList ();\r
115                 Page page;\r
116                 \r
117                 internal class StyleEntry\r
118                 {\r
119                         public Style Style;\r
120                         public string Selection;\r
121                         public IUrlResolutionService UrlResolver;\r
122                 }\r
123                 \r
124                 public StyleSheetBag (Page page)\r
125                 {\r
126                         this.page = page;\r
127                 }\r
128                 \r
129                 public void CreateStyleRule (Style style, string selection, IUrlResolutionService urlResolver)\r
130                 {\r
131                         StyleEntry entry = new StyleEntry ();\r
132                         entry.Style = style;\r
133                         entry.UrlResolver = urlResolver;\r
134                         entry.Selection = selection;\r
135                         entries.Add (entry);\r
136                 }\r
137                 \r
138                 public void RegisterStyle (Style style, IUrlResolutionService urlResolver)\r
139                 {\r
140                         for (int n=0; n<entries.Count; n++) {\r
141                                 if (((StyleEntry)entries[n]).Style == style)\r
142                                         return;\r
143                         }\r
144                         \r
145                         string name = "aspnet_" + entries.Count;\r
146                         style.SetRegisteredCssClass (name);\r
147                         CreateStyleRule (style, "." + name, urlResolver);\r
148                 }\r
149                 \r
150                 public void Render (HtmlTextWriter writer)\r
151                 {\r
152                         writer.AddAttribute ("type", "text/css");\r
153                         writer.RenderBeginTag (HtmlTextWriterTag.Style);\r
154 \r
155                         foreach (StyleEntry entry in entries) {\r
156                                 CssStyleCollection sts = entry.Style.GetStyleAttributes (entry.UrlResolver);\r
157                                 writer.Write ("\n" + entry.Selection + " {" + sts.BagToString () + "}");\r
158                         }\r
159 \r
160                         writer.RenderEndTag ();\r
161                 }\r
162         }\r
163 }\r
164 \r
165 #endif\r