2004-12-17 Lluis Sanchez Gual <lluis@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI / HtmlTextWriter.cs
1
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
10 // 
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 // 
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 /*      System.Web.UI\r
23 *       Authors\r
24 *               Leen Toelen (toelen@hotmail.com)\r
25 */\r
26 \r
27 using System;\r
28 using System.IO;\r
29 using System.Collections;\r
30 using System.Web;\r
31 using System.Web.UI;\r
32 \r
33 namespace System.Web.UI{\r
34 \r
35 public class HtmlTextWriter : System.IO.TextWriter {\r
36 \r
37 static HtmlTextWriter(){\r
38         HtmlTextWriter._tagKeyLookupTable = new Hashtable(97,CaseInsensitiveHashCodeProvider.Default,\r
39                                                           CaseInsensitiveComparer.Default);\r
40         HtmlTextWriter._tagNameLookupArray = new TagInformation[97];\r
41         HtmlTextWriter.RegisterTag("", HtmlTextWriterTag.Unknown, TagType.Other);\r
42         HtmlTextWriter.RegisterTag("a", HtmlTextWriterTag.A, TagType.Inline);\r
43         HtmlTextWriter.RegisterTag("acronym", HtmlTextWriterTag.Acronym, TagType.Inline);\r
44         HtmlTextWriter.RegisterTag("address", HtmlTextWriterTag.Address, TagType.Other);\r
45         HtmlTextWriter.RegisterTag("area", HtmlTextWriterTag.Area, TagType.Other);\r
46         HtmlTextWriter.RegisterTag("b", HtmlTextWriterTag.B, TagType.Inline);\r
47         HtmlTextWriter.RegisterTag("base", HtmlTextWriterTag.Base, TagType.NonClosing);\r
48         HtmlTextWriter.RegisterTag("basefont", HtmlTextWriterTag.Basefont, TagType.NonClosing);\r
49         HtmlTextWriter.RegisterTag("bdo", HtmlTextWriterTag.Bdo, TagType.Inline);\r
50         HtmlTextWriter.RegisterTag("bgsound", HtmlTextWriterTag.Bgsound, TagType.NonClosing);\r
51         HtmlTextWriter.RegisterTag("big", HtmlTextWriterTag.Big, TagType.Inline);\r
52         HtmlTextWriter.RegisterTag("blockquote", HtmlTextWriterTag.Blockquote, TagType.Other);\r
53         HtmlTextWriter.RegisterTag("body", HtmlTextWriterTag.Body, TagType.Other);\r
54         HtmlTextWriter.RegisterTag("br", HtmlTextWriterTag.Br, TagType.Other);\r
55         HtmlTextWriter.RegisterTag("button", HtmlTextWriterTag.Button, TagType.Inline);\r
56         HtmlTextWriter.RegisterTag("caption", HtmlTextWriterTag.Caption, TagType.Other);\r
57         HtmlTextWriter.RegisterTag("center", HtmlTextWriterTag.Center, TagType.Other);\r
58         HtmlTextWriter.RegisterTag("cite", HtmlTextWriterTag.Cite, TagType.Inline);\r
59         HtmlTextWriter.RegisterTag("code", HtmlTextWriterTag.Code, TagType.Inline);\r
60         HtmlTextWriter.RegisterTag("col", HtmlTextWriterTag.Col, TagType.NonClosing);\r
61         HtmlTextWriter.RegisterTag("colgroup", HtmlTextWriterTag.Colgroup, TagType.Other);\r
62         HtmlTextWriter.RegisterTag("del", HtmlTextWriterTag.Del, TagType.Inline);\r
63         HtmlTextWriter.RegisterTag("dd", HtmlTextWriterTag.Dd, TagType.Inline);\r
64         HtmlTextWriter.RegisterTag("dfn", HtmlTextWriterTag.Dfn, TagType.Inline);\r
65         HtmlTextWriter.RegisterTag("dir", HtmlTextWriterTag.Dir, TagType.Other);\r
66         HtmlTextWriter.RegisterTag("div", HtmlTextWriterTag.Div, TagType.Other);\r
67         HtmlTextWriter.RegisterTag("dl", HtmlTextWriterTag.Dl, TagType.Other);\r
68         HtmlTextWriter.RegisterTag("dt", HtmlTextWriterTag.Dt, TagType.Inline);\r
69         HtmlTextWriter.RegisterTag("em", HtmlTextWriterTag.Em, TagType.Inline);\r
70         HtmlTextWriter.RegisterTag("embed", HtmlTextWriterTag.Embed, TagType.NonClosing);\r
71         HtmlTextWriter.RegisterTag("fieldset", HtmlTextWriterTag.Fieldset, TagType.Other);\r
72         HtmlTextWriter.RegisterTag("font", HtmlTextWriterTag.Font, TagType.Inline);\r
73         HtmlTextWriter.RegisterTag("form", HtmlTextWriterTag.Form, TagType.Other);\r
74         HtmlTextWriter.RegisterTag("frame", HtmlTextWriterTag.Frame, TagType.NonClosing);\r
75         HtmlTextWriter.RegisterTag("frameset", HtmlTextWriterTag.Frameset, TagType.Other);\r
76         HtmlTextWriter.RegisterTag("h1", HtmlTextWriterTag.H1, TagType.Other);\r
77         HtmlTextWriter.RegisterTag("h2", HtmlTextWriterTag.H2, TagType.Other);\r
78         HtmlTextWriter.RegisterTag("h3", HtmlTextWriterTag.H3, TagType.Other);\r
79         HtmlTextWriter.RegisterTag("h4", HtmlTextWriterTag.H4, TagType.Other);\r
80         HtmlTextWriter.RegisterTag("h5", HtmlTextWriterTag.H5, TagType.Other);\r
81         HtmlTextWriter.RegisterTag("h6", HtmlTextWriterTag.H6, TagType.Other);\r
82         HtmlTextWriter.RegisterTag("head", HtmlTextWriterTag.Head, TagType.Other);\r
83         HtmlTextWriter.RegisterTag("hr", HtmlTextWriterTag.Hr, TagType.NonClosing);\r
84         HtmlTextWriter.RegisterTag("html", HtmlTextWriterTag.Html, TagType.Other);\r
85         HtmlTextWriter.RegisterTag("i", HtmlTextWriterTag.I, TagType.Inline);\r
86         HtmlTextWriter.RegisterTag("iframe", HtmlTextWriterTag.Iframe, TagType.Other);\r
87         HtmlTextWriter.RegisterTag("img", HtmlTextWriterTag.Img, TagType.NonClosing);\r
88         HtmlTextWriter.RegisterTag("input", HtmlTextWriterTag.Input, TagType.NonClosing);\r
89         HtmlTextWriter.RegisterTag("ins", HtmlTextWriterTag.Ins, TagType.Inline);\r
90         HtmlTextWriter.RegisterTag("isindex", HtmlTextWriterTag.Isindex, TagType.NonClosing);\r
91         HtmlTextWriter.RegisterTag("kbd", HtmlTextWriterTag.Kbd, TagType.Inline);\r
92         HtmlTextWriter.RegisterTag("label", HtmlTextWriterTag.Label, TagType.Inline);\r
93         HtmlTextWriter.RegisterTag("legend", HtmlTextWriterTag.Legend, TagType.Other);\r
94         HtmlTextWriter.RegisterTag("li", HtmlTextWriterTag.Li, TagType.Inline);\r
95         HtmlTextWriter.RegisterTag("link", HtmlTextWriterTag.Link, TagType.NonClosing);\r
96         HtmlTextWriter.RegisterTag("map", HtmlTextWriterTag.Map, TagType.Other);\r
97         HtmlTextWriter.RegisterTag("marquee", HtmlTextWriterTag.Marquee, TagType.Other);\r
98         HtmlTextWriter.RegisterTag("menu", HtmlTextWriterTag.Menu, TagType.Other);\r
99         HtmlTextWriter.RegisterTag("meta", HtmlTextWriterTag.Meta, TagType.NonClosing);\r
100         HtmlTextWriter.RegisterTag("nobr", HtmlTextWriterTag.Nobr, TagType.Inline);\r
101         HtmlTextWriter.RegisterTag("noframes", HtmlTextWriterTag.Noframes, TagType.Other);\r
102         HtmlTextWriter.RegisterTag("noscript", HtmlTextWriterTag.Noscript, TagType.Other);\r
103         HtmlTextWriter.RegisterTag("object", HtmlTextWriterTag.Object, TagType.Other);\r
104         HtmlTextWriter.RegisterTag("ol", HtmlTextWriterTag.Ol, TagType.Other);\r
105         HtmlTextWriter.RegisterTag("option", HtmlTextWriterTag.Option, TagType.Other);\r
106         HtmlTextWriter.RegisterTag("p", HtmlTextWriterTag.P, TagType.Inline);\r
107         HtmlTextWriter.RegisterTag("param", HtmlTextWriterTag.Param, TagType.Other);\r
108         HtmlTextWriter.RegisterTag("pre", HtmlTextWriterTag.Pre, TagType.Other);\r
109         HtmlTextWriter.RegisterTag("q", HtmlTextWriterTag.Q, TagType.Inline);\r
110         HtmlTextWriter.RegisterTag("rt", HtmlTextWriterTag.Rt, TagType.Other);\r
111         HtmlTextWriter.RegisterTag("ruby", HtmlTextWriterTag.Ruby, TagType.Other);\r
112         HtmlTextWriter.RegisterTag("s", HtmlTextWriterTag.S, TagType.Inline);\r
113         HtmlTextWriter.RegisterTag("samp", HtmlTextWriterTag.Samp, TagType.Inline);\r
114         HtmlTextWriter.RegisterTag("script", HtmlTextWriterTag.Script, TagType.Other);\r
115         HtmlTextWriter.RegisterTag("select", HtmlTextWriterTag.Select, TagType.Other);\r
116         HtmlTextWriter.RegisterTag("small", HtmlTextWriterTag.Small, TagType.Other);\r
117         HtmlTextWriter.RegisterTag("span", HtmlTextWriterTag.Span, TagType.Inline);\r
118         HtmlTextWriter.RegisterTag("strike", HtmlTextWriterTag.Strike, TagType.Inline);\r
119         HtmlTextWriter.RegisterTag("strong", HtmlTextWriterTag.Strong, TagType.Inline);\r
120         HtmlTextWriter.RegisterTag("style", HtmlTextWriterTag.Style, TagType.Other);\r
121         HtmlTextWriter.RegisterTag("sub", HtmlTextWriterTag.Sub, TagType.Inline);\r
122         HtmlTextWriter.RegisterTag("sup", HtmlTextWriterTag.Sup, TagType.Inline);\r
123         HtmlTextWriter.RegisterTag("table", HtmlTextWriterTag.Table, TagType.Other);\r
124         HtmlTextWriter.RegisterTag("tbody", HtmlTextWriterTag.Tbody, TagType.Other);\r
125         HtmlTextWriter.RegisterTag("td", HtmlTextWriterTag.Td, TagType.Inline);\r
126         HtmlTextWriter.RegisterTag("textarea", HtmlTextWriterTag.Textarea, TagType.Inline);\r
127         HtmlTextWriter.RegisterTag("tfoot", HtmlTextWriterTag.Tfoot, TagType.Other);\r
128         HtmlTextWriter.RegisterTag("th", HtmlTextWriterTag.Th, TagType.Inline);\r
129         HtmlTextWriter.RegisterTag("thead", HtmlTextWriterTag.Thead, TagType.Other);\r
130         HtmlTextWriter.RegisterTag("title", HtmlTextWriterTag.Title, TagType.Other);\r
131         HtmlTextWriter.RegisterTag("tr", HtmlTextWriterTag.Tr, TagType.Other);\r
132         HtmlTextWriter.RegisterTag("tt", HtmlTextWriterTag.Tt, TagType.Inline);\r
133         HtmlTextWriter.RegisterTag("u", HtmlTextWriterTag.U, TagType.Inline);\r
134         HtmlTextWriter.RegisterTag("ul", HtmlTextWriterTag.Ul, TagType.Other);\r
135         HtmlTextWriter.RegisterTag("var", HtmlTextWriterTag.Var, TagType.Inline);\r
136         HtmlTextWriter.RegisterTag("wbr", HtmlTextWriterTag.Wbr, TagType.NonClosing);\r
137         HtmlTextWriter.RegisterTag("xml", HtmlTextWriterTag.Xml, TagType.Other);\r
138 \r
139         HtmlTextWriter._attrKeyLookupTable = new Hashtable(40,CaseInsensitiveHashCodeProvider.Default,\r
140                                                            CaseInsensitiveComparer.Default);\r
141         HtmlTextWriter._attrNameLookupArray = new AttributeInformation[40];\r
142         HtmlTextWriter.RegisterAttribute("accesskey", HtmlTextWriterAttribute.Accesskey, true);\r
143         HtmlTextWriter.RegisterAttribute("align", HtmlTextWriterAttribute.Align, false);\r
144         HtmlTextWriter.RegisterAttribute("alt", HtmlTextWriterAttribute.Alt, true);\r
145         HtmlTextWriter.RegisterAttribute("background", HtmlTextWriterAttribute.Background, true);\r
146         HtmlTextWriter.RegisterAttribute("bgcolor", HtmlTextWriterAttribute.Bgcolor, false);\r
147         HtmlTextWriter.RegisterAttribute("border", HtmlTextWriterAttribute.Border, false);\r
148         HtmlTextWriter.RegisterAttribute("bordercolor", HtmlTextWriterAttribute.Bordercolor, false);\r
149         HtmlTextWriter.RegisterAttribute("cellpadding", HtmlTextWriterAttribute.Cellpadding, false);\r
150         HtmlTextWriter.RegisterAttribute("cellspacing", HtmlTextWriterAttribute.Cellspacing, false);\r
151         HtmlTextWriter.RegisterAttribute("checked", HtmlTextWriterAttribute.Checked, false);\r
152         HtmlTextWriter.RegisterAttribute("class", HtmlTextWriterAttribute.Class, true);\r
153         HtmlTextWriter.RegisterAttribute("cols", HtmlTextWriterAttribute.Cols, false);\r
154         HtmlTextWriter.RegisterAttribute("colspan", HtmlTextWriterAttribute.Colspan, false);\r
155         HtmlTextWriter.RegisterAttribute("disabled", HtmlTextWriterAttribute.Disabled, false);\r
156         HtmlTextWriter.RegisterAttribute("for", HtmlTextWriterAttribute.For, false);\r
157         HtmlTextWriter.RegisterAttribute("height", HtmlTextWriterAttribute.Height, false);\r
158         HtmlTextWriter.RegisterAttribute("href", HtmlTextWriterAttribute.Href, true);\r
159         HtmlTextWriter.RegisterAttribute("id", HtmlTextWriterAttribute.Id, false);\r
160         HtmlTextWriter.RegisterAttribute("maxlength", HtmlTextWriterAttribute.Maxlength, false);\r
161         HtmlTextWriter.RegisterAttribute("multiple", HtmlTextWriterAttribute.Multiple, false);\r
162         HtmlTextWriter.RegisterAttribute("name", HtmlTextWriterAttribute.Name, false);\r
163         HtmlTextWriter.RegisterAttribute("nowrap", HtmlTextWriterAttribute.Nowrap, false);\r
164         HtmlTextWriter.RegisterAttribute("onchange", HtmlTextWriterAttribute.Onchange, true);\r
165         HtmlTextWriter.RegisterAttribute("onclick", HtmlTextWriterAttribute.Onclick, true);\r
166         HtmlTextWriter.RegisterAttribute("readonly", HtmlTextWriterAttribute.ReadOnly, false);\r
167         HtmlTextWriter.RegisterAttribute("rows", HtmlTextWriterAttribute.Rows, false);\r
168         HtmlTextWriter.RegisterAttribute("rowspan", HtmlTextWriterAttribute.Rowspan, false);\r
169         HtmlTextWriter.RegisterAttribute("rules", HtmlTextWriterAttribute.Rules, false);\r
170         HtmlTextWriter.RegisterAttribute("selected", HtmlTextWriterAttribute.Selected, false);\r
171         HtmlTextWriter.RegisterAttribute("size", HtmlTextWriterAttribute.Size, false);\r
172         HtmlTextWriter.RegisterAttribute("src", HtmlTextWriterAttribute.Src, true);\r
173         HtmlTextWriter.RegisterAttribute("style", HtmlTextWriterAttribute.Style, false);\r
174         HtmlTextWriter.RegisterAttribute("tabindex", HtmlTextWriterAttribute.Tabindex, false);\r
175         HtmlTextWriter.RegisterAttribute("target", HtmlTextWriterAttribute.Target, false);\r
176         HtmlTextWriter.RegisterAttribute("title", HtmlTextWriterAttribute.Title, true);\r
177         HtmlTextWriter.RegisterAttribute("type", HtmlTextWriterAttribute.Type, false);\r
178         HtmlTextWriter.RegisterAttribute("valign", HtmlTextWriterAttribute.Valign, false);\r
179         HtmlTextWriter.RegisterAttribute("value", HtmlTextWriterAttribute.Value, true);\r
180         HtmlTextWriter.RegisterAttribute("width", HtmlTextWriterAttribute.Width, false);\r
181         HtmlTextWriter.RegisterAttribute("wrap", HtmlTextWriterAttribute.Wrap, false);\r
182 \r
183 #if NET_2_0\r
184         HtmlTextWriter._styleNameLookupArray = new String[42];\r
185 #else\r
186         HtmlTextWriter._styleNameLookupArray = new String[14];\r
187 #endif\r
188         HtmlTextWriter._styleKeyLookupTable = new Hashtable (HtmlTextWriter._styleNameLookupArray.Length,\r
189                                                                 CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);\r
190         HtmlTextWriter.RegisterStyle("background-color", HtmlTextWriterStyle.BackgroundColor);\r
191         HtmlTextWriter.RegisterStyle("background-image", HtmlTextWriterStyle.BackgroundImage);\r
192         HtmlTextWriter.RegisterStyle("border-collapse", HtmlTextWriterStyle.BorderCollapse);\r
193         HtmlTextWriter.RegisterStyle("border-color", HtmlTextWriterStyle.BorderColor);\r
194         HtmlTextWriter.RegisterStyle("border-style", HtmlTextWriterStyle.BorderStyle);\r
195         HtmlTextWriter.RegisterStyle("border-width", HtmlTextWriterStyle.BorderWidth);\r
196         HtmlTextWriter.RegisterStyle("color", HtmlTextWriterStyle.Color);\r
197         HtmlTextWriter.RegisterStyle("font-family", HtmlTextWriterStyle.FontFamily);\r
198         HtmlTextWriter.RegisterStyle("font-size", HtmlTextWriterStyle.FontSize);\r
199         HtmlTextWriter.RegisterStyle("font-style", HtmlTextWriterStyle.FontStyle);\r
200         HtmlTextWriter.RegisterStyle("font-weight", HtmlTextWriterStyle.FontWeight);\r
201         HtmlTextWriter.RegisterStyle("height", HtmlTextWriterStyle.Height);\r
202         HtmlTextWriter.RegisterStyle("text-decoration", HtmlTextWriterStyle.TextDecoration);\r
203         HtmlTextWriter.RegisterStyle("width", HtmlTextWriterStyle.Width);\r
204 #if NET_2_0\r
205         HtmlTextWriter.RegisterStyle("list-style-image", HtmlTextWriterStyle.ListStyleImage);\r
206         HtmlTextWriter.RegisterStyle("list-style-type", HtmlTextWriterStyle.ListStyleType);\r
207         HtmlTextWriter.RegisterStyle("cursor", HtmlTextWriterStyle.Cursor);\r
208         HtmlTextWriter.RegisterStyle("direction", HtmlTextWriterStyle.Direction);\r
209         HtmlTextWriter.RegisterStyle("display", HtmlTextWriterStyle.Display);\r
210         HtmlTextWriter.RegisterStyle("filter", HtmlTextWriterStyle.Filter);\r
211         HtmlTextWriter.RegisterStyle("font-variant", HtmlTextWriterStyle.FontVariant);\r
212         HtmlTextWriter.RegisterStyle("left", HtmlTextWriterStyle.Left);\r
213         HtmlTextWriter.RegisterStyle("margin", HtmlTextWriterStyle.Margin);\r
214         HtmlTextWriter.RegisterStyle("margin-bottom", HtmlTextWriterStyle.MarginBottom);\r
215         HtmlTextWriter.RegisterStyle("margin-left", HtmlTextWriterStyle.MarginLeft);\r
216         HtmlTextWriter.RegisterStyle("margin-right", HtmlTextWriterStyle.MarginRight);\r
217         HtmlTextWriter.RegisterStyle("margin-top", HtmlTextWriterStyle.MarginTop);\r
218         HtmlTextWriter.RegisterStyle("overflow", HtmlTextWriterStyle.Overflow);\r
219         HtmlTextWriter.RegisterStyle("overflow-x", HtmlTextWriterStyle.OverflowX);\r
220         HtmlTextWriter.RegisterStyle("overflow-y", HtmlTextWriterStyle.OverflowY);\r
221         HtmlTextWriter.RegisterStyle("padding", HtmlTextWriterStyle.Padding);\r
222         HtmlTextWriter.RegisterStyle("padding-bottom", HtmlTextWriterStyle.PaddingBottom);\r
223         HtmlTextWriter.RegisterStyle("padding-left", HtmlTextWriterStyle.PaddingLeft);\r
224         HtmlTextWriter.RegisterStyle("padding-right", HtmlTextWriterStyle.PaddingRight);\r
225         HtmlTextWriter.RegisterStyle("padding-top", HtmlTextWriterStyle.PaddingTop);\r
226         HtmlTextWriter.RegisterStyle("position", HtmlTextWriterStyle.Position);\r
227         HtmlTextWriter.RegisterStyle("text-align", HtmlTextWriterStyle.TextAlign);\r
228         HtmlTextWriter.RegisterStyle("text-overflow", HtmlTextWriterStyle.TextOverflow);\r
229         HtmlTextWriter.RegisterStyle("top", HtmlTextWriterStyle.Top);\r
230         HtmlTextWriter.RegisterStyle("visibility", HtmlTextWriterStyle.Visibility);\r
231         HtmlTextWriter.RegisterStyle("white-space", HtmlTextWriterStyle.WhiteSpace);\r
232         HtmlTextWriter.RegisterStyle("z-index", HtmlTextWriterStyle.ZIndex);\r
233 #endif\r
234 }\r
235 \r
236 public HtmlTextWriter(TextWriter writer):this(writer, " "){}\r
237 \r
238 public HtmlTextWriter(TextWriter writer, string tabString) : base() {\r
239         this.writer = writer;\r
240         this.tabString = tabString;\r
241         indentLevel = 0;\r
242         tabsPending = false;\r
243         _httpWriter = writer as HttpWriter;\r
244         _isDescendant = GetType() == typeof(HtmlTextWriter) == false;\r
245         _attrList = new RenderAttribute[20];\r
246         _attrCount = 0;\r
247         _styleList = new RenderStyle[20];\r
248         _styleCount = 0;\r
249         _endTags = new TagStackEntry[16];\r
250         _endTagCount = 0;\r
251         _inlineCount = 0;\r
252 }\r
253 \r
254 public virtual void AddAttribute(HtmlTextWriterAttribute key, string value){\r
255         if ((int) key >= 0 && (int) key < HtmlTextWriter._attrNameLookupArray.Length) {\r
256                 AttributeInformation attrInfo = HtmlTextWriter._attrNameLookupArray[(int) key];\r
257                 AddAttribute(attrInfo.name, value, key, attrInfo.encode);\r
258         }\r
259 }\r
260 \r
261 public virtual void AddAttribute(HtmlTextWriterAttribute key, string value, bool fEncode){\r
262         if ((int) key >= 0 && (int) key < HtmlTextWriter._attrNameLookupArray.Length) {\r
263                 AddAttribute(HtmlTextWriter._attrNameLookupArray[(int) key].name, value, key, fEncode);\r
264         }\r
265 }\r
266 \r
267 public virtual void AddAttribute(string name, string value){\r
268         HtmlTextWriterAttribute attr = GetAttributeKey(name);\r
269         value = EncodeAttributeValue(GetAttributeKey(name), value);\r
270         AddAttribute(name, value, attr);\r
271 }\r
272 \r
273 public virtual void AddAttribute(string name, string value, bool fEndode){\r
274         value = EncodeAttributeValue(value, fEndode);\r
275         AddAttribute(name, value, GetAttributeKey(name));\r
276 }\r
277 \r
278 protected virtual void AddAttribute(string name, string value, HtmlTextWriterAttribute key){\r
279         AddAttribute(name, value, key, false);\r
280 }\r
281 \r
282 private void AddAttribute(string name, string value, HtmlTextWriterAttribute key, bool encode){\r
283         if (_attrCount >= (int) _attrList.Length) {\r
284                 RenderAttribute[] rAttrArr = new RenderAttribute[_attrList.Length * 2];\r
285                 System.Array.Copy(_attrList, rAttrArr, (int) _attrList.Length);\r
286                 _attrList = rAttrArr;\r
287         }\r
288         RenderAttribute rAttr;\r
289         rAttr.name = name;\r
290         rAttr.value = value;\r
291         rAttr.key = key;\r
292         rAttr.encode = encode;\r
293         _attrList [_attrCount++] = rAttr;\r
294 }\r
295 \r
296 public virtual void AddStyleAttribute(HtmlTextWriterStyle key, string value){\r
297         AddStyleAttribute(GetStyleName(key), value, key);\r
298 }\r
299 \r
300 public virtual void AddStyleAttribute(string name, string value){\r
301         AddStyleAttribute(name, value, GetStyleKey(name));\r
302 }\r
303 \r
304 protected virtual void AddStyleAttribute(string name, string value, HtmlTextWriterStyle key){\r
305         if (_styleCount >= (int) _styleList.Length) {\r
306                 RenderStyle[] rAttrArr = new RenderStyle[_styleList.Length * 2];\r
307                 System.Array.Copy(_styleList, rAttrArr, (int) _styleList.Length);\r
308                 _styleList = rAttrArr;\r
309         }\r
310         RenderStyle rAttr;\r
311         rAttr.name = name;\r
312         rAttr.value = value;\r
313         rAttr.key = key;\r
314         _styleList [_styleCount++] = rAttr;\r
315 }\r
316 \r
317 public override void Close(){\r
318         writer.Close();\r
319 }\r
320 \r
321 protected virtual string EncodeAttributeValue(HtmlTextWriterAttribute attrKey, string value){\r
322         bool valid = true;\r
323         if (0 <= (int) attrKey && (int) attrKey < HtmlTextWriter._attrNameLookupArray.Length)\r
324                 valid = HtmlTextWriter._attrNameLookupArray[(int) attrKey].encode;\r
325         return EncodeAttributeValue(value, valid);\r
326 }\r
327 \r
328 protected string EncodeAttributeValue(string value, bool fEncode){\r
329         if (value == null)\r
330                 return null;\r
331         if (!(fEncode))\r
332                 return value;\r
333         return System.Web.HttpUtility.HtmlAttributeEncode(value);\r
334 }\r
335 \r
336 protected string EncodeUrl(string url){\r
337         if (url.IndexOf(SpaceChar) < 0)\r
338                 return url;\r
339         System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
340         for(int i=0; i <= url.Length; i++){\r
341                 char temp = url[i];\r
342                 if (temp != 32)\r
343                         sb.Append(temp);\r
344                 else\r
345                         sb.Append("%20");\r
346         }\r
347         return sb.ToString();\r
348 }\r
349 \r
350 protected virtual void FilterAttributes(){\r
351         int count = 0;\r
352         for(int i=0; i < _styleCount; i++){\r
353                 RenderStyle rStyle = _styleList[i];\r
354                 if (OnStyleAttributeRender(rStyle.name, rStyle.value, rStyle.key)) {\r
355                         count++;\r
356                 }\r
357         }\r
358         _styleCount = count;\r
359         count = 0;\r
360         for(int i=0; i <= _attrCount; i++){\r
361                 RenderAttribute rAttr = _attrList[i];\r
362                 if (OnAttributeRender(rAttr.name, rAttr.value, rAttr.key)) {\r
363                         count++;\r
364                 }\r
365         }\r
366         _attrCount = count;\r
367 }\r
368 \r
369 public override void Flush(){\r
370         writer.Flush();\r
371 }\r
372 \r
373 protected HtmlTextWriterAttribute GetAttributeKey(string attrName){\r
374         if (attrName != null && attrName.Length > 0) {\r
375                 object attr = HtmlTextWriter._attrKeyLookupTable[attrName];\r
376                 if (attr != null)\r
377                         return (HtmlTextWriterAttribute) attr;\r
378         }\r
379         return (HtmlTextWriterAttribute) (-1);\r
380 }\r
381 \r
382 protected string GetAttributeName(HtmlTextWriterAttribute attrKey){\r
383         if ((int) attrKey >= 0 && (int) attrKey < HtmlTextWriter._attrNameLookupArray.Length)\r
384                 return HtmlTextWriter._attrNameLookupArray[(int) attrKey].name;\r
385         return System.String.Empty;\r
386 }\r
387 \r
388 protected HtmlTextWriterStyle GetStyleKey(string styleName){\r
389         if (styleName != null && styleName.Length > 0) {\r
390                 object style = HtmlTextWriter._styleKeyLookupTable[styleName];\r
391                 if (style != null)\r
392                         return (HtmlTextWriterStyle) style;\r
393         }\r
394         return (HtmlTextWriterStyle) (-1);\r
395 }\r
396 \r
397 protected string GetStyleName(HtmlTextWriterStyle styleKey){\r
398         return StaticGetStyleName (styleKey);\r
399 }\r
400 \r
401 internal static string StaticGetStyleName (HtmlTextWriterStyle styleKey){\r
402         if ((int) styleKey >= 0 && (int) styleKey < HtmlTextWriter._styleNameLookupArray.Length)\r
403                 return HtmlTextWriter._styleNameLookupArray[(int) styleKey];\r
404         return System.String.Empty;\r
405 }\r
406 \r
407 protected virtual HtmlTextWriterTag GetTagKey(string tagName){\r
408         if (tagName != null && tagName.Length > 0) {\r
409                 object tag = HtmlTextWriter._tagKeyLookupTable[tagName];\r
410                 if (tag != null)\r
411                         return (HtmlTextWriterTag) tag;\r
412         }\r
413         return 0;\r
414 }\r
415 \r
416 protected virtual string GetTagName(HtmlTextWriterTag tagKey){\r
417         if ((int) tagKey >= 0 && (int) tagKey < HtmlTextWriter._tagNameLookupArray.Length)\r
418                 return HtmlTextWriter._tagNameLookupArray[(int) tagKey].name;\r
419         return System.String.Empty;\r
420 }\r
421 \r
422 protected bool IsAttributeDefined(HtmlTextWriterAttribute key){\r
423         for (int i=0; i < _attrCount; i++) {\r
424                 if (_attrList[i].key == key)\r
425                         return true;\r
426         }\r
427         return false;\r
428 }\r
429 \r
430 protected bool IsAttributeDefined(HtmlTextWriterAttribute key, out string value){\r
431         value = null;\r
432         for (int i=0; i < _attrCount; i++) {\r
433                 if (_attrList[i].key == key) {\r
434                         value = _attrList[i].value;\r
435                         return true;\r
436                 }\r
437         }\r
438         return false;\r
439 }\r
440 \r
441 protected bool IsStyleAttributeDefined(HtmlTextWriterStyle key){\r
442         for (int i= 0; i < _styleCount; i++) {\r
443                 if (_styleList[i].key == key)\r
444                         return true;\r
445         }\r
446         return false;\r
447 }\r
448 \r
449 protected bool IsStyleAttributeDefined(HtmlTextWriterStyle key, out string value){\r
450         value = null;\r
451         for( int i=0; i < _styleCount; i++) {\r
452                 if (_styleList[i].key == key) {\r
453                         value = _styleList[i].value;\r
454                         return true;\r
455                 }\r
456         }\r
457         return false;\r
458 }\r
459 \r
460 protected virtual bool OnAttributeRender(string name, string value, HtmlTextWriterAttribute key){\r
461         return true;\r
462 }\r
463 \r
464 protected virtual bool OnStyleAttributeRender(string name, string value, HtmlTextWriterStyle key){\r
465         return true;\r
466 }\r
467 \r
468 protected virtual bool OnTagRender(string name, HtmlTextWriterTag key){\r
469         return true;\r
470 }\r
471 \r
472 protected virtual void OutputTabs(){\r
473         if (tabsPending) {\r
474                 for(int i=0; i < indentLevel; i++) {\r
475                         writer.Write(tabString);\r
476                 }\r
477                 tabsPending = false;\r
478         }\r
479 }\r
480 \r
481 protected string PopEndTag(){\r
482         if (_endTagCount <= 0)\r
483                 throw new InvalidOperationException("A PopEndTag was called without a corresponding PushEndTag");\r
484         _endTagCount--;\r
485         TagKey = _endTags[_endTagCount].tagKey;\r
486         return _endTags[_endTagCount].endTagText;\r
487 }\r
488 \r
489 protected void PushEndTag(string endTag){\r
490         if (_endTagCount >= (int) _endTags.Length) {\r
491                 TagStackEntry[] temp = new TagStackEntry[(int) _endTags.Length * 2];\r
492                 System.Array.Copy(_endTags, temp, (int) _endTags.Length);\r
493                 _endTags = temp;\r
494         }\r
495         _endTags[_endTagCount].tagKey = _tagKey;\r
496         _endTags[_endTagCount].endTagText = endTag;\r
497         _endTagCount++;\r
498 }\r
499 \r
500 protected static void RegisterAttribute(string name, HtmlTextWriterAttribute key){\r
501         HtmlTextWriter.RegisterAttribute(name, key, false);\r
502 }\r
503 \r
504 private static void RegisterAttribute(string name, HtmlTextWriterAttribute key, bool fEncode){\r
505         name = name.ToLower();\r
506         HtmlTextWriter._attrKeyLookupTable.Add(name, key);\r
507         if ((int) key < (int) HtmlTextWriter._attrNameLookupArray.Length)\r
508                 HtmlTextWriter._attrNameLookupArray[(int) key] = new AttributeInformation(name, fEncode);\r
509 }\r
510 \r
511 protected static void RegisterStyle(string name, HtmlTextWriterStyle key){\r
512         name = name.ToLower();\r
513         HtmlTextWriter._styleKeyLookupTable.Add(name, key);\r
514         if ((int) key < (int) HtmlTextWriter._styleNameLookupArray.Length)\r
515                 HtmlTextWriter._styleNameLookupArray[(int) key] = name;\r
516 }\r
517 \r
518 protected static void RegisterTag(string name, HtmlTextWriterTag key){\r
519         HtmlTextWriter.RegisterTag(name, key, TagType.Other);\r
520 }\r
521 \r
522 private static void RegisterTag(string name, HtmlTextWriterTag key, TagType type){\r
523         name = name.ToLower();\r
524         HtmlTextWriter._tagKeyLookupTable.Add(name, key);\r
525         string fullTag = null;\r
526         if ((int) type != 1 && (int) key != 0) {\r
527                 fullTag = EndTagLeftChars + name + TagRightChar;\r
528         }\r
529         if ((int) key < HtmlTextWriter._tagNameLookupArray.Length)\r
530                 HtmlTextWriter._tagNameLookupArray[(int) key] = new TagInformation(name, type, fullTag);\r
531 }\r
532 \r
533 protected virtual string RenderAfterContent(){\r
534         return null;\r
535 }\r
536 \r
537 protected virtual string RenderAfterTag(){\r
538         return null;\r
539 }\r
540 \r
541 protected virtual string RenderBeforeContent(){\r
542         return null;\r
543 }\r
544 \r
545 protected virtual string RenderBeforeTag(){\r
546         return null;\r
547 }\r
548 \r
549 public virtual void RenderBeginTag(HtmlTextWriterTag tagKey){\r
550         TagKey = tagKey;\r
551         bool tagRendered = true;\r
552         bool tagRender = true;\r
553         if (_isDescendant) {\r
554                 tagRender = OnTagRender(_tagName, _tagKey);\r
555                 FilterAttributes();\r
556                 string beforeTag = RenderBeforeTag();\r
557                 if (beforeTag != null) {\r
558                         if (tabsPending)\r
559                                 OutputTabs();\r
560                         writer.Write(beforeTag);\r
561                 }\r
562         }\r
563         TagInformation currentTag = HtmlTextWriter._tagNameLookupArray[_tagIndex];\r
564         if (currentTag.closingTag == null && currentTag.tagType == TagType.Other) {\r
565                 currentTag.closingTag = EndTagLeftChars + _tagName + TagRightChar;\r
566         }\r
567 \r
568         if (tagRender) {\r
569                 tagRendered = false;\r
570                 if (tabsPending)\r
571                         OutputTabs();\r
572                 writer.Write(TagLeftChar);\r
573                 writer.Write(_tagName);\r
574                 RenderAttribute rAttr;\r
575                 string rAttrValue = null;\r
576                 for (int i=0; i < _attrCount; i++) {\r
577                         rAttr = _attrList[i];\r
578                         if (rAttr.key == HtmlTextWriterAttribute.Style)\r
579                                 rAttrValue = rAttr.value;\r
580                         else {\r
581                                 writer.Write(SpaceChar);\r
582                                 writer.Write(rAttr.name);\r
583                                 if (rAttr.value != null) {\r
584                                         writer.Write(EqualsChar);\r
585                                         writer.Write(DoubleQuoteChar);\r
586                                         if (rAttr.encode) {\r
587                                                 if (_httpWriter == null) {\r
588                                                         System.Web.HttpUtility.HtmlAttributeEncode(rAttr.value, writer);\r
589                                                 }\r
590                                                 else {\r
591                                                         System.Web.HttpUtility.HtmlAttributeEncode(rAttr.value, (TextWriter) _httpWriter);\r
592                                                 }\r
593                                         }\r
594                                         else {\r
595                                                 writer.Write(rAttr.value);\r
596                                         }\r
597                                         writer.Write(DoubleQuoteChar);\r
598                                 }\r
599                         }\r
600                 }\r
601                 if (_styleCount > 0 || rAttrValue != null) {\r
602                         writer.Write(SpaceChar);\r
603                         writer.Write("style");\r
604                         writer.Write(EqualsChar);\r
605                         writer.Write(DoubleQuoteChar);\r
606                         RenderStyle rStyle;\r
607                         for (int i=0; i < _styleCount; i++) {\r
608                                 rStyle = _styleList[i];\r
609                                 writer.Write(rStyle.name);\r
610                                 writer.Write(StyleEqualsChar);\r
611                                 writer.Write(rStyle.value);\r
612                                 writer.Write(SemicolonChar);\r
613                         }\r
614                         if (rAttrValue != null)\r
615                                 writer.Write(rAttrValue);\r
616                         writer.Write(DoubleQuoteChar);\r
617                 }\r
618                 if (currentTag.tagType == TagType.NonClosing) {\r
619                         writer.Write(SpaceChar);\r
620                         writer.Write(SlashChar);\r
621                         writer.Write(TagRightChar);\r
622                 }\r
623                 else\r
624                         writer.Write(TagRightChar);\r
625         }\r
626         string beforeContent = RenderBeforeContent();\r
627         if (beforeContent != null) {\r
628                 if (tabsPending)\r
629                         OutputTabs();\r
630                 writer.Write(beforeContent);\r
631         }\r
632         if (tagRendered) {\r
633                 if (currentTag.tagType == TagType.Inline)\r
634                         _inlineCount++;\r
635                 else {\r
636                         WriteLine();\r
637                         Indent++;\r
638                 }\r
639                 if (currentTag.closingTag == null) {\r
640                         currentTag.closingTag = EndTagLeftChars + _tagName + TagRightChar;\r
641                 }\r
642         }\r
643         if (_isDescendant) {\r
644                 string afterContent = RenderAfterContent();\r
645                 if (afterContent != null) {\r
646                         if (currentTag.closingTag != null)\r
647                                 currentTag.closingTag = afterContent;\r
648                 }\r
649                 string afterTag = RenderAfterTag();\r
650                 if (afterTag != null) {\r
651                         if (currentTag.closingTag != null)\r
652                                 currentTag.closingTag = afterTag;\r
653                 }\r
654         }\r
655         PushEndTag(currentTag.closingTag);\r
656         _attrCount = 0;\r
657         _styleCount = 0;\r
658 }\r
659 \r
660 public virtual void RenderBeginTag(string tagName){\r
661         TagName = tagName;\r
662         RenderBeginTag(_tagKey);\r
663 }\r
664 \r
665 public virtual void RenderEndTag(){\r
666         string endTagText = PopEndTag();\r
667         if (endTagText != null) {\r
668                 if (HtmlTextWriter._tagNameLookupArray[_tagIndex].tagType == 0) {\r
669                         _inlineCount--;\r
670                         Write(endTagText);\r
671                 }\r
672                 else{\r
673                         WriteLine();\r
674                         Indent--;\r
675                         Write(endTagText);\r
676                 }\r
677         }\r
678 }\r
679 \r
680 public override void Write(bool value){\r
681         if (tabsPending)\r
682                 OutputTabs();\r
683         writer.Write(value);\r
684 }\r
685 \r
686 public override void Write(char value){\r
687         if (tabsPending)\r
688                 OutputTabs();\r
689         writer.Write(value);\r
690 }\r
691 \r
692 public override void Write(char[] buffer){\r
693         if (tabsPending)\r
694                 OutputTabs();\r
695         writer.Write(buffer);\r
696 }\r
697 \r
698 public override void Write(char[] buffer, int index, int count){\r
699         if (tabsPending)\r
700                 OutputTabs();\r
701         writer.Write(buffer, index, count);\r
702 }\r
703 \r
704 public override void Write(double value){\r
705         if (tabsPending)\r
706                 OutputTabs();\r
707         writer.Write(value);\r
708 }\r
709 \r
710 public override void Write(int value){\r
711         if (tabsPending)\r
712                 OutputTabs();\r
713         writer.Write(value);\r
714 }\r
715 \r
716 public override void Write(long value){\r
717         if (tabsPending)\r
718                 OutputTabs();\r
719         writer.Write(value);\r
720 }\r
721 \r
722 public override void Write(object value){\r
723         if (tabsPending)\r
724                 OutputTabs();\r
725         writer.Write(value);\r
726 }\r
727 \r
728 public override void Write(float value){\r
729         if (tabsPending)\r
730                 OutputTabs();\r
731         writer.Write(value);\r
732 }\r
733 \r
734 public override void Write(string s){\r
735         if (tabsPending)\r
736                 OutputTabs();\r
737         writer.Write(s);\r
738 }\r
739 \r
740 public override void Write(string format, object arg0){\r
741         if (tabsPending)\r
742                 OutputTabs();\r
743         writer.Write(format, arg0);\r
744 }\r
745 \r
746 public override void Write(string format, object arg0, object arg1){\r
747         if (tabsPending)\r
748                 OutputTabs();\r
749         writer.Write(format, arg0, arg1);\r
750 }\r
751 \r
752 public override void Write(string format, params object[] arg){\r
753         if (tabsPending)\r
754                 OutputTabs();\r
755         writer.Write(format, arg);\r
756 }\r
757 \r
758 public virtual void WriteAttribute(string name, string value){\r
759         WriteAttribute(name, value, false);\r
760 }\r
761 \r
762 public virtual void WriteAttribute(string name, string value, bool fEncode){\r
763         writer.Write(SpaceChar);\r
764         writer.Write(name);\r
765         if (value != null) {\r
766                 writer.Write(EqualsChar);\r
767                 writer.Write(DoubleQuoteChar);\r
768                 if (fEncode) {\r
769                         if (_httpWriter == null) {\r
770                                 System.Web.HttpUtility.HtmlAttributeEncode(value, writer);\r
771                         }\r
772                         else{\r
773                                 System.Web.HttpUtility.HtmlAttributeEncode(value, (TextWriter) _httpWriter);\r
774                         }\r
775                 }\r
776                 else{\r
777                         writer.Write(value);\r
778                 }\r
779                 writer.Write(DoubleQuoteChar);\r
780         }\r
781 }\r
782 \r
783 public virtual void WriteBeginTag(string tagName){\r
784         if (tabsPending)\r
785                 OutputTabs();\r
786         writer.Write(TagLeftChar);\r
787         writer.Write(tagName);\r
788 }\r
789 \r
790 public virtual void WriteEndTag(string tagName){\r
791         if (tabsPending)\r
792                 OutputTabs();\r
793         writer.Write(TagLeftChar);\r
794         writer.Write(SlashChar);\r
795         writer.Write(tagName);\r
796         writer.Write(TagRightChar);\r
797 }\r
798 \r
799 public virtual void WriteFullBeginTag(string tagName){\r
800         if (tabsPending)\r
801                 OutputTabs();\r
802         writer.Write(TagLeftChar);\r
803         writer.Write(tagName);\r
804         writer.Write(TagRightChar);\r
805 }\r
806 \r
807 public override void WriteLine(){\r
808         writer.WriteLine();\r
809         tabsPending = true;\r
810 }\r
811 \r
812 public override void WriteLine(bool value){\r
813         if (tabsPending)\r
814                 OutputTabs();\r
815         writer.WriteLine(value);\r
816         tabsPending = true;\r
817 }\r
818 \r
819 public override void WriteLine(char value){\r
820         if (tabsPending)\r
821                 OutputTabs();\r
822         writer.WriteLine(value);\r
823         tabsPending = true;\r
824 }\r
825 \r
826 public override void WriteLine(char[] buffer){\r
827         if (tabsPending)\r
828                 OutputTabs();\r
829         writer.WriteLine(buffer);\r
830         tabsPending = true;\r
831 }\r
832 \r
833 public override void WriteLine(char[] buffer, int index, int count){\r
834         if (tabsPending)\r
835                 OutputTabs();\r
836         writer.WriteLine(buffer, index, count);\r
837         tabsPending = true;\r
838 }\r
839 \r
840 public override void WriteLine(double value){\r
841         if (tabsPending)\r
842                 OutputTabs();\r
843         writer.WriteLine(value);\r
844         tabsPending = true;\r
845 }\r
846 \r
847 public override void WriteLine(int value){\r
848         if (tabsPending)\r
849                 OutputTabs();\r
850         writer.WriteLine(value);\r
851         tabsPending = true;\r
852 }\r
853 \r
854 public override void WriteLine(long value){\r
855         if (tabsPending)\r
856                 OutputTabs();\r
857         writer.WriteLine(value);\r
858         tabsPending = true;\r
859 }\r
860 \r
861 public override void WriteLine(object value){\r
862         if (tabsPending)\r
863                 OutputTabs();\r
864         writer.WriteLine(value);\r
865         tabsPending = true;\r
866 }\r
867 \r
868 public override void WriteLine(float value){\r
869         if (tabsPending)\r
870                 OutputTabs();\r
871         writer.WriteLine(value);\r
872         tabsPending = true;\r
873 }\r
874 \r
875 public override void WriteLine(string s){\r
876         if (tabsPending)\r
877                 OutputTabs();\r
878         writer.WriteLine(s);\r
879         tabsPending = true;\r
880 }\r
881 \r
882 public override void WriteLine(string format, object arg0){\r
883         if (tabsPending)\r
884                 OutputTabs();\r
885         writer.WriteLine(format, arg0);\r
886         tabsPending = true;\r
887 }\r
888 \r
889 public override void WriteLine(string format, object arg0, object arg1){\r
890         if (tabsPending)\r
891                 OutputTabs();\r
892         writer.WriteLine(format, arg0, arg1);\r
893         tabsPending = true;\r
894 }\r
895 \r
896 public override void WriteLine(string format, params object[] arg){\r
897         if (tabsPending)\r
898                 OutputTabs();\r
899         writer.WriteLine(format, arg);\r
900         tabsPending = true;\r
901 }\r
902 \r
903 [CLSCompliant(false)]\r
904 public override void WriteLine(uint value){\r
905         if (tabsPending)\r
906                 OutputTabs();\r
907         writer.WriteLine(value);\r
908         tabsPending = true;\r
909 }\r
910 \r
911 public void WriteLineNoTabs(string s){\r
912         writer.WriteLine(s);\r
913 }\r
914 \r
915 public virtual void WriteStyleAttribute(string name, string value){\r
916         WriteStyleAttribute(name, value, false);\r
917 }\r
918 \r
919 public virtual void WriteStyleAttribute(string name, string value, bool fEncode){\r
920         writer.Write(name);\r
921         writer.Write(StyleEqualsChar);\r
922         if (fEncode) {\r
923                 if (_httpWriter == null) {\r
924                         System.Web.HttpUtility.HtmlAttributeEncode(value, writer);\r
925                 }\r
926                 else{\r
927                         System.Web.HttpUtility.HtmlAttributeEncode(value, (TextWriter) _httpWriter);\r
928                 }\r
929         }\r
930         else {\r
931                 writer.Write(value);\r
932         }\r
933         writer.Write(SemicolonChar);\r
934 }\r
935 \r
936 public override System.Text.Encoding Encoding { \r
937         get{\r
938                 return writer.Encoding;\r
939         }\r
940 }\r
941 \r
942 public int Indent { \r
943         get{\r
944                 return indentLevel;\r
945         }\r
946         set{\r
947                 if (value < 0)\r
948                         value = 0;\r
949                 indentLevel = value;\r
950         }\r
951 }\r
952 \r
953 public TextWriter InnerWriter { \r
954         get{\r
955                 return writer;\r
956         }\r
957         set{\r
958                 writer = value;\r
959                 _httpWriter = value as HttpWriter;\r
960         }\r
961 }\r
962 \r
963 public override string NewLine { \r
964         get{\r
965                 return writer.NewLine;\r
966         }\r
967         set{\r
968                 writer.NewLine = value;\r
969         }\r
970 }\r
971 \r
972 protected HtmlTextWriterTag TagKey { \r
973         get{\r
974                 return _tagKey;\r
975         }\r
976         set{\r
977                 _tagIndex = (int) value;\r
978                 if (_tagIndex < 0 || _tagIndex >= (int) HtmlTextWriter._tagNameLookupArray.Length)\r
979                         throw new ArgumentOutOfRangeException("value");\r
980                 _tagKey = value;\r
981                 if (value != 0)\r
982                         _tagName = HtmlTextWriter._tagNameLookupArray[_tagIndex].name;\r
983         }\r
984 }\r
985 \r
986 protected string TagName { \r
987         get{\r
988                 return _tagName;\r
989         }\r
990         set{\r
991                 _tagName = value;\r
992                 _tagKey = GetTagKey(_tagName);\r
993                 _tagIndex = (int) _tagKey;\r
994         }\r
995 }\r
996 \r
997 public const string DefaultTabString = "\t";\r
998 public const char DoubleQuoteChar = '"';\r
999 public const string EndTagLeftChars = "</";\r
1000 public const char EqualsChar = '=';\r
1001 public const string EqualsDoubleQuoteString = "=\"";\r
1002 public const string SelfClosingChars = " /";\r
1003 public const string SelfClosingTagEnd = " />";\r
1004 public const char SemicolonChar = ';';\r
1005 public const char SingleQuoteChar = '\'';\r
1006 public const char SlashChar = '/';\r
1007 public const char SpaceChar = ' ';\r
1008 public const char StyleEqualsChar = ':';\r
1009 public const char TagLeftChar = '<';\r
1010 public const char TagRightChar = '>';\r
1011 \r
1012 private int _attrCount;\r
1013 private int _endTagCount;\r
1014 private int _styleCount;\r
1015 private int indentLevel;\r
1016 private int _inlineCount;\r
1017 private int _tagIndex;\r
1018 \r
1019 private bool _isDescendant;\r
1020 private bool tabsPending;\r
1021 \r
1022 private HtmlTextWriterTag _tagKey;\r
1023 private TextWriter writer;\r
1024 private HttpWriter _httpWriter;\r
1025 \r
1026 private static Hashtable _attrKeyLookupTable;\r
1027 private static Hashtable _styleKeyLookupTable;\r
1028 private static Hashtable _tagKeyLookupTable;\r
1029 \r
1030 private string _tagName;\r
1031 private string tabString;\r
1032 private static string[] _styleNameLookupArray;\r
1033 \r
1034 private RenderAttribute[] _attrList;\r
1035 private static AttributeInformation[] _attrNameLookupArray;\r
1036 private static TagInformation[] _tagNameLookupArray;\r
1037 private TagStackEntry[] _endTags;\r
1038 private RenderStyle[] _styleList;\r
1039 \r
1040 } //HtmlTextWriter\r
1041 \r
1042 struct AttributeInformation {\r
1043         public bool encode;\r
1044         public string name;\r
1045 \r
1046         public AttributeInformation(string name, bool encode){\r
1047                 this.encode = encode;\r
1048                 this.name = name;\r
1049         }\r
1050\r
1051  \r
1052 struct RenderAttribute {\r
1053         public bool encode;\r
1054         public HtmlTextWriterAttribute key;\r
1055         public string name;\r
1056         public string value;\r
1057\r
1058  \r
1059 struct RenderStyle {\r
1060         public HtmlTextWriterStyle key;\r
1061         public string name;\r
1062         public string value;\r
1063\r
1064  \r
1065 struct TagInformation {\r
1066         public string closingTag;\r
1067         public string name;\r
1068         public TagType tagType;\r
1069 \r
1070         public TagInformation(string name, TagType tagType, string closingTag){\r
1071                 this.name = name;\r
1072                 this.tagType = tagType;\r
1073                 this.closingTag = closingTag;   \r
1074         }\r
1075\r
1076  \r
1077 struct TagStackEntry {\r
1078         public string endTagText;\r
1079         public HtmlTextWriterTag tagKey;\r
1080\r
1081  \r
1082 enum TagType {\r
1083         Inline,\r
1084         NonClosing,\r
1085         Other\r
1086\r
1087 \r
1088 \r
1089 } // namespace System.Web.UI.HtmlControls\r
1090 \r