2003-07-30 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / ListItemCollection.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     ListItemCollection\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 using System.ComponentModel;\r
19 using System.Reflection;\r
20 \r
21 namespace System.Web.UI.WebControls\r
22 {\r
23         //[Editor("??", typeof(Design.WebControls.ListItemCollectionEditor))]\r
24         public sealed class ListItemCollection : IList, ICollection, IEnumerable, IStateManager\r
25         {\r
26                 private ArrayList items;\r
27                 private bool      saveAll;\r
28                 private bool      marked;\r
29 \r
30                 public ListItemCollection()\r
31                 {\r
32                         items   = new ArrayList();\r
33                         saveAll = false;\r
34                         marked  = false;\r
35                 }\r
36 \r
37                 public int Capacity\r
38                 {\r
39                         get\r
40                         {\r
41                                 return items.Capacity;\r
42                         }\r
43                         set\r
44                         {\r
45                                 items.Capacity = value;\r
46                         }\r
47                 }\r
48 \r
49                 public int Count\r
50                 {\r
51                         get\r
52                         {\r
53                                 return items.Count;\r
54                         }\r
55                 }\r
56 \r
57                 public bool IsReadOnly\r
58                 {\r
59                         get\r
60                         {\r
61                                 return items.IsReadOnly;\r
62                         }\r
63                 }\r
64 \r
65                 public bool IsSynchronized\r
66                 {\r
67                         get\r
68                         {\r
69                                 return items.IsSynchronized;\r
70                         }\r
71                 }\r
72 \r
73                 public ListItem this[int index]\r
74                 {\r
75                         get\r
76                         {\r
77                                 if(index < 0 || index >= Count)\r
78                                         return null;\r
79                                 return (ListItem)(items[index]);\r
80                         }               \r
81                 }\r
82 \r
83                 public object SyncRoot\r
84                 {\r
85                         get\r
86                         {\r
87                                 return this;\r
88                         }\r
89                 }\r
90 \r
91                 public void Add(ListItem item)\r
92                 {\r
93                         items.Add(item);\r
94                         if(marked)\r
95                                 item.Dirty = true;\r
96                 }\r
97 \r
98                 public void Add(string item)\r
99                 {\r
100                         Add(new ListItem(item));\r
101                 }\r
102 \r
103                 public void AddRange(ListItem[] items)\r
104                 {\r
105                         foreach(ListItem item in items)\r
106                         {\r
107                                 if(item!=null)\r
108                                         Add(item);\r
109                         }\r
110                 }\r
111 \r
112                 public void Clear()\r
113                 {\r
114                         items.Clear();\r
115                         if(marked)\r
116                                 saveAll = true;\r
117                 }\r
118 \r
119                 public bool Contains(ListItem item)\r
120                 {\r
121                         return items.Contains(item);\r
122                 }\r
123 \r
124                 public void CopyTo(Array array, int index)\r
125                 {\r
126                         items.CopyTo(array, index);\r
127                 }\r
128 \r
129                 public ListItem FindByText(string text)\r
130                 {\r
131                         int i=-1;\r
132                         foreach(object current in items)\r
133                         {\r
134                                 i++;\r
135                                 if(((ListItem)current).Text == text)\r
136                                         break;\r
137                         }\r
138                         return (i==-1 ? null : (ListItem)items[i]);\r
139                 }\r
140 \r
141                 public ListItem FindByValue(string value)\r
142                 {\r
143                         foreach(ListItem current in items)\r
144                         {\r
145                                 if(current.Value == value)\r
146                                 {\r
147                                         return current;\r
148                                 }\r
149                         }\r
150                         return null;\r
151                 }\r
152 \r
153                 internal int FindByValueInternal(string value)\r
154                 {\r
155                         int i = -1;\r
156                         foreach(ListItem current in items)\r
157                         {\r
158                                 i++;\r
159                                 if(current.Value == value)\r
160                                 {\r
161                                         return i;\r
162                                 }\r
163                         }\r
164                         return -1;\r
165                 }\r
166 \r
167                 public IEnumerator GetEnumerator()\r
168                 {\r
169                         return items.GetEnumerator();\r
170                 }\r
171 \r
172                 public int IndexOf(ListItem item)\r
173                 {\r
174                         return items.IndexOf(item);\r
175                 }\r
176 \r
177                 public void Insert(int index, ListItem item)\r
178                 {\r
179                         items.Insert(index, item);\r
180                         if(marked)\r
181                                 saveAll = true;\r
182                 }\r
183 \r
184                 public void Insert(int index, string item)\r
185                 {\r
186                         Insert(index, new ListItem(item));\r
187                 }\r
188 \r
189                 public void RemoveAt(int index)\r
190                 {\r
191                         if(index < 0 || index >= items.Count)\r
192                                 return;\r
193                         items.RemoveAt(index);\r
194                         if(marked)\r
195                                 saveAll = true;\r
196                 }\r
197 \r
198                 public void Remove(ListItem item)\r
199                 {\r
200                         RemoveAt(IndexOf(item));\r
201                 }\r
202 \r
203                 public void Remove(string item)\r
204                 {\r
205                         RemoveAt(IndexOf(ListItem.FromString(item)));\r
206                 }\r
207 \r
208                 internal object SaveViewState ()\r
209                 {\r
210                         int count = Count;\r
211                         if (saveAll) {\r
212                                 string [] keys = new string [count];\r
213                                 string [] vals = new string [count];\r
214                                 for(int i = 0; i < count; i++) {\r
215                                         keys[i] = this [i].Text;\r
216                                         vals[i] = this [i].Value;\r
217                                 }\r
218 \r
219                                 return new Triplet (count, keys, vals);\r
220                         }\r
221 \r
222                         ArrayList indices = new ArrayList ();\r
223                         ArrayList states = new ArrayList ();\r
224                         object o;\r
225                         for(int i = 0; i < count; i++) {\r
226                                 o = this [i].SaveViewState ();\r
227                                 if (o == null)\r
228                                         continue;\r
229 \r
230                                 indices.Add (i);\r
231                                 states.Add (o);\r
232                         }\r
233 \r
234                         if (indices.Count > 0)\r
235                                 return new Pair (indices, states);\r
236 \r
237                         return null;\r
238                 }\r
239 \r
240                 internal void LoadViewState (object savedState)\r
241                 {\r
242                         if (savedState == null)\r
243                                 return;\r
244 \r
245                         int i, end;\r
246                         if (savedState is Pair) {\r
247                                 Pair pair = (Pair) savedState;\r
248                                 ArrayList indices = (ArrayList) pair.First;\r
249                                 ArrayList states  = (ArrayList) pair.Second;\r
250 \r
251                                 end = indices.Count;\r
252                                 for (i = 0; i < end; i++) {\r
253                                         if ((int) indices [i] < Count ) {\r
254                                                 this [i].LoadViewState (states [i]);\r
255                                         } else {\r
256                                                 ListItem temp = new ListItem ();\r
257                                                 temp.LoadViewState (states [i]);\r
258                                                 Add (temp);\r
259                                         }\r
260                                 }\r
261                         } else if (savedState is Triplet) {\r
262                                 Triplet t = (Triplet) savedState;\r
263                                 items = new ArrayList ((int) t.First);\r
264                                 saveAll = true;\r
265                                 object [] text = (object []) t.Second;\r
266                                 object [] vals = (object []) t.Third;\r
267                                 end = text.Length;\r
268                                 for(i = 0; i < end; i++)\r
269                                         items.Add (new ListItem (text[i].ToString (), vals[i].ToString ()));\r
270                         }\r
271                 }\r
272 \r
273                 internal void TrackViewState()\r
274                 {\r
275                         marked = true;\r
276                         foreach(ListItem current in items)\r
277                                 current.TrackViewState();\r
278                 }\r
279 \r
280                 bool IList.IsFixedSize\r
281                 {\r
282                         get\r
283                         {\r
284                                 return false;\r
285                         }\r
286                 }\r
287 \r
288                 object IList.this[int index]\r
289                 {\r
290                         get\r
291                         {\r
292                                 return this[index];\r
293                         }\r
294                         \r
295                         set\r
296                         {\r
297                                 if(index >= 0 && index < Count)\r
298                                         if(value is ListItem)\r
299                                                 items[index] = (ListItem) value;\r
300                         }\r
301                 }\r
302 \r
303                 int IList.Add(object item)\r
304                 {\r
305                         int index = (item is ListItem ? items.Add((ListItem)item) : -1);\r
306                         if(index!=-1 && marked)\r
307                                 ((ListItem)item).Dirty = true;\r
308                         return index;\r
309                 }\r
310 \r
311                 bool IList.Contains(object item)\r
312                 {\r
313                         if(item is ListItem)\r
314                                 return Contains((ListItem)item);\r
315                         return false;\r
316                 }\r
317 \r
318                 int IList.IndexOf(object item)\r
319                 {\r
320                         if(item is ListItem)\r
321                                 return IndexOf((ListItem)item);\r
322                         return -1;\r
323                 }\r
324 \r
325                 void IList.Insert(int index, object item)\r
326                 {\r
327                         if(item is ListItem)\r
328                                 Insert(index, (ListItem)item);\r
329                 }\r
330 \r
331                 void IList.Remove(object item)\r
332                 {\r
333                         if(item is string)\r
334                                 Remove((string)item);\r
335                         if(item is ListItem)\r
336                                 Remove((ListItem)item);\r
337                 }\r
338 \r
339                 bool IStateManager.IsTrackingViewState\r
340                 {\r
341                         get\r
342                         {\r
343                                 return marked;\r
344                         }\r
345                 }\r
346 \r
347                 void IStateManager.LoadViewState(object state)\r
348                 {\r
349                         LoadViewState(state);\r
350                 }\r
351 \r
352                 object IStateManager.SaveViewState()\r
353                 {\r
354                         return SaveViewState();\r
355                 }\r
356 \r
357                 void IStateManager.TrackViewState()\r
358                 {\r
359                         TrackViewState();\r
360                 }\r
361         }\r
362 }\r