3 // Marek Habersack <grendel@twistedcode.net>
5 // (C) 2010 Novell, Inc (http://novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.Collections.Generic;
32 namespace System.Web.UI.WebControls
34 sealed class StyleBlock : Control
36 List <NamedCssStyleCollection> cssStyles;
37 Dictionary <string, NamedCssStyleCollection> cssStyleIndex;
40 List <NamedCssStyleCollection> CssStyles {
42 if (cssStyles == null) {
43 cssStyles = new List <NamedCssStyleCollection> ();
44 cssStyleIndex = new Dictionary <string, NamedCssStyleCollection> (StringComparer.Ordinal);
51 public StyleBlock (string stylePrefix)
53 if (String.IsNullOrEmpty (stylePrefix))
54 throw new ArgumentNullException ("stylePrefix");
56 this.stylePrefix = stylePrefix;
59 public NamedCssStyleCollection RegisterStyle (string name = null)
64 return GetStyle (name);
67 public NamedCssStyleCollection RegisterStyle (Style style, string name = null)
70 throw new ArgumentNullException ("style");
75 NamedCssStyleCollection cssStyle = GetStyle (name);
76 cssStyle.CopyFrom (style.GetStyleAttributes (null));
81 public NamedCssStyleCollection RegisterStyle (HtmlTextWriterStyle key, string value, string styleName = null)
83 if (styleName == null)
84 styleName = String.Empty;
86 NamedCssStyleCollection style = GetStyle (styleName);
87 style.Add (key, value);
92 NamedCssStyleCollection GetStyle (string name)
94 List <NamedCssStyleCollection> cssStyles = CssStyles;
95 NamedCssStyleCollection style;
97 if (!cssStyleIndex.TryGetValue (name, out style)) {
98 style = new NamedCssStyleCollection (name);
99 cssStyleIndex.Add (name, style);
100 cssStyles.Add (style);
104 throw new InvalidOperationException (String.Format ("Internal error. Stylesheet for style {0} is null.", name));
109 protected internal override void Render (HtmlTextWriter writer)
111 if (cssStyles == null || cssStyles.Count == 0)
114 writer.AddAttribute (HtmlTextWriterAttribute.Type, "text/css");
115 writer.RenderBeginTag (HtmlTextWriterTag.Style);
116 writer.WriteLine ("/* <![CDATA[ */");
119 foreach (var css in cssStyles) {
120 value = css.Collection.Value;
121 if (String.IsNullOrEmpty (value))
125 if (name != String.Empty)
128 writer.WriteLine ("#{0} {1}{{ {2} }}", stylePrefix, name, value);
131 writer.WriteLine ("/* ]]> */");
132 writer.RenderEndTag (); // </style>