* 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
\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