using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ScrewTurn.Wiki { public partial class PageSelector : System.Web.UI.UserControl { private const string ItemCountName = "IC"; private const string PageSizeName = "PS"; private const string SelectedPageName = "SP"; private int itemCount = 0; private int pageSize = 50; private int selectedPage = 0; protected void Page_Load(object sender, EventArgs e) { // Load data from ViewState object temp = ViewState[ItemCountName]; if(temp != null) { itemCount = (int)temp; } temp = ViewState[PageSizeName]; if(temp != null) { pageSize = (int)temp; } temp = ViewState[SelectedPageName]; if(temp != null) { selectedPage = (int)temp; } RenderPages(); } /// /// Gets or sets the item count. /// public int ItemCount { get { return itemCount; } set { if(value < 0) throw new ArgumentException("Item Count must be greater than or equal to zero", "value"); itemCount = value; ViewState[ItemCountName] = value; RenderPages(); } } /// /// Gets or sets the page size. /// public int PageSize { get { return pageSize; } set { if(value <= 0) throw new ArgumentException("Page Size must be greater than zero", "value"); pageSize = value; ViewState[PageSizeName] = value; RenderPages(); } } /// /// Gets or sets the selected page (0..N). /// public int SelectedPage { get { return selectedPage; } private set { int dummy; if(value < 0 || value > CountPages(out dummy) - 1) throw new ArgumentException("Invalid Page", "value"); selectedPage = value; ViewState[SelectedPageName] = value; } } /// /// Gets the size of the selected page. /// public int SelectedPageSize { get { int pageCount; int lastPageSize; pageCount = CountPages(out lastPageSize); int selectedPageItemCount = (selectedPage == pageCount - 1) ? lastPageSize : pageSize; return selectedPageItemCount; } } /// /// Gets the number of pages needed to display the current items. /// /// The size of the last page. /// The number of pages. private int CountPages(out int lastPageSize) { int pageCount = itemCount / pageSize; lastPageSize = itemCount - (pageCount * pageSize); return pageCount + 1; } /// /// Renders the pages. /// private void RenderPages() { int pageCount; int lastPageSize; pageCount = CountPages(out lastPageSize); List result = new List(pageCount); for(int i = 0; i < pageCount - 1; i++) { result.Add(new ItemBlockRow(i, i * pageSize, pageSize, selectedPage == i)); } result.Add(new ItemBlockRow(pageCount - 1, (pageCount - 1) * pageSize, lastPageSize, selectedPage == pageCount - 1)); // Don't display anything if there is only one page if(result.Count > 1) { rptPages.DataSource = result; } else { rptPages.DataSource = new List(); } rptPages.DataBind(); } /// /// Selects a page. /// /// The page (0..N). public void SelectPage(int page) { rptPages_ItemCommand(this, new CommandEventArgs("Select", page.ToString())); } protected void rptPages_ItemCommand(object sender, CommandEventArgs e) { if(e.CommandName == "Select") { int selectedPage = int.Parse((string)e.CommandArgument); int pageCount; int lastPageSize; pageCount = CountPages(out lastPageSize); int selectedPageItemCount = (selectedPage == pageCount - 1) ? lastPageSize : pageSize; SelectedPage = selectedPage; RenderPages(); if(SelectedPageChanged != null) { SelectedPageChanged(this, new SelectedPageChangedEventArgs(selectedPage, selectedPageItemCount)); } } } /// /// Event fired when the selected page has changed. /// public event EventHandler SelectedPageChanged; } /// /// Represents a page of items for display purposes. /// public class ItemBlockRow { private string page; private string text; private bool selected; /// /// Initializes a new instance of the class. /// /// The page number. /// The number of the first item /// The number of items. /// A value indicating whether the page is selected. public ItemBlockRow(int page, int begin, int size, bool selected) { this.page = page.ToString(); this.text = (begin + 1).ToString() + "-" + (begin + size).ToString(); this.selected = selected; } /// /// Gets the page. /// public string Page { get { return page; } } /// /// Gets the text. /// public string Text { get { return text; } } /// /// Gets a value indicating whether the page is selected. /// public bool Selected { get { return selected; } } } /// /// Contains arguments for the SelectedPageChanged event. /// public class SelectedPageChangedEventArgs : EventArgs { private int selectedPage; private int itemCount; /// /// Initializes a new instance of the class. /// /// The sepected page (0..N). /// The number of items in the page. public SelectedPageChangedEventArgs(int selectedPage, int itemCount) { this.selectedPage = selectedPage; this.itemCount = itemCount; } /// /// Gets the selected page (0..N). /// public int SelectedPage { get { return selectedPage; } } /// /// Gets the item count. /// public int ItemCount { get { return itemCount; } } } }