2002-02-21 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / ListItem.cs
index 1ba7c16b25ea64805c1660716f9b5b56778d42a4..f5724127fcadecb12ee795abc37fe4c315e90fd6 100644 (file)
@@ -6,7 +6,7 @@
  * Maintainer: gvaish@iitk.ac.in\r
  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
  * Implementation: yes\r
- * Status:  10%\r
+ * Status:  100%\r
  *\r
  * (C) Gaurav Vaish (2001)\r
  */\r
@@ -18,8 +18,232 @@ using System.Web.UI;
 \r
 namespace System.Web.UI.WebControls\r
 {\r
-       public class ListItem : IStateManager, IParserAccessor, IAttributeAccessor\r
+       public sealed class ListItem : IStateManager, IParserAccessor, IAttributeAccessor\r
        {\r
+               private static int MARKED   = (0x01 << 0);\r
+               private static int SELECTED = (0x01 << 1);\r
+               private static int DIRTY_T  = (0x01 << 2);\r
+               private static int DIRTY_V  = (0x01 << 3);\r
                \r
+               private static int selBits;\r
+               \r
+               private AttributeCollection attributes;\r
+               private string              text;\r
+               private string              val;\r
+               \r
+               public ListItem(string text, string value)\r
+               {\r
+                       this.text  = text;\r
+                       this.val   = value;\r
+                       selBits    = 0x00;\r
+                       attributes = null;\r
+               }\r
+               \r
+               public ListItem(string text): this(text, null)\r
+               {\r
+               }\r
+               \r
+               public ListItem(): this(null, null)\r
+               {\r
+               }\r
+               \r
+               public static ListItem FromString(string text)\r
+               {\r
+                       return new ListItem(text);\r
+               }\r
+               \r
+               public AttributeCollection Attributes\r
+               {\r
+                       get\r
+                       {\r
+                               if(attributes == null)\r
+                                       attributes = new AttributeCollection(new StateBag(true));\r
+                               return attributes;\r
+                       }\r
+               }\r
+               \r
+               public bool Selected\r
+               {\r
+                       get\r
+                       {\r
+                               return IsSet(SELECTED);\r
+                       }\r
+                       set\r
+                       {\r
+                               Set(SELECTED);\r
+                       }\r
+               }\r
+               \r
+               internal bool Dirty\r
+               {\r
+                       get\r
+                       {\r
+                               return (IsSet(DIRTY_T) && IsSet(DIRTY_V));\r
+                       }\r
+                       set\r
+                       {\r
+                               Set(DIRTY_T);\r
+                               Set(DIRTY_V);\r
+                       }\r
+               }\r
+               \r
+               private bool IsSet(int bit)\r
+               {\r
+                       return ( (selBits & bit) != 0x00 );\r
+               }\r
+               \r
+               private void Set(int bit)\r
+               {\r
+                       selBits |= bit;\r
+               }\r
+               \r
+               public string Text\r
+               {\r
+                       get\r
+                       {\r
+                               if(text!=null)\r
+                               {\r
+                                       return text;\r
+                               }\r
+                               if(val!=null)\r
+                               {\r
+                                       return val;\r
+                               }\r
+                               return String.Empty;\r
+                       }\r
+                       set\r
+                       {\r
+                               text = value;\r
+                               if(IsTrackingViewState)\r
+                               {\r
+                                       Set(DIRTY_T);\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               public string Value\r
+               {\r
+                       get\r
+                       {\r
+                               if(val!=null)\r
+                               {\r
+                                       return val;\r
+                               }\r
+                               if(text!=null)\r
+                               {\r
+                                       return text;\r
+                               }\r
+                               return String.Empty;\r
+                       }\r
+                       set\r
+                       {\r
+                               val = value;\r
+                               if(IsTrackingViewState)\r
+                               {\r
+                                       Set(DIRTY_V);\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               string IAttributeAccessor.GetAttribute(string key)\r
+               {\r
+                       return attributes[key];\r
+               }\r
+               \r
+               void IAttributeAccessor.SetAttribute(string key, string value)\r
+               {\r
+                       attributes[key] = value;\r
+               }\r
+               \r
+               /// <remarks>\r
+               /// The data is parsed - object must be of type LiteralControl or DataBoundLiteralControl.\r
+               /// In latter case, throw an exception telling that the data cannot be bind-ed.\r
+               /// </remarks>\r
+               void IParserAccessor.AddParsedSubObject(object obj)\r
+               {\r
+                       if(obj is LiteralControl)\r
+                       {\r
+                               Text = ((LiteralControl)obj).Text;\r
+                               return;\r
+                       }\r
+                       if(obj is DataBoundLiteralControl)\r
+                       {\r
+                               throw new HttpException(HttpRuntime.FormatResourceString("Control_Cannot_DataBind","ListItem"));\r
+                       }\r
+                       throw new HttpException(HttpRuntime.FormatResourceString("Cannot_Have_Children_Of_Type", "ListItem", obj.GetType().ToString()));\r
+               }\r
+\r
+               internal bool IsTrackingViewState\r
+               {\r
+                       get\r
+                       {\r
+                               return IsSet(MARKED);\r
+                       }\r
+               }\r
+\r
+               internal void TrackViewState()\r
+               {\r
+                       Set(MARKED);\r
+               }\r
+\r
+               internal void LoadViewState(object state)\r
+               {\r
+                       if(state is Pair)\r
+                       {\r
+                               Pair tv = (Pair)state;\r
+                               if(tv.First!=null)\r
+                               {\r
+                                       Text = (string)tv.First;\r
+                               }\r
+                               if(tv.Second!=null)\r
+                               {\r
+                                       Value = (string)tv.Second;\r
+                               }\r
+                       }\r
+                       if(state is string)\r
+                       {\r
+                               Text = (string)state;\r
+                       }\r
+               }\r
+\r
+               internal object SaveViewState()\r
+               {\r
+                       if(IsSet(DIRTY_T) && IsSet(DIRTY_V))\r
+                       {\r
+                               return new Pair(Text, Value);\r
+                       }\r
+                       if(IsSet(DIRTY_T))\r
+                       {\r
+                               return Text;\r
+                       }\r
+                       if(IsSet(DIRTY_V))\r
+                       {\r
+                               return new Pair(null, Value);\r
+                       }\r
+                       return null;\r
+               }\r
+               \r
+               bool IStateManager.IsTrackingViewState\r
+               {\r
+                       get\r
+                       {\r
+                               return IsTrackingViewState;\r
+                       }\r
+               }\r
+               \r
+               void IStateManager.TrackViewState()\r
+               {\r
+                       TrackViewState();\r
+               }\r
+               \r
+               object IStateManager.SaveViewState()\r
+               {\r
+                       return SaveViewState();\r
+               }\r
+               \r
+               void IStateManager.LoadViewState(object state)\r
+               {\r
+                       LoadViewState(state);\r
+               }\r
        }\r
 }\r