using System; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Data; using System.Collections; using System.Collections.Specialized; namespace UDDI.VisualStudio { internal struct PageInfo { public PageInfo( bool showEllipses, bool isCurrentPage, int pageNumber ) { this.showEllipses = showEllipses; this.isCurrentPage = isCurrentPage; this.pageNumber = pageNumber; } public bool showEllipses; public bool isCurrentPage; public int pageNumber; } internal class PagingRenderer { private ArrayList pageRange; private int numResults; private int currentPage; private string parentUrl; public PagingRenderer( int numResults, int currentPage, string parentUrl ) { this.numResults = numResults; this.currentPage = currentPage; this.parentUrl = parentUrl; pageRange = new ArrayList(); // // Get the number of pages of results we have // int numPages = ( int ) Math.Ceiling( ( double ) Decimal.Divide( ( Decimal )numResults, ( Decimal )Constants.NumResultsPerPage ) ); // // Start our loop at the current page. Add the current page, the move forward adding pages. We will keep adding // pages until we have added the number of pages specified by Constants.MaxPagesToShow or we run out of pages to add. // If we have more pages to add after we reach Constants.MaxPagesToShow, we'll start working our way back from the current // page. // int forwardIndex = 0; int backIndex = currentPage - 1; int numPagesAdded = 0; while( numPagesAdded < Constants.MaxPagesToShow && numPagesAdded < numPages) { if( currentPage + forwardIndex <= numPages ) { // // The first page added will always be the current page // pageRange.Add( new PageInfo(false, forwardIndex == 0 , currentPage + forwardIndex ) ); forwardIndex++; } else { pageRange.Insert( 0, new PageInfo( false, false, backIndex ) ); backIndex--; } numPagesAdded++; } if( pageRange.Count > 0 ) { PageInfo lastPage = ( PageInfo )pageRange[ pageRange.Count - 1]; if( lastPage.pageNumber != numPages ) { pageRange.Add( new PageInfo( true, false, lastPage.pageNumber + 1 ) ); } PageInfo firstPage = ( PageInfo )pageRange[ 0 ]; if( firstPage.pageNumber != 1 ) { pageRange.Insert( 0, new PageInfo( true, false, firstPage.pageNumber - 1 ) ); } } } /// /// This method will render the row of page numbers that link to the pages of our request. This method assumes it is /// being called in the context of a HTML table. It will add rows to that table. /// /// Writer to use to write out our HTML. public void Render( HtmlTextWriter writer ) { writer.RenderBeginTag( HtmlTextWriterTag.Table ); writer.RenderBeginTag( HtmlTextWriterTag.Tr ); foreach( PageInfo pageInfo in pageRange ) { if( true == pageInfo.showEllipses ) { writer.RenderBeginTag( HtmlTextWriterTag.Td ); RenderEllipses( pageInfo.pageNumber, writer ); writer.RenderEndTag(); } else { writer.RenderBeginTag( HtmlTextWriterTag.Td ); if( true == pageInfo.isCurrentPage ) { RenderCurrentPageLink( writer ); } else { RenderPageLink( pageInfo.pageNumber, writer ); } writer.RenderEndTag(); } } writer.RenderEndTag(); writer.RenderEndTag(); } /// /// This method will render a previous or next ellipses in our row of page numbers. This is done so we can limit the number /// of pages to show in that row. /// /// The page number to link the ellipses to. /// Writer to use to write our HTML. private void RenderEllipses( int pageNumber, HtmlTextWriter writer) { string pageLink = string.Format( "{0}?{1}={2}", parentUrl, StateParamNames.CurrentPage, pageNumber ); pageLink += GetKeyedRefData(); writer.AddAttribute( HtmlTextWriterAttribute.Href, pageLink ); writer.RenderBeginTag( HtmlTextWriterTag.A ); writer.Write( "..." ); writer.RenderEndTag(); } /// /// This method will render a page number. /// /// Page number to render. /// Writer to use to write our HTML. private void RenderPageLink( int pageNumber, HtmlTextWriter writer ) { string pageLink = string.Format( "{0}?{1}={2}", parentUrl, StateParamNames.CurrentPage, pageNumber ); pageLink += GetKeyedRefData(); writer.AddAttribute( HtmlTextWriterAttribute.Class, "boldBlue" ); writer.AddAttribute( HtmlTextWriterAttribute.Href, pageLink ); writer.RenderBeginTag( HtmlTextWriterTag.A ); writer.Write( pageNumber ); writer.RenderEndTag(); } /// /// Renders the 'current' page. This page number will not be a link. /// /// Writer to use to write our HTML. private void RenderCurrentPageLink( HtmlTextWriter writer ) { writer.AddAttribute( HtmlTextWriterAttribute.Class, "A.navbold" ); writer.RenderBeginTag( HtmlTextWriterTag.Span ); writer.Write( currentPage ); writer.RenderEndTag(); } private string GetKeyedRefData() { if( !Utility.StringEmpty( HttpContext.Current.Request[ StateParamNames.TModelKey ] ) ) { string urlext = "&{0}={1}&{2}={3}"; return string.Format( urlext, StateParamNames.TModelKey, HttpContext.Current.Request[ StateParamNames.TModelKey ], StateParamNames.KeyValue, HttpContext.Current.Request[ StateParamNames.KeyValue ] ); } else { return string.Empty; } } } }