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; }
}
}
}