2002-08-10 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / PagedDataSource.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     PagedDataSource\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 (2002)\r
12  */\r
13 \r
14 using System;\r
15 using System.ComponentModel;\r
16 using System.Collections;\r
17 using System.Web;\r
18 using System.Web.UI;\r
19 \r
20 namespace System.Web.UI.WebControls\r
21 {\r
22         public sealed class PagedDataSource : ICollection, IEnumerable, ITypedList\r
23         {\r
24                 private int  pageSize;\r
25                 private bool allowPaging;\r
26                 private int  currentPageIndex;\r
27                 private bool allowCustomPaging;\r
28                 private int  virtualCount;\r
29 \r
30                 private IEnumerable dataSource;\r
31 \r
32                 public PagedDataSource()\r
33                 {\r
34                         Initialize();\r
35                 }\r
36 \r
37                 private void Initialize()\r
38                 {\r
39                         pageSize          = 10;\r
40                         allowPaging       = false;\r
41                         currentPageIndex  = 0;\r
42                         allowCustomPaging = false;\r
43                         virtualCount      = 0;\r
44                 }\r
45 \r
46                 public bool AllowCustomPaging\r
47                 {\r
48                         get\r
49                         {\r
50                                 return allowCustomPaging;\r
51                         }\r
52                         set\r
53                         {\r
54                                 allowCustomPaging = value;\r
55                         }\r
56                 }\r
57 \r
58                 public bool AllowPaging\r
59                 {\r
60                         get\r
61                         {\r
62                                 return allowPaging;\r
63                         }\r
64                         set\r
65                         {\r
66                                 allowPaging = value;\r
67                         }\r
68                 }\r
69 \r
70                 public int Count\r
71                 {\r
72                         get\r
73                         {\r
74                                 if(dataSource != null)\r
75                                 {\r
76                                         if(IsPagingEnabled)\r
77                                         {\r
78                                                 return DataSourceCount;\r
79                                         }\r
80                                         if(IsCustomPagingEnabled)\r
81                                         {\r
82                                                 return pageSize;\r
83                                         }\r
84                                         if(IsLastPage)\r
85                                         {\r
86                                                 return (DataSourceCount - FirstIndexInPage);\r
87                                         }\r
88                                         return pageSize;\r
89                                 }\r
90                                 return 0;\r
91                         }\r
92                 }\r
93 \r
94                 public int CurrentPageIndex\r
95                 {\r
96                         get\r
97                         {\r
98                                 return currentPageIndex;\r
99                         }\r
100 \r
101                         set\r
102                         {\r
103                                 currentPageIndex = value;\r
104                         }\r
105                 }\r
106 \r
107                 public IEnumerable DataSource\r
108                 {\r
109                         get\r
110                         {\r
111                                 return dataSource;\r
112                         }\r
113                         set\r
114                         {\r
115                                 dataSource = value;\r
116                         }\r
117                 }\r
118 \r
119                 public int DataSourceCount\r
120                 {\r
121                         get\r
122                         {\r
123                                 if(dataSource != null)\r
124                                 {\r
125                                         if(IsCustomPagingEnabled)\r
126                                         {\r
127                                                 return virtualCount;\r
128                                         }\r
129                                         if(dataSource is ICollection)\r
130                                         {\r
131                                                 return ((ICollection)dataSource).Count;\r
132                                         }\r
133                                         throw new HttpException(HttpRuntime.FormatResourceString("PagedDataSource_Cannot_Get_Count"));\r
134                                 }\r
135                                 return 0;\r
136                         }\r
137                 }\r
138 \r
139                 public int FirstIndexInPage\r
140                 {\r
141                         get\r
142                         {\r
143                                 if(dataSource != null && IsPagingEnabled && IsCustomPagingEnabled)\r
144                                 {\r
145                                         return (currentPageIndex * pageSize);\r
146                                 }\r
147                                 return 0;\r
148                         }\r
149                 }\r
150 \r
151                 public bool IsCustomPagingEnabled\r
152                 {\r
153                         get\r
154                         {\r
155                                 return (IsPagingEnabled && allowCustomPaging);\r
156                         }\r
157                 }\r
158 \r
159                 public bool IsFirstPage\r
160                 {\r
161                         get\r
162                         {\r
163                                 return (!IsPagingEnabled || (CurrentPageIndex == 0));\r
164                         }\r
165                 }\r
166 \r
167                 public bool IsLastPage\r
168                 {\r
169                         get\r
170                         {\r
171                                 return (!IsPagingEnabled || (CurrentPageIndex == PageCount));\r
172                         }\r
173                 }\r
174 \r
175                 public bool IsPagingEnabled\r
176                 {\r
177                         get\r
178                         {\r
179                                 return (allowPaging && pageSize != 0);\r
180                         }\r
181                 }\r
182 \r
183                 public bool IsReadOnly\r
184                 {\r
185                         get\r
186                         {\r
187                                 return false;\r
188                         }\r
189                 }\r
190 \r
191                 public bool IsSynchronized\r
192                 {\r
193                         get\r
194                         {\r
195                                 return false;\r
196                         }\r
197                 }\r
198 \r
199                 public int PageCount\r
200                 {\r
201                         get\r
202                         {\r
203                                 if(dataSource != null)\r
204                                 {\r
205                                         int total = DataSourceCount;\r
206                                         if(!IsPagingEnabled)\r
207                                         {\r
208                                                 return total;\r
209                                         }\r
210                                         return (total + pageSize - 1)/pageSize;\r
211                                 }\r
212                                 return 0;\r
213                         }\r
214                 }\r
215 \r
216                 public int PageSize\r
217                 {\r
218                         get\r
219                         {\r
220                                 return pageSize;\r
221                         }\r
222                         set\r
223                         {\r
224                                 pageSize = value;\r
225                         }\r
226                 }\r
227 \r
228                 public object SyncRoot\r
229                 {\r
230                         get\r
231                         {\r
232                                 return this;\r
233                         }\r
234                 }\r
235 \r
236                 public int VirtualCount\r
237                 {\r
238                         get\r
239                         {\r
240                                 return virtualCount;\r
241                         }\r
242                         set\r
243                         {\r
244                                 virtualCount = value;\r
245                         }\r
246                 }\r
247 \r
248                 public void CopyTo(Array array, int index)\r
249                 {\r
250                         foreach(object current in this)\r
251                         {\r
252                                 array.SetValue(array, index++);\r
253                         }\r
254                 }\r
255 \r
256                 public IEnumerator GetEnumerator()\r
257                 {\r
258                         int fInd = FirstIndexInPage;\r
259                         int count = -1;\r
260                         if(dataSource is ICollection)\r
261                         {\r
262                                 count = Count;\r
263                         }\r
264 \r
265                         if(dataSource is IList)\r
266                         {\r
267                                 return (new PrivateListEnumerator((IList)dataSource, fInd, count));\r
268                         }\r
269                         if(dataSource is Array)\r
270                         {\r
271                                 return (new PrivateArrayEnumerator((object[])dataSource, fInd, count));\r
272                         }\r
273                         if(dataSource is ICollection)\r
274                         {\r
275                                 return (new PrivateICollectionEnumerator((ICollection)dataSource, fInd, count));\r
276                         }\r
277                         if(allowCustomPaging)\r
278                         {\r
279                                 return (new PrivateIEnumeratorEnumerator(dataSource.GetEnumerator(), Count));\r
280                         }\r
281                         return dataSource.GetEnumerator();\r
282                 }\r
283 \r
284                 class PrivateIEnumeratorEnumerator : IEnumerator\r
285                 {\r
286                         private int index;\r
287                         private int max;\r
288 \r
289                         private IEnumerator enumerator;\r
290 \r
291                         public PrivateIEnumeratorEnumerator(IEnumerator enumerator, int count)\r
292                         {\r
293                                 this.enumerator = enumerator;\r
294                                 index = -1;\r
295                                 max   = count;\r
296                         }\r
297 \r
298                         public bool MoveNext()\r
299                         {\r
300                                 enumerator.MoveNext();\r
301                                 index++;\r
302                                 return (index < max);\r
303                         }\r
304 \r
305                         public void Reset()\r
306                         {\r
307                                 index = -1;\r
308                                 enumerator.Reset();\r
309                         }\r
310 \r
311                         public object Current\r
312                         {\r
313                                 get\r
314                                 {\r
315                                         return enumerator.Current;\r
316                                 }\r
317                         }\r
318                 }\r
319 \r
320                 class PrivateICollectionEnumerator : IEnumerator\r
321                 {\r
322                         private int index;\r
323                         private int start;\r
324                         private int max;\r
325 \r
326                         private ICollection collection;\r
327                         private IEnumerator collEnum;\r
328 \r
329                         public PrivateICollectionEnumerator(ICollection collection, int start, int count)\r
330                         {\r
331                                 this.collection = collection;\r
332                                 this.start  = start;\r
333                                 index = -1;\r
334                                 max = start + count;\r
335                                 if(max > collection.Count)\r
336                                 {\r
337                                         max = collection.Count;\r
338                                 }\r
339                         }\r
340 \r
341                         public bool MoveNext()\r
342                         {\r
343                                 if(collEnum == null)\r
344                                 {\r
345                                         int cIndex = 0;\r
346                                         collEnum = collection.GetEnumerator();\r
347                                         while(cIndex < start)\r
348                                         {\r
349                                                 collEnum.MoveNext();\r
350                                         }\r
351                                 }\r
352                                 collEnum.MoveNext();\r
353                                 index++;\r
354                                 return (start + index < max);\r
355                         }\r
356 \r
357                         public void Reset()\r
358                         {\r
359                                 index = -1;\r
360                                 collEnum = null;\r
361                         }\r
362 \r
363                         public object Current\r
364                         {\r
365                                 get\r
366                                 {\r
367                                         return collEnum.Current;\r
368                                 }\r
369                         }\r
370                 }\r
371 \r
372                 class PrivateArrayEnumerator : IEnumerator\r
373                 {\r
374                         private int index;\r
375                         private int start;\r
376                         private int max;\r
377                         private object[] values;\r
378 \r
379                         public PrivateArrayEnumerator(object[] values, int start, int count)\r
380                         {\r
381                                 this.values = values;\r
382                                 this.start  = start;\r
383                                 index = -1;\r
384                                 max = start + count;\r
385                                 if(max > this.values.Length)\r
386                                 {\r
387                                         max = this.values.Length;\r
388                                 }\r
389                         }\r
390 \r
391                         public bool MoveNext()\r
392                         {\r
393                                 index++;\r
394                                 return (index + start < max);\r
395                         }\r
396 \r
397                         public void Reset()\r
398                         {\r
399                                 index = -1;\r
400                         }\r
401 \r
402                         public object Current\r
403                         {\r
404                                 get\r
405                                 {\r
406                                         if(index >= 0)\r
407                                         {\r
408                                                 return values[index + start];\r
409                                         }\r
410                                         throw new InvalidOperationException("Enumerator_MoveNext_Not_Called");\r
411                                 }\r
412                         }\r
413                 }\r
414 \r
415                 class PrivateListEnumerator : IEnumerator\r
416                 {\r
417                         private int   index;\r
418                         private int   start;\r
419                         private int   max;\r
420                         private IList collection;\r
421 \r
422                         public PrivateListEnumerator(IList list, int start, int count)\r
423                         {\r
424                                 collection = list;\r
425                                 this.start = start;\r
426                                 index = -1;\r
427                                 max = start + count;\r
428                                 if(max > list.Count)\r
429                                 {\r
430                                         max = list.Count;\r
431                                 }\r
432                         }\r
433 \r
434                         public bool MoveNext()\r
435                         {\r
436                                 index++;\r
437                                 return (index + start < max);\r
438                         }\r
439 \r
440                         public void Reset()\r
441                         {\r
442                                 index = -1;\r
443                         }\r
444 \r
445                         public object Current\r
446                         {\r
447                                 get\r
448                                 {\r
449                                         if(index >= 0)\r
450                                         {\r
451                                                 return collection[index + start];\r
452                                         }\r
453                                         throw new InvalidOperationException("Enumerator_MoveNext_Not_Called");\r
454                                 }\r
455                         }\r
456                 }\r
457 \r
458                 public string GetListName(PropertyDescriptor[] listAccessors)\r
459                 {\r
460                         return String.Empty;\r
461                 }\r
462 \r
463                 public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)\r
464                 {\r
465                         if(dataSource != null)\r
466                         {\r
467                                 if(dataSource is ITypedList)\r
468                                 {\r
469                                         return ((ITypedList)dataSource).GetItemProperties(listAccessors);\r
470                                 }\r
471                         }\r
472                         return null;\r
473                 }\r
474         }\r
475 }\r