You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			245 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //
 | |
| // System.Web.UI.WebControls.ListView
 | |
| //
 | |
| // Authors:
 | |
| //   Marek Habersack (mhabersack@novell.com)
 | |
| //
 | |
| // (C) 2007-2008 Novell, Inc
 | |
| //
 | |
| 
 | |
| //
 | |
| // 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;
 | |
| using System.Collections;
 | |
| using System.ComponentModel;
 | |
| 
 | |
| namespace System.Web.UI.WebControls
 | |
| {
 | |
| 	public class ListViewPagedDataSource : ICollection, IEnumerable, ITypedList
 | |
| 	{
 | |
| 		sealed class ListEnumerator : IEnumerator
 | |
| 		{
 | |
| 			int index;
 | |
| 			int startIndex;
 | |
| 			int end;
 | |
| 			IList list;
 | |
| 			
 | |
| 			public object Current {
 | |
| 				get { return list [startIndex + index]; }
 | |
| 			}
 | |
| 			
 | |
| 			public ListEnumerator (IList list, int startIndex, int end)
 | |
| 			{
 | |
| 				this.list = list;
 | |
| 				this.index = -1;
 | |
| 				this.startIndex = startIndex;
 | |
| 				this.end = startIndex + end;
 | |
| 			}
 | |
| 			
 | |
| 			public bool MoveNext ()
 | |
| 			{
 | |
| 				index++;
 | |
| 				return (startIndex + index) < end;
 | |
| 			}
 | |
| 
 | |
| 			// See:
 | |
| 			// http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listviewpageddatasource.getenumerator.aspx
 | |
| 			// (Note 1)
 | |
| 			public void Reset ()
 | |
| 			{
 | |
| 				index = -1;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		sealed class CollectionEnumerator : IEnumerator
 | |
| 		{
 | |
| 			int index;
 | |
| 			int startIndex;
 | |
| 			int end;
 | |
| 			ICollection collection;
 | |
| 			IEnumerator enumerator;
 | |
| 			
 | |
| 			public object Current {
 | |
| 				get {
 | |
| 					if (enumerator != null)
 | |
| 						return enumerator.Current;
 | |
| 
 | |
| 					return null;
 | |
| 				}
 | |
| 			}
 | |
| 			
 | |
| 			public CollectionEnumerator (ICollection collection, int startIndex, int end)
 | |
| 			{
 | |
| 				this.collection = collection;
 | |
| 				this.index = -1;
 | |
| 				this.startIndex = startIndex;
 | |
| 				this.end = end;
 | |
| 			}
 | |
| 			
 | |
| 			public bool MoveNext ()
 | |
| 			{
 | |
| 				if (enumerator == null) {
 | |
| 					enumerator = collection.GetEnumerator ();
 | |
| 					for (int i = 0; i < startIndex; i++)
 | |
| 						enumerator.MoveNext ();
 | |
| 				}
 | |
| 				
 | |
| 				index++;
 | |
| 				enumerator.MoveNext ();
 | |
| 				return (startIndex + index) < end;
 | |
| 			}
 | |
| 
 | |
| 			// See:
 | |
| 			// http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listviewpageddatasource.getenumerator.aspx
 | |
| 			// (Note 1)
 | |
| 			public void Reset ()
 | |
| 			{
 | |
| 				index = -1;
 | |
| 				enumerator = null;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		public ListViewPagedDataSource ()
 | |
| 		{
 | |
| 			StartRowIndex = 0;
 | |
| 			MaximumRows = 0;
 | |
| 			AllowServerPaging = false;
 | |
| 			TotalRowCount = 0;
 | |
| 		}
 | |
| 		
 | |
| 		public void CopyTo (Array array, int index)
 | |
| 		{
 | |
| 		}
 | |
| 		
 | |
| 		public IEnumerator GetEnumerator ()
 | |
| 		{
 | |
| 			IEnumerable ds = DataSource;
 | |
| 
 | |
| 			if (ds == null)
 | |
| 				return null;
 | |
| 
 | |
| 			IList list = ds as IList;
 | |
| 			if (list != null)
 | |
| 				return new ListEnumerator (list, AllowServerPaging ? 0 : StartRowIndex, Count);
 | |
| 
 | |
| 			ICollection collection = ds as ICollection;
 | |
| 			if (collection != null)
 | |
| 				return new CollectionEnumerator (collection, AllowServerPaging ? 0 : StartRowIndex, Count);
 | |
| 			
 | |
| 			return ds.GetEnumerator ();
 | |
| 		}
 | |
| 		
 | |
| 		public PropertyDescriptorCollection GetItemProperties (PropertyDescriptor [] listAccessors)
 | |
| 		{
 | |
| 			IEnumerable ds = DataSource;
 | |
| 
 | |
| 			if (ds == null || !(ds is ITypedList))
 | |
| 				return null;
 | |
| 
 | |
| 			return ((ITypedList) ds).GetItemProperties (listAccessors);
 | |
| 		}
 | |
| 		
 | |
| 		public string GetListName (PropertyDescriptor [] listAccessors)
 | |
| 		{
 | |
| 			return String.Empty;
 | |
| 		}
 | |
| 		
 | |
| 		public bool AllowServerPaging {
 | |
| 			get;
 | |
| 			set;
 | |
| 		}
 | |
| 		
 | |
| 		public int Count {
 | |
| 			get {
 | |
| 				IEnumerable ds = DataSource;
 | |
| 				if (ds == null)
 | |
| 					return 0;
 | |
| 
 | |
| 				bool onLastPage = OnLastPage;
 | |
| 				int maxRows = MaximumRows;
 | |
| 				if (!onLastPage && maxRows >= 0)
 | |
| 					return maxRows;
 | |
| 
 | |
| 				// LAMESPEC: MSDN says that DataSourceCount should be subtracted
 | |
| 				// from StartRowIndex
 | |
| 				return DataSourceCount - StartRowIndex;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		public IEnumerable DataSource {
 | |
| 			get;
 | |
| 			set;
 | |
| 		}
 | |
| 		
 | |
| 		public int DataSourceCount {
 | |
| 			get {
 | |
| 				IEnumerable ds = DataSource;
 | |
| 				if (ds == null)
 | |
| 					return 0;
 | |
| 
 | |
| 				if (!(ds is ICollection))
 | |
| 					throw new InvalidOperationException ("The data source object does not implement the System.Collections..::.ICollection interface.");
 | |
| 
 | |
| 				if (IsServerPagingEnabled)
 | |
| 					return TotalRowCount;				
 | |
| 
 | |
| 				return ((ICollection) ds).Count;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		public bool IsReadOnly {
 | |
| 			get { return false; }
 | |
| 		}
 | |
| 		
 | |
| 		public bool IsServerPagingEnabled {
 | |
| 			get { return AllowServerPaging; }
 | |
| 		}
 | |
| 		
 | |
| 		public bool IsSynchronized {
 | |
| 			get { return false; }
 | |
| 		}
 | |
| 		
 | |
| 		public int MaximumRows {
 | |
| 			get;
 | |
| 			set;
 | |
| 		}
 | |
| 		
 | |
| 		public int StartRowIndex {
 | |
| 			get;
 | |
| 			set;
 | |
| 		}
 | |
| 		
 | |
| 		public object SyncRoot {
 | |
| 			get { return this; }
 | |
| 		}
 | |
| 		
 | |
| 		public int TotalRowCount {
 | |
| 			get;
 | |
| 			set;
 | |
| 		}
 | |
| 
 | |
| 		bool OnLastPage {
 | |
| 			get { return ((StartRowIndex + MaximumRows) >= DataSourceCount); }
 | |
| 		}
 | |
| 		
 | |
| 	}
 | |
| }
 |