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