#region Apache Notice /***************************************************************************** * $Header: $ * $Revision: $ * $Date: $ * * iBATIS.NET Data Mapper * Copyright (C) 2004 - Gilles Bayon * * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ********************************************************************************/ #endregion #region Imports using System; using System.Collections; #endregion namespace IBatisNet.Common.Pagination { /// /// Summary description for PaginatedArrayList. /// public class PaginatedArrayList: IPaginatedList { #region Fields private static ArrayList _emptyList = new ArrayList(); private int _pageSize = 0; private int _pageIndex = 0; private IList _list = null; private IList _page = null; #endregion #region Properties /// /// /// public bool IsEmpty { get { return (_page.Count == 0); } } #endregion #region Constructor (s) / Destructor /// /// /// /// public PaginatedArrayList(int pageSize) { _pageSize = pageSize; _pageIndex = 0; _list = new ArrayList(); Repaginate(); } /// /// /// /// /// public PaginatedArrayList(int initialCapacity, int pageSize) { _pageSize = pageSize; _pageIndex = 0; _list = new ArrayList(initialCapacity); Repaginate(); } /// /// /// /// /// public PaginatedArrayList(ICollection c, int pageSize) { _pageSize = pageSize; _pageIndex = 0; _list = new ArrayList(c); Repaginate(); } #endregion #region Methods /// /// /// private void Repaginate() { if (_list.Count==0) { _page = _emptyList; } else { int start = _pageIndex * _pageSize; int end = start + _pageSize - 1; if (end >= _list.Count) { end = _list.Count - 1; } if (start >= _list.Count) { _pageIndex = 0; Repaginate(); } else if (start < 0) { _pageIndex = _list.Count / _pageSize; if (_list.Count % _pageSize == 0) { _pageIndex--; } Repaginate(); } else { _page = SubList(_list, start, end + 1); } } } /// /// Provides a view of the IList pramaeter /// from the specified position /// to the specified position . /// /// The IList elements. /// Starting position for the view of elements. /// Ending position for the view of elements. /// A view of list. /// /// /// The list that is returned is just a view, it is still backed /// by the orignal list. Any changes you make to it will be /// reflected in the orignal list. /// private IList SubList(IList list, int fromIndex, int toIndex) { return ((ArrayList)list).GetRange(fromIndex, toIndex-fromIndex); } #endregion #region IPaginatedList Members /// /// /// public int PageSize { get { return _pageSize; } } /// /// /// public bool IsFirstPage { get { return (_pageIndex == 0); } } /// /// /// public bool IsMiddlePage { get { return !(this.IsFirstPage || this.IsLastPage); } } /// /// /// public bool IsLastPage { get { return _list.Count - ((_pageIndex + 1) * _pageSize) < 1; } } /// /// /// public bool IsNextPageAvailable { get { return !this.IsLastPage; } } /// /// /// public bool IsPreviousPageAvailable { get { return !this.IsFirstPage; } } /// /// /// /// public bool NextPage() { if (this.IsNextPageAvailable) { _pageIndex++; Repaginate(); return true; } else { return false; } } /// /// /// /// public bool PreviousPage() { if (this.IsPreviousPageAvailable) { _pageIndex--; Repaginate(); return true; } else { return false; } } /// /// /// /// public void GotoPage(int pageIndex) { _pageIndex = pageIndex; Repaginate(); } /// /// /// public int PageIndex { get { return _pageIndex; } } #endregion #region IList Members /// /// /// public bool IsReadOnly { get { return _list.IsReadOnly; } } /// /// /// public object this[int index] { get { return _page[index]; } set { _list[index] = value; Repaginate(); } } /// /// /// /// public void RemoveAt(int index) { _list.RemoveAt(index); Repaginate(); } /// /// /// /// /// public void Insert(int index, object value) { _list.Insert(index, value); Repaginate(); } /// /// /// /// public void Remove(object value) { _list.Remove(value); Repaginate(); } /// /// /// /// /// public bool Contains(object value) { return _page.Contains(value); } /// /// /// public void Clear() { _list.Clear(); Repaginate(); } /// /// /// /// /// public int IndexOf(object value) { return _page.IndexOf(value); } /// /// /// /// /// public int Add(object value) { int i = _list.Add(value); Repaginate(); return i; } /// /// /// public bool IsFixedSize { get { return _list.IsFixedSize; } } #endregion #region ICollection Members /// /// /// public bool IsSynchronized { get { return _page.IsSynchronized; } } /// /// /// public int Count { get { return _page.Count; } } /// /// /// /// /// public void CopyTo(Array array, int index) { _page.CopyTo(array, index); } /// /// /// public object SyncRoot { get { return _page.SyncRoot; } } #endregion #region IEnumerable Members /// /// /// /// public IEnumerator GetEnumerator() { return _page.GetEnumerator(); } #endregion #region IEnumerator Members /// /// Sets the enumerator to its initial position, /// which is before the first element in the collection. /// public void Reset() { _page.GetEnumerator().Reset(); } /// /// Gets the current element in the page. /// public object Current { get { return _page.GetEnumerator().Current; } } /// /// Advances the enumerator to the next element of the collection. /// /// /// true if the enumerator was successfully advanced to the next element; /// false if the enumerator has passed the end of the collection. /// public bool MoveNext() { return _page.GetEnumerator().MoveNext(); } #endregion } }