2006-09-17 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / System.Web / System.Web.UI / CssStyleCollection.cs
old mode 100755 (executable)
new mode 100644 (file)
index b49b577..5ed434e
@@ -6,8 +6,7 @@
 //     Gonzalo Paniagua (gonzalo@ximian.com)
 //
 // (C) 2002 Ximian, Inc. (http://www.ximian.com)
-//
-
+// Copyright (C) 2005 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.
 //
 
-using System;
+using System.IO;
 using System.Collections;
+using System.Security.Permissions;
 using System.Text;
 
 namespace System.Web.UI {
 
+       // CAS - no InheritanceDemand here as the class is sealed
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        public sealed class CssStyleCollection
        {
-               private StateBag bag;
-               private StateBag style;
+               StateBag bag;
+               StateBag style;
+               string last_string;
 
                internal CssStyleCollection (StateBag bag)
                {
                        this.bag = bag;
-                       style = new StateBag ();
-                       string st_string = bag ["style"] as string;
-                       if (st_string != null)
-                               FillStyle (st_string);
+                       if (bag != null) {
+                               last_string = (string) bag ["style"];
+                               style = new StateBag ();
+                               if (last_string != null)
+                                       FillStyle (last_string);
+                       }
                }
 
-               internal void FillStyle (string s)
+               void FillStyle (string s)
                {
                        int mark = s.IndexOf (':');
                        if (mark == -1)
@@ -75,21 +80,33 @@ namespace System.Web.UI {
                        FillStyle (fullValue.Substring (mark + 1));
                }
 
-               private string BagToString ()
+               string BagToString ()
                {
+                       if (last_string != null)
+                               return last_string;
+
                        StringBuilder sb = new StringBuilder ();
-                       foreach (string k in style.Keys)
-                               sb.AppendFormat ("{0}: {1}; ", k, style [k]);
-                       return sb.ToString ();
+                       foreach (string key in Keys) {
+                               if (key == "background-image")
+                                       sb.AppendFormat ("{0}:url({1});", key, HttpUtility.UrlPathEncode ((string) style [key]));
+                               else
+                                       sb.AppendFormat ("{0}:{1};", key, style [key]);
+                       }
+
+                       last_string = sb.ToString ();
+                       return last_string;
                }
-               
+
                public int Count
                {
-                       get { return style.Count; }
+                       get {
+                               if (bag == null)
+                                       throw new NullReferenceException ();
+                               return style.Count;
+                       }
                }
 
-               public string this [string key]
-               {
+               public string this [string key] {
                        get {
                                return style [key] as string;
                        }
@@ -105,21 +122,67 @@ namespace System.Web.UI {
 
                public void Add (string key, string value)
                {
+                       if (style == null)
+                               style = new StateBag ();
                        style [key] = value;
+                       last_string = null;
                        bag ["style"] = BagToString ();
                }
 
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               void Add (HtmlTextWriterStyle key, string value)
+               {
+                       Add (HtmlTextWriter.StaticGetStyleName (key), value);
+               }
+
                public void Clear ()
                {
+                       if (style != null)
+                               style.Clear ();
+                       last_string = null;
                        bag.Remove ("style");
-                       style.Clear ();
                }
 
                public void Remove (string key)
                {
-                       if (style [key] != null) {
+                       if (style != null)
                                style.Remove (key);
-                               bag ["style"] = BagToString ();
+                       last_string = null;
+                       bag ["style"] = BagToString ();
+               }
+#if NET_2_0
+               public string this [HtmlTextWriterStyle key] {
+                       get {
+                               return style [HtmlTextWriter.StaticGetStyleName (key)] as string;
+                       }
+                       set {
+                               Add (HtmlTextWriter.StaticGetStyleName (key), value);
+                       }
+               }
+
+               public void Remove (HtmlTextWriterStyle key)
+               {
+                       Remove (HtmlTextWriter.StaticGetStyleName (key));
+               }
+
+               public
+#else
+               internal
+#endif
+               string Value {
+                       get { return BagToString (); }
+                       set {
+                               if (style != null)
+                                       style = new StateBag ();
+                               style.Clear ();
+                               last_string = value;
+                               bag ["style"] = value;
+                               if (value != null)
+                                       FillStyle (value);
                        }
                }
        }