/*
ASP.NET UrlPager control
Copyright:2009-2010 Webdiyer (http://www.webdiyer.com)
Source code released under Ms-PL license
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Security.Permissions;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.Routing;
using System.Web.UI.WebControls;
namespace Webdiyer.WebControls
{
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
[DefaultProperty("PageSize")]
[DefaultEvent("PageChanged")]
[ParseChildren(false)]
[PersistChildren(false)]
[Designer(typeof(UrlPagerDesigner))]
[System.Drawing.ToolboxBitmap(typeof(UrlPager), "UrlPager.bmp")]
[ToolboxData("<{0}:UrlPager runat=server></{0}:UrlPager>")]
public partial class UrlPager : Panel
{
#region control rendering logic
public override void RenderBeginTag(HtmlTextWriter writer)
{
writer.WriteLine(CopyrightText);
base.RenderBeginTag(writer);
}
public override void RenderEndTag(HtmlTextWriter writer)
{
base.RenderEndTag(writer);
writer.WriteLine();
writer.Write(CopyrightText);
}
protected override void OnLoad(EventArgs e)
{
int pageIndex;
object obj = Page.RouteData.Values[PageIndexParameterName];
if (obj != null)
int.TryParse(obj.ToString(), out pageIndex);
else
int.TryParse(Page.Request.QueryString[PageIndexParameterName], out pageIndex);
if (pageIndex > 1)
CurrentPageIndex = pageIndex;
if (!Page.IsPostBack)
OnPageChanged(EventArgs.Empty);
base.OnLoad(e);
}
protected override void RenderContents(HtmlTextWriter output)
{
if (PageCount <= NumericPagerItemCount && AutoHide)
return;
output.Indent = 0;
if (RouteValues == null)
RouteValues = new RouteValueDictionary();
if (InheritsRouteValues)
{
var currentValue = Page.RouteData.Values;
if (currentValue != null && currentValue.Count > 0)
{
foreach (KeyValuePair<string, object> routeElement in currentValue)
{
if (!RouteValues.ContainsKey(routeElement.Key))
RouteValues.Add(routeElement.Key, routeElement.Value);
}
}
}
//this is an important trick, it's not the same as CurrentPageIndex-1
int startIndex = ((CurrentPageIndex - 1)/NumericPagerItemCount)*NumericPagerItemCount;
int endIndex = ((startIndex + NumericPagerItemCount) > PageCount)
? PageCount
: (startIndex + NumericPagerItemCount);
AddNavigationPageItem(output, 1, FirstPageText, PagerItemType.FirstPage);
AddNavigationPageItem(output, CurrentPageIndex - 1, PrevPageText, PagerItemType.PrevPage);
if (ShowMorePagerItems && startIndex > 0)
AddMorePageItem(output, startIndex);
if (AlwaysShowFirstLastPageNumber && startIndex > 1)
AddNumericPagerItem(output, 1);
if (ShowNumericPagerItems)
{
for (int i = startIndex + 1; i <= endIndex; i++)
{
AddNumericPagerItem(output, i);
}
}
if (ShowMorePagerItems && PageCount > NumericPagerItemCount && endIndex < PageCount)
AddMorePageItem(output, endIndex + 1);
if (AlwaysShowFirstLastPageNumber && endIndex < PageCount)
AddNumericPagerItem(output, PageCount);
AddNavigationPageItem(output, CurrentPageIndex + 1, NextPageText, PagerItemType.NextPage);
AddNavigationPageItem(output, PageCount, LastPageText, PagerItemType.LastPage);
}
private void AddNumericPagerItem(HtmlTextWriter writer, int pageIndex)
{
string linkText;
if (CurrentPageIndex == pageIndex)
{
linkText = CurrentPageNumberFormatString == null
? pageIndex.ToString()
: string.Format(CurrentPageNumberFormatString, pageIndex);
writer.Write(CurrentPagerItemWrapperFormatString == null
? linkText : string.Format(CurrentPagerItemWrapperFormatString, linkText));
}
else
{
linkText = PageNumberFormatString != null
? string.Format(PageNumberFormatString, pageIndex)
: pageIndex.ToString();
if (RouteValues.ContainsKey(PageIndexParameterName))
RouteValues[PageIndexParameterName] = pageIndex;
else
RouteValues.Add(PageIndexParameterName, pageIndex);
var itemBuilder = new StringBuilder("<a href=\"");
if (DesignMode)
itemBuilder.Append("http://en.webdiyer.com/");
else
itemBuilder.Append(GetRouteUrl(RouteName, RouteValues));
itemBuilder.Append("\">");
itemBuilder.Append(linkText);
itemBuilder.Append("</a>");
writer.Write(NumericPagerItemWrapperFormatString == null
? itemBuilder.ToString()
: string.Format(NumericPagerItemWrapperFormatString, itemBuilder));
}
}
private void AddMorePageItem(HtmlTextWriter writer, int pageIndex)
{
if (RouteValues.ContainsKey(PageIndexParameterName))
RouteValues[PageIndexParameterName] = pageIndex;
else
RouteValues.Add(PageIndexParameterName, pageIndex);
var itemBuilder = new StringBuilder("<a href=\"");
if (DesignMode)
itemBuilder.Append("http://en.webdiyer.com/");
else
itemBuilder.Append(GetRouteUrl(RouteName, RouteValues));
itemBuilder.Append("\">").Append(MorePageText);
itemBuilder.Append("</a>");
writer.Write(MorePagerItemWrapperFormatString == null
? itemBuilder.ToString()
: string.Format(MorePagerItemWrapperFormatString, itemBuilder));
}
private void AddNavigationPageItem(HtmlTextWriter writer, int pageIndex,
string linkText, PagerItemType pagerItemType)
{
if (!ShowFirstLast && (pagerItemType == PagerItemType.FirstPage ||
pagerItemType == PagerItemType.LastPage))
return;
if (!ShowPrevNext && (pagerItemType == PagerItemType.PrevPage ||
pagerItemType == PagerItemType.NextPage))
return;
string anchorElement;
bool disabled = false;
if (pagerItemType == PagerItemType.FirstPage || pagerItemType == PagerItemType.PrevPage)
{
if (CurrentPageIndex <= 1)
{
if (!ShowInactivePagerItems)
return;
disabled = true;
}
}
if (pagerItemType == PagerItemType.NextPage || pagerItemType == PagerItemType.LastPage)
{
if (CurrentPageIndex >= PageCount)
{
if (!ShowInactivePagerItems)
return;
disabled = true;
}
}
if (disabled)
anchorElement = string.Format("<a disabled=\"disabled\">{0}</a>", linkText);
else
{
if (RouteValues.ContainsKey(PageIndexParameterName))
RouteValues[PageIndexParameterName] = pageIndex;
else
RouteValues.Add(PageIndexParameterName, pageIndex);
anchorElement = string.Format("<a href=\"{0}\">{1}</a>",
DesignMode ? "http://en.webdiyer.com/" : GetRouteUrl(RouteName, RouteValues),
linkText);
}
writer.Write(NavigationPagerItemWrapperFormatString == null
? anchorElement
: string.Format(NavigationPagerItemWrapperFormatString, anchorElement));
}
#endregion
#region methods
protected virtual void OnPageChanged(EventArgs e)
{
var handler = (EventHandler)Events[EventPageChanged];
if (handler != null)
handler(this, e);
}
#endregion
#region events
public event EventHandler PageChanged
{
add
{
Events.AddHandler(EventPageChanged, value);
}
remove
{
Events.RemoveHandler(EventPageChanged, value);
}
}
#endregion
}
}