2002-02-21 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / ListItem.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     ListItem\r
4  *\r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
8  * Implementation: yes\r
9  * Status:  100%\r
10  *\r
11  * (C) Gaurav Vaish (2001)\r
12  */\r
13 \r
14 using System;\r
15 using System.Collections;\r
16 using System.Web;\r
17 using System.Web.UI;\r
18 \r
19 namespace System.Web.UI.WebControls\r
20 {\r
21         public sealed class ListItem : IStateManager, IParserAccessor, IAttributeAccessor\r
22         {\r
23                 private static int MARKED   = (0x01 << 0);\r
24                 private static int SELECTED = (0x01 << 1);\r
25                 private static int DIRTY_T  = (0x01 << 2);\r
26                 private static int DIRTY_V  = (0x01 << 3);\r
27                 \r
28                 private static int selBits;\r
29                 \r
30                 private AttributeCollection attributes;\r
31                 private string              text;\r
32                 private string              val;\r
33                 \r
34                 public ListItem(string text, string value)\r
35                 {\r
36                         this.text  = text;\r
37                         this.val   = value;\r
38                         selBits    = 0x00;\r
39                         attributes = null;\r
40                 }\r
41                 \r
42                 public ListItem(string text): this(text, null)\r
43                 {\r
44                 }\r
45                 \r
46                 public ListItem(): this(null, null)\r
47                 {\r
48                 }\r
49                 \r
50                 public static ListItem FromString(string text)\r
51                 {\r
52                         return new ListItem(text);\r
53                 }\r
54                 \r
55                 public AttributeCollection Attributes\r
56                 {\r
57                         get\r
58                         {\r
59                                 if(attributes == null)\r
60                                         attributes = new AttributeCollection(new StateBag(true));\r
61                                 return attributes;\r
62                         }\r
63                 }\r
64                 \r
65                 public bool Selected\r
66                 {\r
67                         get\r
68                         {\r
69                                 return IsSet(SELECTED);\r
70                         }\r
71                         set\r
72                         {\r
73                                 Set(SELECTED);\r
74                         }\r
75                 }\r
76                 \r
77                 internal bool Dirty\r
78                 {\r
79                         get\r
80                         {\r
81                                 return (IsSet(DIRTY_T) && IsSet(DIRTY_V));\r
82                         }\r
83                         set\r
84                         {\r
85                                 Set(DIRTY_T);\r
86                                 Set(DIRTY_V);\r
87                         }\r
88                 }\r
89                 \r
90                 private bool IsSet(int bit)\r
91                 {\r
92                         return ( (selBits & bit) != 0x00 );\r
93                 }\r
94                 \r
95                 private void Set(int bit)\r
96                 {\r
97                         selBits |= bit;\r
98                 }\r
99                 \r
100                 public string Text\r
101                 {\r
102                         get\r
103                         {\r
104                                 if(text!=null)\r
105                                 {\r
106                                         return text;\r
107                                 }\r
108                                 if(val!=null)\r
109                                 {\r
110                                         return val;\r
111                                 }\r
112                                 return String.Empty;\r
113                         }\r
114                         set\r
115                         {\r
116                                 text = value;\r
117                                 if(IsTrackingViewState)\r
118                                 {\r
119                                         Set(DIRTY_T);\r
120                                 }\r
121                         }\r
122                 }\r
123                 \r
124                 public string Value\r
125                 {\r
126                         get\r
127                         {\r
128                                 if(val!=null)\r
129                                 {\r
130                                         return val;\r
131                                 }\r
132                                 if(text!=null)\r
133                                 {\r
134                                         return text;\r
135                                 }\r
136                                 return String.Empty;\r
137                         }\r
138                         set\r
139                         {\r
140                                 val = value;\r
141                                 if(IsTrackingViewState)\r
142                                 {\r
143                                         Set(DIRTY_V);\r
144                                 }\r
145                         }\r
146                 }\r
147                 \r
148                 string IAttributeAccessor.GetAttribute(string key)\r
149                 {\r
150                         return attributes[key];\r
151                 }\r
152                 \r
153                 void IAttributeAccessor.SetAttribute(string key, string value)\r
154                 {\r
155                         attributes[key] = value;\r
156                 }\r
157                 \r
158                 /// <remarks>\r
159                 /// The data is parsed - object must be of type LiteralControl or DataBoundLiteralControl.\r
160                 /// In latter case, throw an exception telling that the data cannot be bind-ed.\r
161                 /// </remarks>\r
162                 void IParserAccessor.AddParsedSubObject(object obj)\r
163                 {\r
164                         if(obj is LiteralControl)\r
165                         {\r
166                                 Text = ((LiteralControl)obj).Text;\r
167                                 return;\r
168                         }\r
169                         if(obj is DataBoundLiteralControl)\r
170                         {\r
171                                 throw new HttpException(HttpRuntime.FormatResourceString("Control_Cannot_DataBind","ListItem"));\r
172                         }\r
173                         throw new HttpException(HttpRuntime.FormatResourceString("Cannot_Have_Children_Of_Type", "ListItem", obj.GetType().ToString()));\r
174                 }\r
175 \r
176                 internal bool IsTrackingViewState\r
177                 {\r
178                         get\r
179                         {\r
180                                 return IsSet(MARKED);\r
181                         }\r
182                 }\r
183 \r
184                 internal void TrackViewState()\r
185                 {\r
186                         Set(MARKED);\r
187                 }\r
188 \r
189                 internal void LoadViewState(object state)\r
190                 {\r
191                         if(state is Pair)\r
192                         {\r
193                                 Pair tv = (Pair)state;\r
194                                 if(tv.First!=null)\r
195                                 {\r
196                                         Text = (string)tv.First;\r
197                                 }\r
198                                 if(tv.Second!=null)\r
199                                 {\r
200                                         Value = (string)tv.Second;\r
201                                 }\r
202                         }\r
203                         if(state is string)\r
204                         {\r
205                                 Text = (string)state;\r
206                         }\r
207                 }\r
208 \r
209                 internal object SaveViewState()\r
210                 {\r
211                         if(IsSet(DIRTY_T) && IsSet(DIRTY_V))\r
212                         {\r
213                                 return new Pair(Text, Value);\r
214                         }\r
215                         if(IsSet(DIRTY_T))\r
216                         {\r
217                                 return Text;\r
218                         }\r
219                         if(IsSet(DIRTY_V))\r
220                         {\r
221                                 return new Pair(null, Value);\r
222                         }\r
223                         return null;\r
224                 }\r
225                 \r
226                 bool IStateManager.IsTrackingViewState\r
227                 {\r
228                         get\r
229                         {\r
230                                 return IsTrackingViewState;\r
231                         }\r
232                 }\r
233                 \r
234                 void IStateManager.TrackViewState()\r
235                 {\r
236                         TrackViewState();\r
237                 }\r
238                 \r
239                 object IStateManager.SaveViewState()\r
240                 {\r
241                         return SaveViewState();\r
242                 }\r
243                 \r
244                 void IStateManager.LoadViewState(object state)\r
245                 {\r
246                         LoadViewState(state);\r
247                 }\r
248         }\r
249 }\r