merge from trunk revisions 58933, 58935, 58936
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TableStyle.cs
index de80d2561dd773576d9c0ddf44b6c3a09a61a95b..c7abd475b191ca02fedeaea8522ebfdb1f1b941a 100644 (file)
@@ -1,14 +1,10 @@
 //
 // System.Web.UI.WebControls.TableStyle.cs
 //
-// Authors:
-//   Gaurav Vaish (gvaish@iitk.ac.in)
-//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+// Author:
+//     Sebastien Pouliot  <sebastien@ximian.com>
 //
-// (C) Gaurav Vaish (2002)
-// (C) 2003 Andreas Nahr
-//\r
-
+// 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
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-\r
-using System;
-using System.ComponentModel;\r
-using System.Globalization;\r
-using System.Web;\r
-using System.Web.UI;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       public class TableStyle : Style\r
-       {\r
-               private static int IMAGE_URL = (0x01 << 16);\r
-               private static int CELL_PADD = (0x01 << 17);\r
-               private static int CELL_SPAC = (0x01 << 18);\r
-               private static int GRID_LINE = (0x01 << 19);\r
-               private static int HOR_ALIGN = (0x01 << 20);\r
-\r
-               public TableStyle(): base()\r
-               {\r
-               }\r
-\r
-               public TableStyle(StateBag bag): base(bag)\r
-               {\r
-               }\r
 
-#if NET_2_0\r
-       [NotifyParentPropertyAttribute (true)]\r
-               [UrlPropertyAttribute]\r
-#else\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue (""), WebCategory ("Appearance")]
-               [WebSysDescription ("An Url specifying the background image for the table.")]\r
-               public virtual string BackImageUrl\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(IMAGE_URL))\r
-                                       return (string)(ViewState["BackImageUrl"]);\r
-                               return String.Empty;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(value == null)\r
-                                       throw new ArgumentNullException("value");\r
-                               ViewState["BackImageUrl"] = value;\r
-                               Set(IMAGE_URL);\r
-                       }\r
-               }\r
+using System.ComponentModel;
+using System.Globalization;
+using System.Security.Permissions;
+using System.Web.UI;
+
+namespace System.Web.UI.WebControls {
+
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       public class TableStyle : Style {
+
+               public TableStyle ()
+               {
+               }
+
+               public TableStyle (StateBag bag)
+                       : base (bag)
+               {
+               }
+
 
-#if NET_2_0\r
-       [NotifyParentPropertyAttribute (true)]\r
-#else\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue (-1), WebCategory ("Appearance")]
-               [WebSysDescription ("The space left around the borders within a cell.")]\r
-               public virtual int CellPadding\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(CELL_PADD))\r
-                                       return (int)(ViewState["CellPadding"]);\r
-                               return -1;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(value < -1)\r
-                                       throw new ArgumentOutOfRangeException("value", "CellPadding value has to be -1 for 'not set' or a value >= 0");\r
-                               ViewState["CellPadding"] = value;\r
-                               Set(CELL_PADD);\r
-                       }\r
-               }\r
+#if NET_2_0
+               [NotifyParentProperty (true)]
+               [UrlProperty]
+#else
+               [Bindable (true)]
+#endif
+               [DefaultValue ("")]
+               [WebSysDescription ("")]
+               [WebCategory ("Appearance")]
+               public virtual string BackImageUrl {
+                       get {
+                               if ((styles & Styles.BackImageUrl) == 0)
+                                       return String.Empty;
+                               return (string) ViewState ["BackImageUrl"];
+                       }
+                       set {
+                               if (value == null)
+                                       throw new ArgumentNullException ("BackImageUrl");
+                               ViewState ["BackImageUrl"] = value;
+                               styles |= Styles.BackImageUrl;
+                       }
+               }
 
