-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class: PagedDataSource\r
- * \r
- * Author: Gaurav Vaish\r
- * Maintainer: gvaish@iitk.ac.in\r
- * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
- * Implementation: yes\r
- * Status: 100%\r
- * \r
- * (C) Gaurav Vaish (2002)\r
- */\r
-\r
-using System;\r
-using System.ComponentModel;\r
-using System.Collections;\r
-using System.Web;\r
-using System.Web.UI;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
- public sealed class PagedDataSource : ICollection, IEnumerable, ITypedList\r
- {\r
- private int pageSize;\r
- private bool allowPaging;\r
- private int currentPageIndex;\r
- private bool allowCustomPaging;\r
- private int virtualCount;\r
-\r
- private IEnumerable dataSource;\r
-\r
- public PagedDataSource()\r
- {\r
- Initialize();\r
- }\r
- \r
- private void Initialize()\r
- {\r
- pageSize = 10;\r
- allowPaging = false;\r
- currentPageIndex = 0;\r
- allowCustomPaging = false;\r
- virtualCount = 0;\r
- }\r
- \r
- public bool AllowCustomPaging\r
- {\r
- get\r
- {\r
- return allowCustomPaging;\r
- }\r
- set\r
- {\r
- allowCustomPaging = value;\r
- }\r
- }\r
- \r
- public bool AllowPaging\r
- {\r
- get\r
- {\r
- return allowPaging;\r
- }\r
- set\r
- {\r
- allowPaging = value;\r
- }\r
- }\r
- \r
- public int Count\r
- {\r
- get\r
- {\r
- if(dataSource != null)\r
- {\r
- if(IsPagingEnabled)\r
- {\r
- return DataSourceCount;\r
- }\r
- if(IsCustomPagingEnabled)\r
- {\r
- return pageSize;\r
- }\r
- if(IsLastPage)\r
- {\r
- return (DataSourceCount - FirstIndexInPage);\r
- }\r
- return pageSize;\r
- }\r
- return 0;\r
- }\r
- }\r
- \r
- public int CurrentPageIndex\r
- {\r
- get\r
- {\r
- return currentPageIndex;\r
- }\r
- }\r
- \r
- public IEnumerable DataSource\r
- {\r
- get\r
- {\r
- return dataSource;\r
- }\r
- set\r
- {\r
- dataSource = value;\r
- }\r
- }\r
- \r
- public int DataSourceCount\r
- {\r
- get\r
- {\r
- if(dataSource != null)\r
- {\r
- if(IsCustomPagingEnabled)\r
- {\r
- return virtualCount;\r
- }\r
- if(dataSource is ICollection)\r
- {\r
- return ((ICollection)dataSource).Count;\r
- }\r
- throw new HttpException(HttpRuntime.FormatResourceString("PagedDataSource_Cannot_Get_Count"));\r
- }\r
- return 0;\r
- }\r
- }\r
- \r
- public int FirstIndexInPage\r
- {\r
- get\r
- {\r
- if(dataSource != null && IsPagingEnabled && IsCustomPagingEnabled)\r
- {\r
- return (currentPageIndex * pageSize);\r
- }\r
- return 0;\r
- }\r
- }\r
- \r
- public bool IsCustomPagingEnabled\r
- {\r
- get\r
- {\r
- return (IsPagingEnable && allowCustomPaging);\r
- }\r
- }\r
- \r
- public bool IsFirstPage\r
- {\r
- get\r
- {\r
- return (!IsPagingEnabled || (CurrentPageIndex == 0));\r
- }\r
- }\r
- \r
- public bool IsLastPage\r
- {\r
- get\r
- {\r
- return (!IsPagingEnabled || (CurrentPageIndex == PageCount));\r
- }\r
- }\r
- \r
- public bool IsPagingEnabled\r
- {\r
- get\r
- {\r
- return (allowPaging && pageSize != 0);\r
- }\r
- }\r
- \r
- public bool IsReadOnly\r
- {\r
- get\r
- {\r
- return false;\r
- }\r
- }\r
- \r
- public bool IsSynchronized\r
- {\r
- get\r
- {\r
- return false;\r
- }\r
- }\r
- \r
- public int PageCount\r
- {\r
- get\r
- {\r
- if(dataSource != null)\r
- {\r
- int total = DataSourceCount;\r
- if(!IsPagingEnabled)\r
- {\r
- return total;\r
- }\r
- return (total + pageSize - 1)/pageSize;\r
- }\r
- return 0;\r
- }\r
- }\r
- \r
- public int PageSize\r
- {\r
- get\r
- {\r
- return pageCount;\r
- }\r
- set\r
- {\r
- pageCount = value;\r
- }\r
- }\r
- \r
- public object SyncRoot\r
- {\r
- get\r
- {\r
- return this;\r
- }\r
- }\r
- \r
- public int VirtualCount\r
- {\r
- get\r
- {\r
- return virtualCount;\r
- }\r
- set\r
- {\r
- virtualCount = value;\r
- }\r
- }\r
- \r
- public void CopyTo(Array array, int index)\r
- {\r
- foreach(object current in this)\r
- {\r
- array.SetValue(array, index++);\r
- }\r
- }\r
- \r
- public IEnumerator GetEnumerator\r
- {\r
- int fInd = FirstIndexInPage;\r
- int count = -1;\r
- if(dataSource is ICollection)\r
- {\r
- count = dataSource.Count;\r
- }\r
-\r
- if(dataSource is IList)\r
- {\r
- return (new PrivateListEnumerator((IList)dataSource, fInd, count));\r
- }\r
- if(dataSource is Array)\r
- {\r
- return (new PrivateArrayEnumerator((object[])dataSource, fInd, count));\r
- }\r
- if(dataSource is ICollection)\r
- {\r
- return (new PrivateICollectionEnumerator((ICollection)dataSource, fInd, count));\r
- }\r
- if(allowCustomPaging)\r
- {\r
- return (new PrivateIEnumeratorEnumerator(dataSource, Count));\r
- }\r
- return dataSource.GetEnumerator();\r
- }\r
- \r
- private class PrivateIEnumeratorEnumerator\r
- {\r
- private int index;\r
- private int max;\r
-\r
- private IEnumerator enumerator;\r
- \r
- public PrivateIEnumeratorEnumerator(IEnumerator enumerator, int count)\r
- {\r
- this.enumerator = enumerator;\r
- index = -1;\r
- max = count;\r
- }\r
- \r
- public bool MoveNext()\r
- {\r
- enumerator.MoveNext();\r
- index++;\r
- return (index < max);\r
- }\r
-\r
- public void Reset()\r
- {\r
- index = -1;\r
- collEnum = null;\r
- }\r
-\r
- public object Current\r
- {\r
- get\r
- {\r
- return enumerator.Current;\r
- }\r
- }\r
- }\r
- \r
- private class PrivateICollectionEnumerator\r
- {\r
- private int index;\r
- private int start;\r
- private int max;\r
-\r
- private ICollection collection;\r
- private IEnumerator collEnum;\r
- \r
- public PrivateICollectionEnumerator(ICollection collection, int start, int count)\r
- {\r
- this.collection = collection;\r
- this.start = start;\r
- index = -1;\r
- max = start + count;\r
- if(max > collection.Count)\r
- {\r
- max = collection.Count;\r
- }\r
- }\r
- \r
- public bool MoveNext()\r
- {\r
- if(collEnum == null)\r
- {\r
- int cIndex = 0;\r
- collEnum = collection.GetEnumerator();\r
- while(cIndex < start)\r
- {\r
- collEnum.MoveNext();\r
- }\r
- }\r
- collEnum.MoveNext();\r
- index++;\r
- return (start + index < max);\r
- }\r
-\r
- public void Reset()\r
- {\r
- index = -1;\r
- collEnum = null;\r
- }\r
-\r
- public object Current\r
- {\r
- get\r
- {\r
- return collEnum.Current;\r
- }\r
- }\r
- }\r
- \r
- private class PrivateArrayEnumerator\r
- {\r
- private int index;\r
- private int start;\r
- private int max;\r
- private object[] values;\r
- \r
- public PrivateArrayEnumerator(object[] values, int start, int count)\r
- {\r
- this.values = values;\r
- this.start = start;\r
- index = -1;\r
- max = start + count;\r
- if(max > this.values.Length)\r
- {\r
- max = this.values.Length;\r
- }\r
- }\r
- \r
- public bool MoveNext()\r
- {\r
- index++;\r
- return (index + start < max);\r
- }\r
-\r
- public void Reset()\r
- {\r
- index = -1;\r
- }\r
-\r
- public object Current\r
- {\r
- get\r
- {\r
- if(index >= 0)\r
- {\r
- return values[index + start];\r
- }\r
- throw new InvalidOperationException("Enumerator_MoveNext_Not_Called");\r
- }\r
- }\r
- }\r
- \r
- private class PrivateListEnumerator : IEnumerator\r
- {\r
- private int index;\r
- private int start;\r
- private int max;\r
- private IList collection;\r
-\r
- public PrivateListEnumerator(IList list, int start, int count)\r
- {\r
- collection = list;\r
- this.start = start;\r
- index = -1;\r
- max = start + count;\r
- if(max > list.Count)\r
- {\r
- max = list.Count;\r
- }\r
- }\r
- \r
- public bool MoveNext()\r
- {\r
- index++;\r
- return (index + start < max);\r
- }\r
- \r
- public void Reset()\r
- {\r
- index = -1;\r
- }\r
- \r
- public object Current\r
- {\r
- get\r
- {\r
- if(index >= 0)\r
- {\r
- return collection[index + start];\r
- }\r
- throw new InvalidOperationException("Enumerator_MoveNext_Not_Called");\r
- }\r
- }\r
- }\r
- }\r
-}\r
+// System.Web.UI.WebControls.PagedDataSource.cs
+//
+// Author: Duncan Mak (duncan@novell.com)
+// Jackson Harper (jackson@ximian.com)
+//
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Collections;
+using System.ComponentModel;
+using System.Security.Permissions;
+
+namespace System.Web.UI.WebControls {
+
+ // CAS - no inheritance demand required because the class is sealed
+ [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+ public sealed class PagedDataSource : ICollection, IEnumerable, ITypedList
+ {
+ int page_size, current_page_index, virtual_count;
+ bool allow_paging, allow_custom_paging, allow_server_paging;
+ IEnumerable source;
+
+ public PagedDataSource ()
+ {
+ page_size = 10;
+ }
+
+ public bool AllowCustomPaging {
+ get { return allow_custom_paging; }
+ set {
+ allow_custom_paging = value;
+#if NET_2_0
+ // AllowCustomPaging and AllowServerPaging are mutually exclusive
+ if (allow_custom_paging)
+ allow_server_paging = false;
+#endif
+ }
+ }
+
+ public bool AllowPaging {
+ get { return allow_paging; }
+ set { allow_paging = value; }
+ }
+
+ public int Count {
+ get {
+ if (source == null)
+ return 0;
+
+ if (IsPagingEnabled) {
+ if (IsCustomPagingEnabled || !IsLastPage)
+ return page_size;
+ return DataSourceCount - FirstIndexInPage;
+ }
+
+ return DataSourceCount;
+ }
+ }
+
+ public int CurrentPageIndex {
+ get { return current_page_index; }
+ set { current_page_index = value; }
+ }
+
+ public IEnumerable DataSource {
+ get { return source; }
+ set { source = value; }
+ }
+
+ public int DataSourceCount {
+ get {
+ if (source == null)
+ return 0;
+
+ if (IsCustomPagingEnabled
+#if NET_2_0
+ || IsServerPagingEnabled
+#endif
+ )
+ return virtual_count;
+
+ if (source is ICollection)
+ return ((ICollection) source).Count;
+
+ throw new HttpException ("The data source must implement ICollection");
+ }
+ }
+
+ public int FirstIndexInPage {
+ get {
+ if (!IsPagingEnabled || IsCustomPagingEnabled ||
+#if NET_2_0
+ IsServerPagingEnabled ||
+#endif
+ source == null)
+ return 0;
+
+ return current_page_index * page_size;
+ }
+ }
+
+ public bool IsCustomPagingEnabled {
+ get { return IsPagingEnabled && allow_custom_paging; }
+ }
+
+#if NET_2_0
+ public bool IsServerPagingEnabled {
+ get { return IsPagingEnabled && allow_server_paging; }
+ }
+#endif
+
+ public bool IsFirstPage {
+ get {
+ if (!allow_paging)
+ return true;
+
+ return current_page_index == 0;
+ }
+ }
+
+ public bool IsLastPage {
+ get {
+ if (!allow_paging || page_size == 0)
+ return true;
+
+ return (current_page_index == (PageCount - 1));
+ }
+ }
+
+ public bool IsPagingEnabled {
+ get { return (allow_paging && page_size != 0); }
+ }
+
+ public bool IsReadOnly {
+ get { return false; } // as documented
+ }
+
+ public bool IsSynchronized {
+ get { return false; } // as documented
+ }
+
+ public int PageCount {
+ get {
+ if (source == null)
+ return 0;
+
+ if (!IsPagingEnabled || DataSourceCount == 0 || page_size == 0)
+ return 1;
+
+ return (DataSourceCount + page_size - 1) / page_size;
+ }
+ }
+
+ public int PageSize {
+ get { return page_size; }
+ set { page_size = value; }
+ }
+
+ public object SyncRoot {
+ get { return this; }
+ }
+
+ public int VirtualCount {
+ get { return virtual_count; }
+ set { virtual_count = value; }
+ }
+#if NET_2_0
+ public bool AllowServerPaging {
+ get {
+ return allow_server_paging;
+ }
+ set {
+ allow_server_paging = value;
+ // AllowCustomPaging and AllowServerPaging are mutually exclusive
+ if (allow_server_paging)
+ allow_custom_paging = false;
+ }
+ }
+#endif
+
+ public void CopyTo (Array array, int index)
+ {
+ foreach (object o in source)
+ array.SetValue (o, index++);
+ }
+
+ public IEnumerator GetEnumerator ()
+ {
+ // IList goes first, as it implements ICollection
+ IList list = source as IList;
+ int first = 0;
+ int count;
+ int limit;
+ if (list != null) {
+ first = FirstIndexInPage;
+ count = ((ICollection) source).Count;
+ limit = ((first + page_size) > count) ? (count - first) : page_size;
+ return GetListEnum (list, first, first + limit);
+ }
+
+ ICollection col = source as ICollection;
+ if (col != null) {
+ first = FirstIndexInPage;
+ count = col.Count;
+ limit = ((first + page_size) > count) ? (count - first) : page_size;
+ return GetEnumeratorEnum (col.GetEnumerator (), first, first + page_size);
+ }
+
+ return source.GetEnumerator ();
+ }
+
+ public PropertyDescriptorCollection GetItemProperties (PropertyDescriptor [] list_accessors)
+ {
+ ITypedList typed = source as ITypedList;
+ if (typed == null)
+ return null;
+ return typed.GetItemProperties (list_accessors);
+ }
+
+ public string GetListName (PropertyDescriptor [] list_accessors)
+ {
+ return String.Empty; // as documented
+ }
+
+#if TARGET_JVM
+ internal class ListEnum : IEnumerator
+ {
+ int start;
+ int end;
+ int ind;
+ IList list;
+
+ internal ListEnum(IList list, int start, int end)
+ {
+ this.list = list;
+ this.start = start;
+ this.end = end;
+ this.ind = start - 1;
+ }
+
+ public bool MoveNext()
+ {
+ ind++;
+ return (ind < end);
+ }
+
+ public void Reset() { ind = start - 1; }
+ public object Current { get { return list[ind]; }}
+ }
+
+ private IEnumerator GetListEnum (IList list, int start, int end)
+ {
+ if (!allow_paging)
+ end = list.Count;
+ return new ListEnum(list, start, end);
+ }
+
+ internal class EnumeratorEnum : IEnumerator
+ {
+ int start;
+ int end;
+ int ind;
+ IEnumerator en;
+ PagedDataSource parent;
+
+ internal EnumeratorEnum(PagedDataSource parent, IEnumerator en, int start, int end)
+ {
+ this.parent = parent;
+ this.en = en;
+ this.start = start;
+ this.end = end;
+ this.ind = start - 1;
+ for (int i = 0; i < start; i++)
+ en.MoveNext ();
+ }
+
+ public bool MoveNext()
+ {
+ ind++;
+ return (!parent.allow_paging || ind < end) && en.MoveNext ();
+ }
+
+ public void Reset()
+ {
+ throw new NotSupportedException();
+ }
+
+ public object Current { get { return en.Current; }}
+ }
+
+ private IEnumerator GetEnumeratorEnum (IEnumerator e, int start, int end)
+ {
+ return new EnumeratorEnum(this, e, start, end);
+ }
+#else
+ private IEnumerator GetListEnum (IList list, int start, int end)
+ {
+ if (!AllowPaging)
+ end = list.Count;
+ else if (start >= list.Count)
+ yield break;
+
+ for (int i = start; i < end; i++)
+ yield return list [i];
+ }
+
+ private IEnumerator GetEnumeratorEnum (IEnumerator e, int start, int end)
+ {
+ for (int i = 0; i < start; i++)
+ e.MoveNext ();
+ for (int i = start; (!allow_paging || i < end) && e.MoveNext (); i++)
+ yield return e.Current;
+ }
+#endif
+ }
+}
+