<?php
|
|
class QPaginator extends QPaginatorBase {
|
|
// APPEARANCE
|
|
protected $intIndexCount = 10;
|
|
|
|
protected $strLabelForPrevious;
|
|
protected $strLabelForNext;
|
|
|
|
protected $strCssClass = 'paginator';
|
|
|
|
//////////
|
|
// Methods
|
|
//////////
|
|
public function __construct($objParentObject, $strControlId = null) {
|
|
parent::__construct($objParentObject, $strControlId);
|
|
|
|
$this->strLabelForPrevious = QApplication::Translate('Previous');
|
|
$this->strLabelForNext = QApplication::Translate('Next');
|
|
}
|
|
|
|
public function GetControlHtml() {
|
|
$this->objPaginatedControl->DataBind();
|
|
|
|
$strStyle = $this->GetStyleAttributes();
|
|
if ($strStyle)
|
|
$strStyle = sprintf(' style="%s"', $strStyle);
|
|
|
|
$strToReturn = sprintf('<span id="%s" %s%s>', $this->strControlId, $strStyle, $this->GetAttributes(true, false));
|
|
|
|
if ($this->intPageNumber <= 1)
|
|
$strToReturn .= sprintf('<span class="arrow">%s</span>', $this->strLabelForPrevious);
|
|
else {
|
|
$this->strActionParameter = $this->intPageNumber - 1;
|
|
$strToReturn .= sprintf('<span class="arrow"><a href="" %s>%s</a></span>',
|
|
$this->GetActionAttributes(), $this->strLabelForPrevious);
|
|
}
|
|
|
|
$strToReturn .= '<span class="break">|</span>';
|
|
|
|
if ($this->PageCount <= $this->intIndexCount) {
|
|
// We have less pages than total indexcount -- so let's go ahead
|
|
// and just display all page indexes
|
|
for ($intIndex = 1; $intIndex <= $this->PageCount; $intIndex++) {
|
|
if ($this->intPageNumber == $intIndex) {
|
|
$strToReturn .= sprintf('<span class="selected">%s</span>', $intIndex);
|
|
} else {
|
|
$this->strActionParameter = $intIndex;
|
|
$strToReturn .= sprintf('<span class="page"><a href="" %s>%s</a></span>',
|
|
$this->GetActionAttributes(), $intIndex);
|
|
}
|
|
}
|
|
} else {
|
|
// Figure Out Constants
|
|
|
|
/**
|
|
* "Bunch" is defined as the collection of numbers that lies in between the pair of Ellipsis ("...")
|
|
*
|
|
* LAYOUT
|
|
*
|
|
* For IndexCount of 10
|
|
* 2 213 2 (two items to the left of the bunch, and then 2 indexes, selected index, 3 indexes, and then two items to the right of the bunch)
|
|
* e.g. 1 ... 5 6 *7* 8 9 10 ... 100
|
|
*
|
|
* For IndexCount of 11
|
|
* 2 313 2
|
|
*
|
|
* For IndexCount of 12
|
|
* 2 314 2
|
|
*
|
|
* For IndexCount of 13
|
|
* 2 414 2
|
|
*
|
|
* For IndexCount of 14
|
|
* 2 415 2
|
|
*
|
|
*
|
|
*
|
|
* START/END PAGE NUMBERS FOR THE BUNCH
|
|
*
|
|
* For IndexCount of 10
|
|
* 1 2 3 4 5 6 7 8 .. 100
|
|
* 1 .. 4 5 *6* 7 8 9 .. 100
|
|
* 1 .. 92 93 *94* 95 96 97 .. 100
|
|
* 1 .. 93 94 95 96 97 98 99 100
|
|
*
|
|
* For IndexCount of 11
|
|
* 1 2 3 4 5 6 7 8 9 .. 100
|
|
* 1 .. 4 5 6 *7* 8 9 10 .. 100
|
|
* 1 .. 91 92 93 *94* 95 96 97 .. 100
|
|
* 1 .. 92 93 94 95 96 97 98 99 100
|
|
*
|
|
* For IndexCount of 12
|
|
* 1 2 3 4 5 6 7 8 9 10 .. 100
|
|
* 1 .. 4 5 6 *7* 8 9 10 11 .. 100
|
|
* 1 .. 90 91 92 *93* 94 95 96 97 .. 100
|
|
* 1 .. 91 92 93 94 95 96 97 98 99 100
|
|
*
|
|
* For IndexCount of 13
|
|
* 1 2 3 4 5 6 7 8 9 11 .. 100
|
|
* 1 .. 4 5 6 7 *8* 9 10 11 12 .. 100
|
|
* 1 .. 89 90 91 92 *93* 94 95 96 97 .. 100
|
|
* 1 .. 90 91 92 93 94 95 96 97 98 99 100
|
|
*/
|
|
$intMinimumEndOfBunch = $this->intIndexCount - 2;
|
|
$intMaximumStartOfBunch = $this->PageCount - $this->intIndexCount + 3;
|
|
|
|
$intLeftOfBunchCount = floor(($this->intIndexCount - 5) / 2);
|
|
$intRightOfBunchCount = round(($this->intIndexCount - 5.0) / 2.0);
|
|
|
|
$intLeftBunchTrigger = 4 + $intLeftOfBunchCount;
|
|
$intRightBunchTrigger = $intMaximumStartOfBunch + round(($this->intIndexCount - 8.0) / 2.0);
|
|
|
|
if ($this->intPageNumber < $intLeftBunchTrigger) {
|
|
$intPageStart = 1;
|
|
$strStartEllipsis = "";
|
|
} else {
|
|
$intPageStart = min($intMaximumStartOfBunch, $this->intPageNumber - $intLeftOfBunchCount);
|
|
|
|
$this->strActionParameter = 1;
|
|
$strStartEllipsis = sprintf('<span class="page"><a href="" %s>%s</a></span>',
|
|
$this->GetActionAttributes(), 1);
|
|
$strStartEllipsis .= '<span class="ellipsis">...</span>';
|
|
}
|
|
|
|
if ($this->intPageNumber > $intRightBunchTrigger) {
|
|
$intPageEnd = $this->PageCount;
|
|
$strEndEllipsis = "";
|
|
} else {
|
|
$intPageEnd = max($intMinimumEndOfBunch, $this->intPageNumber + $intRightOfBunchCount);
|
|
$strEndEllipsis = '<span class="ellipsis">...</span>';
|
|
|
|
$this->strActionParameter = $this->PageCount;
|
|
$strEndEllipsis .= sprintf('<span class="page"><a href="" %s>%s</a></span>',
|
|
$this->GetActionAttributes(), $this->PageCount);
|
|
}
|
|
|
|
$strToReturn .= $strStartEllipsis;
|
|
for ($intIndex = $intPageStart; $intIndex <= $intPageEnd; $intIndex++) {
|
|
if ($this->intPageNumber == $intIndex) {
|
|
$strToReturn .= sprintf('<span class="selected">%s</span>', $intIndex);
|
|
} else {
|
|
$this->strActionParameter = $intIndex;
|
|
$strToReturn .= sprintf('<span class="page"><a href="" %s>%s</a></span>',
|
|
$this->GetActionAttributes(), $intIndex);
|
|
}
|
|
}
|
|
$strToReturn .= $strEndEllipsis;
|
|
}
|
|
|
|
|
|
$strToReturn .= '<span class="break">|</span>';
|
|
|
|
if ($this->intPageNumber >= $this->PageCount)
|
|
$strToReturn .= sprintf('<span class="arrow">%s</span>', $this->strLabelForNext);
|
|
else {
|
|
$this->strActionParameter = $this->intPageNumber + 1;
|
|
$strToReturn .= sprintf('<span class="arrow"><a href="" %s>%s</a></span>',
|
|
$this->GetActionAttributes(), $this->strLabelForNext);
|
|
}
|
|
|
|
$strToReturn .= '</span>';
|
|
|
|
return $strToReturn;
|
|
}
|
|
|
|
/////////////////////////
|
|
// Public Properties: GET
|
|
/////////////////////////
|
|
public function __get($strName) {
|
|
switch ($strName) {
|
|
case 'IndexCount':
|
|
return $this->intIndexCount;
|
|
|
|
case 'LabelForNext':
|
|
return $this->strLabelForNext;
|
|
case 'LabelForPrevious':
|
|
return $this->strLabelForPrevious;
|
|
|
|
default:
|
|
try {
|
|
return parent::__get($strName);
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////
|
|
// Public Properties: SET
|
|
/////////////////////////
|
|
public function __set($strName, $mixValue) {
|
|
switch ($strName) {
|
|
case 'IndexCount':
|
|
$this->intIndexCount = QType::Cast($mixValue, QType::Integer);
|
|
if ($this->intIndexCount < 7)
|
|
throw new QCallerException('Paginator must have an IndexCount >= 7');
|
|
return $this->intIndexCount;
|
|
|
|
case 'LabelForNext':
|
|
try {
|
|
return ($this->strLabelForNext = QType::Cast($mixValue, QType::String));
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
case 'LabelForPrevious':
|
|
try {
|
|
return ($this->strLabelForPrevious = QType::Cast($mixValue, QType::String));
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
|
|
default:
|
|
try {
|
|
return (parent::__set($strName, $mixValue));
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
?>
|