-#if NET_2_0\r
-       [NotifyParentPropertyAttribute (true)]\r
-#else\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue (-1), WebCategory ("Appearance")]
-               [WebSysDescription ("The space left between cells.")]\r
-               public virtual int CellSpacing\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(CELL_SPAC))\r
-                                       return (int)(ViewState["CellSpacing"]);\r
-                               return -1;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(value < -1)\r
-                                       throw new ArgumentOutOfRangeException("value"," CellSpacing value has to be -1 for 'not set' or a value >= 0");\r
-                               ViewState["CellSpacing"] = value;\r
-                               Set(CELL_SPAC);\r
-                       }\r
-               }\r
+#if NET_2_0
+               [NotifyParentProperty (true)]
+#else
+               [Bindable (true)]
+#endif
+               [DefaultValue (-1)]
+               [WebSysDescription ("")]
+               [WebCategory ("Appearance")]
+               public virtual int CellPadding {
+                       get {
+                               if ((styles & Styles.CellPadding) == 0)
+                                       return -1;
+                               return (int) ViewState ["CellPadding"];
+                       }
+                       set {
+                               if (value < -1)
+                                       throw new ArgumentOutOfRangeException ("< -1");
+                               ViewState ["CellPadding"] = value;
+                               styles |= Styles.CellPadding;
+                       }
+               }
 
-#if NET_2_0\r
-       [NotifyParentPropertyAttribute (true)]\r
-#else\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue (typeof (GridLines), "None"), WebCategory ("Appearance")]
-               [WebSysDescription ("The type of grid that a table uses.")]\r
-               public virtual GridLines GridLines\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(GRID_LINE))\r
-                                       return (GridLines)(ViewState["GridLines"]);\r
-                               return GridLines.None;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(!Enum.IsDefined(typeof(GridLines), value))\r
-                                       throw new ArgumentOutOfRangeException("value"," Gridlines value has to be a valid enumeration member");\r
-                               ViewState["GridLines"] = value;\r
-                               Set(GRID_LINE);\r
-                       }\r
-               }\r
+#if NET_2_0
+               [NotifyParentProperty (true)]
+#else
+               [Bindable (true)]
+#endif
+               [DefaultValue (-1)]
+               [WebSysDescription ("")]
+               [WebCategory ("Appearance")]
+               public virtual int CellSpacing {
+                       get {
+                               if ((styles & Styles.CellSpacing) == 0)
+                                       return -1;
+                               return (int) ViewState ["CellSpacing"];
+                       }
+                       set {
+                               if (value < -1)
+                                       throw new ArgumentOutOfRangeException ("< -1");
+                               ViewState ["CellSpacing"] = value;
+                               styles |= Styles.CellSpacing;
+                       }
+               }
 
