//
// 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
-\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
-
- [DefaultValue (""), Bindable (true), 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
-
- [DefaultValue (-1), Bindable (true), 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
-
- [DefaultValue (-1), Bindable (true), 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
-
- [DefaultValue (typeof (GridLines), "None"), Bindable (true), 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
-
- [DefaultValue (typeof (HorizontalAlign), "NotSet"), Bindable (true), 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 = String.Empty;
- 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
- }
- writer.AddAttribute(HtmlTextWriterAttribute.Rules, gd);
+// 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
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+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 override void CopyFrom(Style s)
+ public TableStyle (StateBag bag)
+ : base (bag)
{
- if (s == null || s.IsEmpty)
- return;
+ }
- base.CopyFrom (s);
- TableStyle from = s as TableStyle;
- if (from == null)
+
+#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
+ [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
+ [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;
+ }
+ }
+
+ // 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 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 AddAttributesToRender (HtmlTextWriter writer, WebControl owner)
+ {
+ base.AddAttributesToRender (writer, owner);
+ if (writer == null)
return;
- if (from.IsSet (HOR_ALIGN))
- HorizontalAlign = from.HorizontalAlign;
+ // 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));
+ if (i == 0) {
+ writer.AddStyleAttribute(HtmlTextWriterStyle.BorderCollapse, "collapse");
+ }
+ }
- if (from.IsSet (IMAGE_URL))
- BackImageUrl = from.BackImageUrl;
+ 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;
+ }
+
+ // 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));
+ }
- if (from.IsSet (CELL_PADD))
- CellPadding = from.CellPadding;
+ string s = BackImageUrl;
+ if (s.Length > 0) {
+ if (owner != null)
+ s = owner.ResolveClientUrl (s);
+#if NET_2_0
+ s = s.Replace (" ", "%20");
+#else
+ s = String.Concat ("url(", s, ")");
+#endif
+ writer.AddStyleAttribute (HtmlTextWriterStyle.BackgroundImage, s);
+ }
+ }
- if (from.IsSet (CELL_SPAC))
- CellSpacing = from.CellSpacing;
+ 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;
+ }
+ }
+ }
+
+ 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);
+ }
+ }
+
+ 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 (base.IsEmpty) {
- base.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
-
- 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
+ }
+ base.FillStyleAttributes (attributes, urlResolver);
+ }
+#endif
+
+ 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();
+ }
+ }
+}