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