-#if NET_2_0\r
-       [NotifyParentPropertyAttribute (true)]\r
-#else\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue (typeof (HorizontalAlign), "NotSet"), WebCategory ("Layout")]
-               [WebSysDescription ("The horizonal alignment of the table.")]\r
-               public virtual HorizontalAlign HorizontalAlign\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(HOR_ALIGN))\r
-                                       return (HorizontalAlign)(ViewState["HorizontalAlign"]);\r
-                               return HorizontalAlign.NotSet;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(!Enum.IsDefined(typeof(HorizontalAlign), value))\r
-                                       throw new ArgumentOutOfRangeException("value"," Gridlines value has to be a valid enumeration member");\r
-                               ViewState["HorizontalAlign"] = value;\r
-                               Set(HOR_ALIGN);\r
-                       }\r
-               }\r
-\r
-               public override void AddAttributesToRender(HtmlTextWriter writer, WebControl owner)\r
-               {\r
-                       base.AddAttributesToRender(writer, owner);\r
-                       if(BackImageUrl.Length > 0)\r
-                       {\r
-                               writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage, "url(" + owner.ResolveUrl(BackImageUrl) + ")");\r
-                       }\r
-                       if(CellSpacing >= 0)\r
-                       {\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, CellSpacing.ToString(NumberFormatInfo.InvariantInfo));\r
-                               if(CellSpacing == 0)
-                                       writer.AddStyleAttribute(HtmlTextWriterStyle.BorderCollapse, "collapse");
-                               
-                       }\r
-                       if(CellPadding >= 0)\r
-                       {\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, CellPadding.ToString(NumberFormatInfo.InvariantInfo));\r
-                       }\r
-                       if(HorizontalAlign != HorizontalAlign.NotSet)\r
-                       {\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Align, Enum.Format(typeof(HorizontalAlign), HorizontalAlign, "G"));\r
-                       }\r
-                       string gd = null;
-                       switch(GridLines)\r
-                       {\r
-                               case GridLines.None:       break;
-                               case GridLines.Horizontal: gd = "rows";\r
-                                                          break;\r
-                               case GridLines.Vertical:   gd = "cols";\r
-                                                          break;\r
-                               case GridLines.Both:       gd = "all";\r
-                                                          break;\r
+               // LAMESPEC: default is documented to be Both
+#if NET_2_0
+               [NotifyParentProperty (true)]
+#else
+               [Bindable (true)]
+#endif
+               [DefaultValue (GridLines.None)]
+               [WebSysDescription ("")]
+               [WebCategory ("Appearance")]
+               public virtual GridLines GridLines {
+                       get {
+                               if ((styles & Styles.GridLines) == 0)
+                                       return GridLines.None;
+                               return (GridLines) ViewState ["GridLines"];
+                       }
+                       set {
+                               // avoid reflection
+                               if ((value < GridLines.None) || (value > GridLines.Both)) {
+                                       // LAMESPEC: documented as ArgumentException
+                                       throw new ArgumentOutOfRangeException (Locale.GetText ("Invalid GridLines value."));
+                               }
+                               ViewState ["GridLines"] = value;
+                               styles |= Styles.GridLines;
                        }
+               }
 
-                       if (gd != null)
-                               writer.AddAttribute(HtmlTextWriterAttribute.Rules, gd);
+#if NET_2_0
+               [NotifyParentProperty (true)]
+#else
+               [Bindable (true)]
+#endif
+               [DefaultValue (HorizontalAlign.NotSet)]
+               [WebSysDescription ("")]
+               [WebCategory ("Layout")]
+               public virtual HorizontalAlign HorizontalAlign {
+                       get {
+                               if ((styles & Styles.HorizontalAlign) == 0)
+                                       return HorizontalAlign.NotSet;
+                               return (HorizontalAlign) ViewState ["HorizontalAlign"];
+                       }
+                       set {
+                               // avoid reflection
+                               if ((value < HorizontalAlign.NotSet) || (value > HorizontalAlign.Justify)) {
+                                       // LAMESPEC: documented as ArgumentException
+                                       throw new ArgumentOutOfRangeException (Locale.GetText ("Invalid HorizontalAlign value."));
+                               }
+                               ViewState ["HorizontalAlign"] = value;
+                               styles |= Styles.HorizontalAlign;
+                       }
                }
 
-               public override void CopyFrom(Style s)
+
+               public override void AddAttributesToRender (HtmlTextWriter writer, WebControl owner)
                {
-                       if (s == null || s.IsEmpty)
+                       base.AddAttributesToRender (writer, owner);
+                       if (writer == null)
                                return;
 
-                       base.CopyFrom (s);
-                       TableStyle from = s as TableStyle;
-                       if (from == null)
-                               return;
+                       // note: avoid calling properties multiple times
+                       int i = CellPadding;
+                       if (i != -1)
+                               writer.AddAttribute (HtmlTextWriterAttribute.Cellpadding, i.ToString (CultureInfo.InvariantCulture));
+                       
+                       i = CellSpacing;
+                       if (i != -1)
+                               writer.AddAttribute (HtmlTextWriterAttribute.Cellspacing, i.ToString (CultureInfo.InvariantCulture));
+
+                       GridLines g = GridLines;
+                       switch (g) {
+                       case GridLines.Horizontal:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Rules, "rows");
+                               break;
+                       case GridLines.Vertical:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Rules, "cols");
+                               break;
+                       case GridLines.Both:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Rules, "all");
+                               break;
+                       }
+
+                       // note: avoid ToString on the enum
+                       switch (HorizontalAlign) {
+                       case HorizontalAlign.Left:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Align, "Left");
+                               break;
+                       case HorizontalAlign.Center:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Align, "Center");
+                               break;
+                       case HorizontalAlign.Right:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Align, "Right");
+                               break;
+                       case HorizontalAlign.Justify:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Align, "Justify");
+                               break;
+                       }
 
