2007-01-31 Igor Zelmanovich <igorz@mainsoft.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TableItemStyle.cs
index c0ed4db0361c1a2693f7f2caf24d67ca349f1e67..7ba7c23bba269d83364570fccd9c31a98fa62b8c 100644 (file)
@@ -1,4 +1,10 @@
-
+//
+// System.Web.UI.WebControls.TableItemStyle.cs
+//
+// Author:
+//     Sebastien Pouliot  <sebastien@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
 // 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
- * Namespace: System.Web.UI.WebControls\r
- * Class:     TableItemStyle\r
- *\r
- * Author:  Gaurav Vaish\r
- * Maintainer: gvaish@iitk.ac.in\r
- * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
- * Implementation: yes\r
- * Status:  100%\r
- *\r
- * (C) Gaurav Vaish (2002)\r
- */\r
-\r
-using System;\r
-using System.ComponentModel;\r
-using System.Web;\r
-using System.Web.UI;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       public class TableItemStyle: Style\r
-       {\r
-               private static int H_ALIGN = (0x01 << 16);\r
-               private static int V_ALIGN = (0x01 << 17);\r
-               private static int WRAP    = (0x01 << 18);\r
-\r
-               public TableItemStyle(): base()\r
-               {\r
-               }\r
-\r
-               public TableItemStyle(StateBag bag): base(bag)\r
-               {\r
-               }\r
-\r
-#if !NET_2_0\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue(HorizontalAlign.NotSet)]\r
-               [NotifyParentProperty(true)]\r
-               [WebCategory("Layout")]\r
-               [WebSysDescription("TableItemStyle_HorizontalAlign")]\r
-               public virtual HorizontalAlign HorizontalAlign\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(H_ALIGN))\r
-                                       return (HorizontalAlign)ViewState["HorizontalAlign"];\r
-                               return HorizontalAlign.NotSet;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(!Enum.IsDefined(typeof(HorizontalAlign), value))\r
-                               {\r
-                                       throw new ArgumentException();\r
-                               }\r
-                               ViewState["HorizontalAlign"] = value;\r
-                               Set(H_ALIGN);\r
-                       }\r
-               }\r
-\r
-#if !NET_2_0\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue(VerticalAlign.NotSet)]\r
-               [NotifyParentProperty(true)]\r
-               [WebCategory("Layout")]\r
-               [WebSysDescription("TableItemStyle_VerticalAlign")]\r
-               public virtual VerticalAlign VerticalAlign\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(V_ALIGN))\r
-                                       return (VerticalAlign)ViewState["VerticalAlign"];\r
-                               return VerticalAlign.NotSet;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(!Enum.IsDefined(typeof(VerticalAlign), value))\r
-                               {\r
-                                       throw new ArgumentException();\r
-                               }\r
-                               ViewState["VerticalAlign"] = value;\r
-                               Set(V_ALIGN);\r
-                       }\r
-               }\r
-\r
-#if !NET_2_0\r
-               [Bindable (true)]\r
-#endif\r
-               [DefaultValue(VerticalAlign.NotSet)]\r
-               [NotifyParentProperty(true)]\r
-               [WebCategory("Layout")]\r
-               [WebSysDescription("TableItemStyle_Wrap")]\r
-               public virtual bool Wrap\r
-               {\r
-                       get\r
-                       {\r
-                               if(IsSet(WRAP))\r
-                                       return (bool)ViewState["Wrap"];\r
-                               return true;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["Wrap"] = value;\r
-                               Set(WRAP);\r
-                       }\r
-               }\r
-\r
-               public override void CopyFrom(Style s)\r
-               {\r
-                       if(s!=null && !s.IsEmpty)\r
-                       {\r
-                               base.CopyFrom(s);\r
-\r
-                               if (!(s is TableItemStyle))\r
-                                       return;\r
-                                \r
-                               TableItemStyle from = (TableItemStyle)s;\r
-                               if(from.IsSet(H_ALIGN))\r
-                               {\r
-                                       HorizontalAlign = from.HorizontalAlign;\r
-                               }\r
-                               if(from.IsSet(V_ALIGN))\r
-                               {\r
-                                       VerticalAlign = from.VerticalAlign;\r
-                               }\r
-                               if(from.IsSet(WRAP))\r
-                               {\r
-                                       Wrap = from.Wrap;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public override void MergeWith(Style s)\r
-               {\r
-                       if(s!=null && !s.IsEmpty)\r
-                       {\r
-                               if (IsEmpty) {\r
-                                       CopyFrom (s);\r
-                                       return;\r
-                               }\r
-                               base.MergeWith(s);\r
-\r
-                               if (!(s is TableItemStyle))\r
-                                       return;\r
-                               \r
-                               TableItemStyle with = (TableItemStyle)s;\r
-                               if(with.IsSet(H_ALIGN) && !IsSet(H_ALIGN))\r
-                               {\r
-                                       HorizontalAlign = with.HorizontalAlign;\r
-                               }\r
-                               if(with.IsSet(V_ALIGN) && !IsSet(V_ALIGN))\r
-                               {\r
-                                       VerticalAlign = with.VerticalAlign;\r
-                               }\r
-                               if(with.IsSet(WRAP) && !IsSet(WRAP))\r
-                               {\r
-                                       Wrap = with.Wrap;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public override void Reset()\r
-               {\r
-                       if(IsSet(H_ALIGN))\r
-                               ViewState.Remove("HorizontalAlign");\r
-                       if(IsSet(V_ALIGN))\r
-                               ViewState.Remove("VerticalAlign");\r
-                       if(IsSet(WRAP))\r
-                               ViewState.Remove("Wrap");\r
-                       base.Reset();\r
-               }\r
-\r
-               public override void AddAttributesToRender(HtmlTextWriter writer, WebControl owner)\r
-               {\r
-                       base.AddAttributesToRender(writer, owner);\r
-                       if(!Wrap)\r
-                       {\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Nowrap, "nowrap");\r
-                       }\r
-                       if(HorizontalAlign != HorizontalAlign.NotSet)\r
-                       {\r
-                               // Temporarily commented out. I'm having problems in cygwin.\r
-                               //writer.AddAttribute(HtmlTextWriterAttribute.Align, TypeDescriptor.GetConverter(typeof(HorizontalAlign)).ConvertToString(HorizontalAlign));\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Align, HorizontalAlign.ToString ());\r
-                       }\r
-                       if(VerticalAlign != VerticalAlign.NotSet)\r
-                       {\r
-                               // Temporarily commented out. I'm having problems in cygwin.\r
-                               //writer.AddAttribute(HtmlTextWriterAttribute.Valign, TypeDescriptor.GetConverter(typeof(VerticalAlign)).ConvertToString(VerticalAlign));\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Valign, VerticalAlign.ToString ());\r
-                       }\r
-               }\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 TableItemStyle : Style {
+
+               [Flags]
+               enum TableItemStyles
+               {
+                       HorizontalAlign = 0x00010000,
+                       VerticalAlign = 0x00020000,
+                       Wrap = 0x00040000,
+               }
+
+               public TableItemStyle ()
+               {
+               }
+
+               public TableItemStyle (StateBag bag)
+                       : base (bag)
+               {
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (HorizontalAlign.NotSet)]
+               [NotifyParentProperty (true)]
+               [WebSysDescription ("")]
+               [WebCategory("Layout")]
+               public virtual HorizontalAlign HorizontalAlign {
+                       get {
+                               if (!CheckBit ((int) TableItemStyles.HorizontalAlign))
+                                       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;
+                               SetBit ((int) TableItemStyles.HorizontalAlign);
+                       }
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (VerticalAlign.NotSet)]
+               [NotifyParentProperty (true)]
+               [WebSysDescription ("")]
+               [WebCategory("Layout")]
+               public virtual VerticalAlign VerticalAlign {
+                       get {
+                               if (!CheckBit ((int) TableItemStyles.VerticalAlign))
+                                       return VerticalAlign.NotSet;
+                               return (VerticalAlign) ViewState ["VerticalAlign"];
+                       }
+                       set {
+                               // avoid reflection
+                               if ((value < VerticalAlign.NotSet) || (value > VerticalAlign.Bottom)) {
+                                       // LAMESPEC: documented as ArgumentException
+                                       throw new ArgumentOutOfRangeException (Locale.GetText ("Invalid VerticalAlign value."));
+                               }
+                               ViewState ["VerticalAlign"] = value;
+                               SetBit ((int) TableItemStyles.VerticalAlign);
+                       }
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (true)]
+               [NotifyParentProperty (true)]
+               [WebSysDescription ("")]
+               [WebCategory("Layout")]
+               public virtual bool Wrap {
+                       get {
+                               if (!CheckBit ((int) TableItemStyles.Wrap))
+                                       return true;
+                               return (bool) ViewState ["Wrap"];
+                       }
+                       set {
+                               ViewState ["Wrap"] = value;
+                               SetBit ((int) TableItemStyles.Wrap);
+                       }
+               }
+
+
+               public override void AddAttributesToRender (HtmlTextWriter writer, WebControl owner)
+               {
+                       base.AddAttributesToRender (writer, owner);
+                       if (writer == null)
+                               return;
+
+                       // 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;
+                       }
+
+                       // note: avoid ToString on the enum
+                       switch (VerticalAlign) {
+                       case VerticalAlign.Top:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Valign, "top");
+                               break;
+                       case VerticalAlign.Middle:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Valign, "middle");
+                               break;
+                       case VerticalAlign.Bottom:
+                               writer.AddAttribute (HtmlTextWriterAttribute.Valign, "bottom");
+                               break;
+                       }
+
+                       if (!Wrap) {
+#if NET_2_0
+                               writer.AddStyleAttribute (HtmlTextWriterStyle.WhiteSpace, "nowrap");
+#else
+                               writer.AddAttribute (HtmlTextWriterAttribute.Nowrap, "nowrap");
+#endif
+                       }
+               }
+
+               private void Copy (string name, TableItemStyles s, Style source)
+               {
+                       if (source.CheckBit((int) s)) {
+                               object o = source.ViewState [name];
+                               if (o != null) {
+                                       ViewState [name] = o;
+                                       SetBit ((int) s);
+                               }
+                       }
+               }
+
+               public override void CopyFrom (Style s)
+               {
+                       base.CopyFrom (s);
+                       if (s != null && !s.IsEmpty) {
+                               Copy ("HorizontalAlign", TableItemStyles.HorizontalAlign, s);
+                               Copy ("VerticalAlign", TableItemStyles.VerticalAlign, s);
+                               Copy ("Wrap", TableItemStyles.Wrap, s);
+                       }
+               }
+
+               private void Merge (string name, TableItemStyles s, Style source)
+               {
+                       if ((!CheckBit ((int) s)) && (source.CheckBit ((int) s))) {
+                               object o = source.ViewState [name];
+                               if (o != null) {
+                                       ViewState [name] = o;
+                                       SetBit ((int) s);
+                               }
+                       }
+               }
+
+               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) {
+                                       Merge ("HorizontalAlign", TableItemStyles.HorizontalAlign, s);
+                                       Merge ("VerticalAlign", TableItemStyles.VerticalAlign, s);
+                                       Merge ("Wrap", TableItemStyles.Wrap, s);
+                               }
+                       }
+               }
+
+               public override void Reset ()
+               {
+                       if (CheckBit ((int) TableItemStyles.HorizontalAlign))
+                               ViewState.Remove ("HorizontalAlign");
+                       if (CheckBit ((int) TableItemStyles.VerticalAlign))
+                               ViewState.Remove ("VerticalAlign");
+                       if (CheckBit ((int) TableItemStyles.Wrap))
+                               ViewState.Remove ("Wrap");
+                       // call base at the end because "styles" will reset there
+                       base.Reset ();
+               }
+       }
+}