2004-09-12 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
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32 \r
33 using System;\r
34 using System.Collections;\r
35 using System.Web;\r
36 using System.Web.UI;\r
37 using System.ComponentModel;\r
38 \r
39 namespace System.Web.UI.WebControls\r
40 {\r
41         [TypeConverter(typeof(ExpandableObjectConverter))]\r
42         [ControlBuilder(typeof(ListItemControlBuilder))]\r
43         public sealed class ListItem : IStateManager, IParserAccessor, IAttributeAccessor\r
44         {\r
45                 private AttributeCollection attributes;\r
46                 private string              text;\r
47                 private string              val;\r
48                 private bool marked;\r
49                 private bool selected;\r
50                 private bool dirty_t;\r
51                 private bool dirty_v;\r
52 \r
53                 public ListItem(string text, string value)\r
54                 {\r
55                         this.text  = text;\r
56                         this.val   = value;\r
57                         attributes = null;\r
58                 }\r
59 \r
60                 public ListItem(string text): this(text, null)\r
61                 {\r
62                 }\r
63 \r
64                 public ListItem(): this(null, null)\r
65                 {\r
66                 }\r
67 \r
68                 public static ListItem FromString(string text)\r
69                 {\r
70                         return new ListItem(text);\r
71                 }\r
72
73                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]\r
74                 public AttributeCollection Attributes\r
75                 {\r
76                         get\r
77                         {\r
78                                 if(attributes == null)\r
79                                         attributes = new AttributeCollection(new StateBag(true));\r
80                                 return attributes;\r
81                         }\r
82                 }\r
83
84                 [DefaultValue (false)]\r
85                 public bool Selected\r
86                 {\r
87                         get {\r
88                                 return selected;\r
89                         }\r
90 \r
91                         set {\r
92                                 selected = value;\r
93                         }\r
94                 }\r
95 \r
96                 internal bool Dirty\r
97                 {\r
98                         get {\r
99                                 return (dirty_t && dirty_v);\r
100                         }\r
101 \r
102                         set {\r
103                                 dirty_t = value;\r
104                                 dirty_v = value;\r
105                         }\r
106                 }\r
107
108                 [DefaultValue ("")]
109                 [PersistenceMode (PersistenceMode.EncodedInnerDefaultProperty)]\r
110                 public string Text\r
111                 {\r
112                         get\r
113                         {\r
114                                 if(text!=null)\r
115                                 {\r
116                                         return text;\r
117                                 }\r
118                                 if(val!=null)\r
119                                 {\r
120                                         return val;\r
121                                 }\r
122                                 return String.Empty;\r
123                         }\r
124                         set\r
125                         {\r
126                                 text = value;\r
127                                 if (IsTrackingViewState)\r
128                                         dirty_t = true;\r
129                         }\r
130                 }\r
131
132                 [DefaultValue ("")]\r
133                 public string Value\r
134                 {\r
135                         get {\r
136                                 if (val != null)\r
137                                         return val;\r
138 \r
139                                 if (text != null)\r
140                                         return text;\r
141 \r
142                                 return String.Empty;\r
143                         }\r
144                         set\r
145                         {\r
146                                 val = value;\r
147                                 if(IsTrackingViewState)\r
148                                         dirty_v = true;\r
149                         }\r
150                 }\r
151
152                 string IAttributeAccessor.GetAttribute (string key)
153                 {
154                         if (attributes == null)
155                                 return null;
156
157                         return attributes [key];
158                 }
159
160                 void IAttributeAccessor.SetAttribute (string key, string value)
161                 {
162                         Attributes [key] = value;
163                 }
164
165                 /// <remarks>\r
166                 /// The data is parsed - object must be of type LiteralControl or DataBoundLiteralControl.\r
167                 /// In latter case, throw an exception telling that the data cannot be bind-ed.\r
168                 /// </remarks>\r
169                 void IParserAccessor.AddParsedSubObject(object obj)\r
170                 {\r
171                         if(obj is LiteralControl)\r
172                         {\r
173                                 Text = ((LiteralControl)obj).Text;\r
174                                 return;\r
175                         }\r
176                         if(obj is DataBoundLiteralControl)\r
177                         {\r
178                                 throw new HttpException(HttpRuntime.FormatResourceString("Control_Cannot_DataBind","ListItem"));\r
179                         }\r
180                         throw new HttpException(HttpRuntime.FormatResourceString("Cannot_Have_Children_Of_Type", "ListItem", obj.GetType().ToString()));\r
181                 }\r
182 \r
183                 bool IsTrackingViewState\r
184                 {\r
185                         get\r
186                         {\r
187                                 return marked;\r
188                         }\r
189                 }\r
190 \r
191                 internal void TrackViewState()\r
192                 {\r
193                         marked = true;\r
194                 }\r
195 \r
196                 internal void LoadViewState(object state)\r
197                 {\r
198                         if(state is Pair)\r
199                         {\r
200                                 Pair tv = (Pair)state;\r
201                                 if(tv.First!=null)\r
202                                 {\r
203                                         Text = (string)tv.First;\r
204                                 }\r
205                                 if(tv.Second!=null)\r
206                                 {\r
207                                         Value = (string)tv.Second;\r
208                                 }\r
209                         }\r
210                 }\r
211 \r
212                 internal object SaveViewState()\r
213                 {\r
214                         if (dirty_t && dirty_v)\r
215                                 return new Pair(Text, Value);\r
216 \r
217                         if (dirty_t)\r
218                                 return new Pair (Text, null);\r
219 \r
220                         if (dirty_v)\r
221                                 return new Pair(null, Value);\r
222 \r
223                         return null;\r
224                 }\r
225 \r
226                 public override bool Equals (object o)\r
227                 {\r
228                         ListItem li = o as ListItem;\r
229                         if (li == null)\r
230                                 return false;\r
231 \r
232                         return (Text == li.Text && Value == li.Value);\r
233                 }\r
234 \r
235                 public override int GetHashCode ()\r
236                 {\r
237                         return base.GetHashCode ();\r
238                 }\r
239 \r
240                 public override string ToString ()\r
241                 {\r
242                         return Text;\r
243                 }\r
244 \r
245                 bool IStateManager.IsTrackingViewState\r
246                 {\r
247                         get\r
248                         {\r
249                                 return IsTrackingViewState;\r
250                         }\r
251                 }\r
252 \r
253                 void IStateManager.TrackViewState()\r
254                 {\r
255                         TrackViewState();\r
256                 }\r
257 \r
258                 object IStateManager.SaveViewState()\r
259                 {\r
260                         return SaveViewState();\r
261                 }\r
262 \r
263                 void IStateManager.LoadViewState(object state)\r
264                 {\r
265                         LoadViewState(state);\r
266                 }\r
267         }\r
268 }\r