-                       if (from.IsSet (HOR_ALIGN))
-                               HorizontalAlign = from.HorizontalAlign;
+                       // border (=0) is always present (and base class doesn't seems to add it)
+                       // but border is "promoted" to 1 if gridlines are present (with BorderWidth == 0)
+                       if (g == GridLines.None) {
+                               writer.AddAttribute (HtmlTextWriterAttribute.Border, "0");
+                       } else if (BorderWidth.IsEmpty) {
+                               writer.AddAttribute (HtmlTextWriterAttribute.Border, "1");
+                       } else {
+                               writer.AddAttribute (HtmlTextWriterAttribute.Border, BorderWidth.Value.ToString (CultureInfo.InvariantCulture));
+                       }
+
+                       string s = BackImageUrl;
+                       if (s.Length > 0) {
+                               if (owner != null)
+                                       s = owner.ResolveUrl (s);
+#if ONLY_1_1
+                               s = String.Concat ("url(", s, ")");
+#endif
+                               writer.AddStyleAttribute (HtmlTextWriterStyle.BackgroundImage, s);
+                       }
+               }
 
-                       if (from.IsSet (IMAGE_URL))
-                               BackImageUrl = from.BackImageUrl;
+               private void Copy (string name, Styles s, Style source)
+               {
+                       if ((source.styles & s) != 0) {
+                               object o = source.ViewState [name];
+                               if (o != null) {
+                                       ViewState [name] = o;
+                                       styles |= s;
+                               }
+                       }
+               }
 
-                       if (from.IsSet (CELL_PADD))
-                               CellPadding = from.CellPadding;
+               public override void CopyFrom (Style s)
+               {
+                       // note: styles is copied in base
+                       base.CopyFrom (s);
+                       if ((s != null) && !s.IsEmpty) {
+                               Copy ("BackImageUrl", Styles.BackImageUrl, s);
+                               Copy ("CellPadding", Styles.CellPadding, s);
+                               Copy ("CellSpacing", Styles.CellSpacing, s);
+                               Copy ("GridLines", Styles.GridLines, s);
+                               Copy ("HorizontalAlign", Styles.HorizontalAlign, s);
+                       }
+               }
 
-                       if (from.IsSet (CELL_SPAC))
-                               CellSpacing = from.CellSpacing;
+               private void Merge (string name, Styles s, Style source)
+               {
+                       if ((styles & s) == 0 && (source.styles & s) != 0) {
+                               object o = source.ViewState [name];
+                               if (o != null) {
+                                       ViewState [name] = o;
+                                       styles |= s;
+                               }
+                       }
+               }
 
-                       if (from.IsSet (GRID_LINE))
-                               GridLines = from.GridLines;
+               public override void MergeWith (Style s)
+               {
+                       // if we're empty then it's like a copy
+                       if (IsEmpty) {
+                               CopyFrom (s);
+                       } else {
+                               base.MergeWith (s);
+                               if ((s != null) && !s.IsEmpty) {
+                                       Merge ("BackImageUrl", Styles.BackImageUrl, s);
+                                       Merge ("CellPadding", Styles.CellPadding, s);
+                                       Merge ("CellSpacing", Styles.CellSpacing, s);
+                                       Merge ("GridLines", Styles.GridLines, s);
+                                       Merge ("HorizontalAlign", Styles.HorizontalAlign, s);
+                               }
+                       }
                }
 
-               public override void MergeWith(Style s)\r
-               {\r
-                       if(s != null && !s.IsEmpty)\r
-                       {\r
-                               if (IsEmpty) {
-                                       CopyFrom (s);
-                                       return;
+               public override void Reset ()
+               {
+                       if ((styles & Styles.BackImageUrl) != 0)
+                               ViewState.Remove ("BackImageUrl");
+                       if ((styles & Styles.CellPadding) != 0)
+                               ViewState.Remove ("CellPadding");
+                       if ((styles & Styles.CellSpacing) != 0)
+                               ViewState.Remove ("CellSpacing");
+                       if ((styles & Styles.GridLines) != 0)
+                               ViewState.Remove ("GridLines");
+                       if ((styles & Styles.HorizontalAlign) != 0)
+                               ViewState.Remove ("HorizontalAlign");
+                       // call base at the end because "styles" will reset there
+                       base.Reset ();
+               }
+#if NET_2_0
+               protected override void FillStyleAttributes (CssStyleCollection attributes, IUrlResolutionService urlResolver)
+               {
+                       if (attributes != null) {
+                               string url = BackImageUrl;
+                               if (url.Length > 0) {
+                                       if (urlResolver != null)
+                                               url = urlResolver.ResolveClientUrl (url);
+                                       attributes.Add (HtmlTextWriterStyle.BackgroundImage, url);
                                }
-                               base.MergeWith(s);\r
+                       }
+                       base.FillStyleAttributes (attributes, urlResolver);
+               }
+#endif
 
-                               if (!(s is TableStyle))
-                                       return;
-                               
-                               TableStyle with = (TableStyle)s;\r
-                               if(with.IsSet(HOR_ALIGN) && !IsSet(HOR_ALIGN))\r
-                               {\r
-                                       HorizontalAlign = with.HorizontalAlign;\r
-                               }\r
-                               if(with.IsSet(IMAGE_URL) && !IsSet(IMAGE_URL))\r
-                               {\r
-                                       BackImageUrl = with.BackImageUrl;\r
-                               }\r
-                               if(with.IsSet(CELL_PADD) && !IsSet(CELL_PADD))\r
-                               {\r
-                                       CellPadding = with.CellPadding;\r
-                               }\r
-                               if(with.IsSet(CELL_SPAC) && !IsSet(CELL_SPAC))\r
-                               {\r
-                                       CellSpacing = with.CellSpacing;\r
-                               }\r
-                               if(with.IsSet(GRID_LINE) && !IsSet(GRID_LINE))\r
-                               {\r
-                                       GridLines = with.GridLines;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public override void Reset()\r
-               {\r
-                       if(IsSet(IMAGE_URL))\r
-                               ViewState.Remove("BackImageUrl");\r
-                       if(IsSet(HOR_ALIGN))\r
-                               ViewState.Remove("HorizontalAlign");\r
-                       if(IsSet(CELL_PADD))\r
-                               ViewState.Remove("CellPadding");\r
-                       if(IsSet(CELL_SPAC))\r
-                               ViewState.Remove("CellSpacing");\r
-                       if(IsSet(GRID_LINE))\r
-                               ViewState.Remove("GridLines");\r
-                       base.Reset();\r
-               }\r
-       }\r
-}\r
+               internal override void LoadViewStateInternal()
+               {
+                       if (viewstate["BackImageUrl"] != null) {
+                               styles |= Styles.BackImageUrl;
+                       }
+                       if (viewstate["CellPadding"] != null) {
+                               styles |= Styles.CellPadding;
+                       }
+                       if (viewstate["CellSpacing"] != null) {
+                               styles |= Styles.CellSpacing;
+                       }
+                       if (viewstate["GridLines"] != null) {
+                               styles |= Styles.GridLines;
+                       }
+                       if (viewstate["HorizontalAlign"] != null) {
+                               styles |= Styles.HorizontalAlign;
+                       }
+
+                       base.LoadViewStateInternal();
+               }
+       }
+}