From 903ae8a581fac1e6917fc3e31d2ad8fb91df80c3 Mon Sep 17 00:00:00 2001 From: ctrlaltca <> Date: Thu, 12 Jul 2012 11:21:01 +0000 Subject: standardize the use of unix eol; use svn properties to enforce native eol --- framework/Web/UI/WebControls/TRepeatInfo.php | 1118 +++++++++++++------------- 1 file changed, 559 insertions(+), 559 deletions(-) (limited to 'framework/Web/UI/WebControls/TRepeatInfo.php') diff --git a/framework/Web/UI/WebControls/TRepeatInfo.php b/framework/Web/UI/WebControls/TRepeatInfo.php index d7c6f0b6..2604e645 100644 --- a/framework/Web/UI/WebControls/TRepeatInfo.php +++ b/framework/Web/UI/WebControls/TRepeatInfo.php @@ -1,560 +1,560 @@ - - * @link http://www.pradosoft.com/ + + * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2012 PradoSoft - * @license http://www.pradosoft.com/license/ - * @version $Id$ - * @package System.Web.UI.WebControls - */ - -Prado::using('System.Web.UI.WebControls.TTable'); - -/** - * IRepeatInfoUser interface. - * This interface must be implemented by classes who want to use {@link TRepeatInfo}. - * - * @author Qiang Xue - * @version $Id$ - * @package System.Web.UI.WebControls - * @since 3.0 - */ -interface IRepeatInfoUser -{ - /** - * @return boolean whether the repeat user contains footer - */ - public function getHasFooter(); - /** - * @return boolean whether the repeat user contains header - */ - public function getHasHeader(); - /** - * @return boolean whether the repeat user contains separators - */ - public function getHasSeparators(); - /** - * @return integer number of items to be rendered (excluding header, footer and separators) - */ - public function getItemCount(); - /** - * @param string item type (Header,Footer,Item,AlternatingItem,SelectedItem,EditItem,Separator,Pager) - * @param integer zero-based index of the current rendering item. - * @return TStyle CSS style used for rendering items (including header, footer and separators) - */ - public function generateItemStyle($itemType,$index); - /** - * Renders an item. - * @param THtmlWriter writer for the rendering purpose - * @param TRepeatInfo repeat information - * @param string item type - * @param integer zero-based index of the item being rendered - */ - public function renderItem($writer,$repeatInfo,$itemType,$index); -} - -/** - * TRepeatInfo class. - * TRepeatInfo represents repeat information for controls like {@link TCheckBoxList}. - * The layout of the repeated items is specified via {@link setRepeatLayout RepeatLayout}, - * which can be either Table (default), Flow or Raw. - * A table layout uses HTML table cells to organize the items while - * a flow layout uses line breaks to organize the items. - * The number of columns used to display the items is specified via - * {@link setRepeatColumns RepeatColumns} property, while the {@link setRepeatDirection RepeatDirection} - * governs the order of the items being rendered. - * - * Note, the Raw layout does not contain any formatting tags and thus ignores - * the column and repeat direction settings. - * - * @author Qiang Xue - * @version $Id$ - * @package System.Web.UI.WebControls - * @since 3.0 - */ -class TRepeatInfo extends TComponent -{ - /** - * @var string caption of the table used to organize the repeated items - */ - private $_caption=''; - /** - * @var TTableCaptionAlign alignment of the caption of the table used to organize the repeated items - */ - private $_captionAlign=TTableCaptionAlign::NotSet; - /** - * @var integer number of columns that the items should be arranged in - */ - private $_repeatColumns=0; - /** - * @var TRepeatDirection direction of the repetition - */ - private $_repeatDirection=TRepeatDirection::Vertical; - /** - * @var TRepeatLayout layout of the repeated items - */ - private $_repeatLayout=TRepeatLayout::Table; - - /** - * @return string caption of the table layout - */ - public function getCaption() - { - return $this->_caption; - } - - /** - * @param string caption of the table layout - */ - public function setCaption($value) - { - $this->_caption=$value; - } - - /** - * @return TTableCaptionAlign alignment of the caption of the table layout. Defaults to TTableCaptionAlign::NotSet. - */ - public function getCaptionAlign() - { - return $this->_captionAlign; - } - - /** - * @return TTableCaptionAlign alignment of the caption of the table layout. - */ - public function setCaptionAlign($value) - { - $this->_captionAlign=TPropertyValue::ensureEnum($value,'TTableCaptionAlign'); - } - - /** - * @return integer the number of columns that the repeated items should be displayed in. Defaults to 0, meaning not set. - */ - public function getRepeatColumns() - { - return $this->_repeatColumns; - } - - /** - * @param integer the number of columns that the repeated items should be displayed in. - */ - public function setRepeatColumns($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - throw new TInvalidDataValueException('repeatinfo_repeatcolumns_invalid'); - $this->_repeatColumns=$value; - } - - /** - * @return TRepeatDirection the direction of traversing the repeated items, defaults to TRepeatDirection::Vertical - */ - public function getRepeatDirection() - { - return $this->_repeatDirection; - } - - /** - * @param TRepeatDirection the direction of traversing the repeated items - */ - public function setRepeatDirection($value) - { - $this->_repeatDirection=TPropertyValue::ensureEnum($value,'TRepeatDirection'); - } - - /** - * @return TRepeatLayout how the repeated items should be displayed, using table or using line breaks. Defaults to TRepeatLayout::Table. - */ - public function getRepeatLayout() - { - return $this->_repeatLayout; - } - - /** - * @param TRepeatLayout how the repeated items should be displayed, using table or using line breaks. - */ - public function setRepeatLayout($value) - { - $this->_repeatLayout=TPropertyValue::ensureEnum($value,'TRepeatLayout'); - } - - /** - * Renders the repeated items. - * @param THtmlWriter writer for the rendering purpose - * @param IRepeatInfoUser repeat information user - */ - public function renderRepeater($writer, IRepeatInfoUser $user) - { - if($this->_repeatLayout===TRepeatLayout::Table) - { - $control=new TTable; - if($this->_caption!=='') - { - $control->setCaption($this->_caption); - $control->setCaptionAlign($this->_captionAlign); - } - } - else if($this->_repeatLayout===TRepeatLayout::Raw) - { - $this->renderRawContents($writer,$user); - return; - } - else - $control=new TWebControl; - $control->setID($user->getClientID()); - $control->copyBaseAttributes($user); - if($user->getHasStyle()) - $control->getStyle()->copyFrom($user->getStyle()); - $control->renderBeginTag($writer); - $writer->writeLine(); - - if($this->_repeatDirection===TRepeatDirection::Vertical) - $this->renderVerticalContents($writer,$user); - else - $this->renderHorizontalContents($writer,$user); - - $control->renderEndTag($writer); - } - - /** - * Renders contents in raw format. - * @param THtmlWriter writer for the rendering purpose - * @param IRepeatInfoUser repeat information user - */ - protected function renderRawContents($writer,$user) - { - if($user->getHasHeader()) - $user->renderItem($writer,$this,'Header',-1); - - // render items - $hasSeparators=$user->getHasSeparators(); - $itemCount=$user->getItemCount(); - for($i=0;$i<$itemCount;++$i) - { - $user->renderItem($writer,$this,'Item',$i); - if($hasSeparators && $i!=$itemCount-1) - $user->renderItem($writer,$this,'Separator',$i); - } - if($user->getHasFooter()) - $user->renderItem($writer,$this,'Footer',-1); - } - - /** - * Renders contents in horizontal repeat direction. - * @param THtmlWriter writer for the rendering purpose - * @param IRepeatInfoUser repeat information user - */ - protected function renderHorizontalContents($writer,$user) - { - $tableLayout=($this->_repeatLayout===TRepeatLayout::Table); - $hasSeparators=$user->getHasSeparators(); - $itemCount=$user->getItemCount(); - $columns=$this->_repeatColumns===0?$itemCount:$this->_repeatColumns; - $totalColumns=$hasSeparators?$columns+$columns:$columns; - $needBreak=$columns<$itemCount; - - if($user->getHasHeader()) - $this->renderHeader($writer,$user,$tableLayout,$totalColumns,$needBreak); - - // render items - if($tableLayout) - { - $writer->renderBeginTag('tbody'); - $column=0; - for($i=0;$i<$itemCount;++$i) - { - if($column==0) - $writer->renderBeginTag('tr'); - if(($style=$user->generateItemStyle('Item',$i))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Item',$i); - $writer->renderEndTag(); - $writer->writeLine(); - if($hasSeparators && $i!=$itemCount-1) - { - if(($style=$user->generateItemStyle('Separator',$i))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Separator',$i); - $writer->renderEndTag(); - $writer->writeLine(); - } - $column++; - if($i==$itemCount-1) - { - $restColumns=$columns-$column; - if($hasSeparators) - $restColumns=$restColumns?$restColumns+$restColumns+1:1; - for($j=0;$j<$restColumns;++$j) - $writer->write("\n"); - } - if($column==$columns || $i==$itemCount-1) - { - $writer->renderEndTag(); - $writer->writeLine(); - $column=0; - } - } - $writer->renderEndTag(); - } - else - { - $column=0; - for($i=0;$i<$itemCount;++$i) - { - $user->renderItem($writer,$this,'Item',$i); - if($hasSeparators && $i!=$itemCount-1) - $user->renderItem($writer,$this,'Separator',$i); - $column++; - if($column==$columns || $i==$itemCount-1) - { - if($needBreak) - $writer->writeBreak(); - $column=0; - } - $writer->writeLine(); - } - } - - if($user->getHasFooter()) - $this->renderFooter($writer,$user,$tableLayout,$totalColumns,$needBreak); - } - - /** - * Renders contents in veritcal repeat direction. - * @param THtmlWriter writer for the rendering purpose - * @param IRepeatInfoUser repeat information user - */ - protected function renderVerticalContents($writer,$user) - { - $tableLayout=($this->_repeatLayout===TRepeatLayout::Table); - $hasSeparators=$user->getHasSeparators(); - $itemCount=$user->getItemCount(); - if($this->_repeatColumns<=1) - { - $rows=$itemCount; - $columns=1; - $lastColumns=1; - } - else - { - $columns=$this->_repeatColumns; - $rows=(int)(($itemCount+$columns-1)/$columns); - if($rows==0 && $itemCount>0) - $rows=1; - if(($lastColumns=$itemCount%$columns)==0) - $lastColumns=$columns; - } - $totalColumns=$hasSeparators?$columns+$columns:$columns; - - if($user->getHasHeader()) - $this->renderHeader($writer,$user,$tableLayout,$totalColumns,false); - - if($tableLayout) - { - $writer->renderBeginTag('tbody'); - $renderedItems=0; - for($row=0;$row<$rows;++$row) - { - $index=$row; - $writer->renderBeginTag('tr'); - for($col=0;$col<$columns;++$col) - { - if($renderedItems>=$itemCount) - break; - if($col>0) - { - $index+=$rows; - if($col-1>=$lastColumns) - $index--; - } - if($index>=$itemCount) - continue; - $renderedItems++; - if(($style=$user->generateItemStyle('Item',$index))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Item',$index); - $writer->renderEndTag(); - $writer->writeLine(); - if(!$hasSeparators) - continue; - if($renderedItems<$itemCount-1) - { - if($columns==1) - { - $writer->renderEndTag(); - $writer->renderBeginTag('tr'); - } - if(($style=$user->generateItemStyle('Separator',$index))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Separator',$index); - $writer->renderEndTag(); - $writer->writeLine(); - } - else if($columns>1) - $writer->write("\n"); - } - if($row==$rows-1) - { - $restColumns=$columns-$lastColumns; - if($hasSeparators) - $restColumns+=$restColumns; - for($col=0;$col<$restColumns;++$col) - $writer->write("\n"); - } - $writer->renderEndTag(); - $writer->writeLine(); - } - $writer->renderEndTag(); - } - else - { - $renderedItems=0; - for($row=0;$row<$rows;++$row) - { - $index=$row; - for($col=0;$col<$columns;++$col) - { - if($renderedItems>=$itemCount) - break; - if($col>0) - { - $index+=$rows; - if($col-1>=$lastColumns) - $index--; - } - if($index>=$itemCount) - continue; - $renderedItems++; - $user->renderItem($writer,$this,'Item',$index); - $writer->writeLine(); - if(!$hasSeparators) - continue; - if($renderedItems<$itemCount-1) - { - if($columns==1) - $writer->writeBreak(); - $user->renderItem($writer,$this,'Separator',$index); - } - $writer->writeLine(); - } - if($row<$rows-1 || $user->getHasFooter()) - $writer->writeBreak(); - } - } - - if($user->getHasFooter()) - $this->renderFooter($writer,$user,$tableLayout,$totalColumns,false); - - } - - /** - * Renders header. - * @param THtmlWriter writer for the rendering purpose - * @param IRepeatInfoUser repeat information user - * @param boolean whether to render using table layout - * @param integer number of columns to be rendered - * @param boolean if a line break is needed at the end - */ - protected function renderHeader($writer,$user,$tableLayout,$columns,$needBreak) - { - if($tableLayout) - { - $writer->renderBeginTag('thead'); - $writer->renderBeginTag('tr'); - if($columns>1) - $writer->addAttribute('colspan',"$columns"); - $writer->addAttribute('scope','col'); - if(($style=$user->generateItemStyle('Header',-1))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('th'); - $user->renderItem($writer,$this,'Header',-1); - $writer->renderEndTag(); - $writer->renderEndTag(); - $writer->renderEndTag(); - } - else - { - $user->renderItem($writer,$this,'Header',-1); - if($needBreak) - $writer->writeBreak(); - } - $writer->writeLine(); - } - - /** - * Renders footer. - * @param THtmlWriter writer for the rendering purpose - * @param IRepeatInfoUser repeat information user - * @param boolean whether to render using table layout - * @param integer number of columns to be rendered - */ - protected function renderFooter($writer,$user,$tableLayout,$columns) - { - if($tableLayout) - { - $writer->renderBeginTag('tfoot'); - $writer->renderBeginTag('tr'); - if($columns>1) - $writer->addAttribute('colspan',"$columns"); - if(($style=$user->generateItemStyle('Footer',-1))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Footer',-1); - $writer->renderEndTag(); - $writer->renderEndTag(); - $writer->renderEndTag(); - } - else - $user->renderItem($writer,$this,'Footer',-1); - $writer->writeLine(); - } -} - - -/** - * TRepeatDirection class. - * TRepeatDirection defines the enumerable type for the possible directions - * that repeated contents can repeat along - * - * The following enumerable values are defined: - * - Vertical - * - Horizontal - * - * @author Qiang Xue - * @version $Id$ - * @package System.Web.UI.WebControls - * @since 3.0.4 - */ -class TRepeatDirection extends TEnumerable -{ - const Vertical='Vertical'; - const Horizontal='Horizontal'; -} - -/** - * TRepeatLayout class. - * TRepeatLayout defines the enumerable type for the possible layouts - * that repeated contents can take. - * - * The following enumerable values are defined: - * - Table: the repeated contents are organized using an HTML table - * - Flow: the repeated contents are organized using HTML spans and breaks - * - Raw: the repeated contents are stacked together without any additional decorations - * - * @author Qiang Xue - * @version $Id$ - * @package System.Web.UI.WebControls - * @since 3.0.4 - */ -class TRepeatLayout extends TEnumerable -{ - const Table='Table'; - const Flow='Flow'; - const Raw='Raw'; -} - + * @license http://www.pradosoft.com/license/ + * @version $Id$ + * @package System.Web.UI.WebControls + */ + +Prado::using('System.Web.UI.WebControls.TTable'); + +/** + * IRepeatInfoUser interface. + * This interface must be implemented by classes who want to use {@link TRepeatInfo}. + * + * @author Qiang Xue + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +interface IRepeatInfoUser +{ + /** + * @return boolean whether the repeat user contains footer + */ + public function getHasFooter(); + /** + * @return boolean whether the repeat user contains header + */ + public function getHasHeader(); + /** + * @return boolean whether the repeat user contains separators + */ + public function getHasSeparators(); + /** + * @return integer number of items to be rendered (excluding header, footer and separators) + */ + public function getItemCount(); + /** + * @param string item type (Header,Footer,Item,AlternatingItem,SelectedItem,EditItem,Separator,Pager) + * @param integer zero-based index of the current rendering item. + * @return TStyle CSS style used for rendering items (including header, footer and separators) + */ + public function generateItemStyle($itemType,$index); + /** + * Renders an item. + * @param THtmlWriter writer for the rendering purpose + * @param TRepeatInfo repeat information + * @param string item type + * @param integer zero-based index of the item being rendered + */ + public function renderItem($writer,$repeatInfo,$itemType,$index); +} + +/** + * TRepeatInfo class. + * TRepeatInfo represents repeat information for controls like {@link TCheckBoxList}. + * The layout of the repeated items is specified via {@link setRepeatLayout RepeatLayout}, + * which can be either Table (default), Flow or Raw. + * A table layout uses HTML table cells to organize the items while + * a flow layout uses line breaks to organize the items. + * The number of columns used to display the items is specified via + * {@link setRepeatColumns RepeatColumns} property, while the {@link setRepeatDirection RepeatDirection} + * governs the order of the items being rendered. + * + * Note, the Raw layout does not contain any formatting tags and thus ignores + * the column and repeat direction settings. + * + * @author Qiang Xue + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TRepeatInfo extends TComponent +{ + /** + * @var string caption of the table used to organize the repeated items + */ + private $_caption=''; + /** + * @var TTableCaptionAlign alignment of the caption of the table used to organize the repeated items + */ + private $_captionAlign=TTableCaptionAlign::NotSet; + /** + * @var integer number of columns that the items should be arranged in + */ + private $_repeatColumns=0; + /** + * @var TRepeatDirection direction of the repetition + */ + private $_repeatDirection=TRepeatDirection::Vertical; + /** + * @var TRepeatLayout layout of the repeated items + */ + private $_repeatLayout=TRepeatLayout::Table; + + /** + * @return string caption of the table layout + */ + public function getCaption() + { + return $this->_caption; + } + + /** + * @param string caption of the table layout + */ + public function setCaption($value) + { + $this->_caption=$value; + } + + /** + * @return TTableCaptionAlign alignment of the caption of the table layout. Defaults to TTableCaptionAlign::NotSet. + */ + public function getCaptionAlign() + { + return $this->_captionAlign; + } + + /** + * @return TTableCaptionAlign alignment of the caption of the table layout. + */ + public function setCaptionAlign($value) + { + $this->_captionAlign=TPropertyValue::ensureEnum($value,'TTableCaptionAlign'); + } + + /** + * @return integer the number of columns that the repeated items should be displayed in. Defaults to 0, meaning not set. + */ + public function getRepeatColumns() + { + return $this->_repeatColumns; + } + + /** + * @param integer the number of columns that the repeated items should be displayed in. + */ + public function setRepeatColumns($value) + { + if(($value=TPropertyValue::ensureInteger($value))<0) + throw new TInvalidDataValueException('repeatinfo_repeatcolumns_invalid'); + $this->_repeatColumns=$value; + } + + /** + * @return TRepeatDirection the direction of traversing the repeated items, defaults to TRepeatDirection::Vertical + */ + public function getRepeatDirection() + { + return $this->_repeatDirection; + } + + /** + * @param TRepeatDirection the direction of traversing the repeated items + */ + public function setRepeatDirection($value) + { + $this->_repeatDirection=TPropertyValue::ensureEnum($value,'TRepeatDirection'); + } + + /** + * @return TRepeatLayout how the repeated items should be displayed, using table or using line breaks. Defaults to TRepeatLayout::Table. + */ + public function getRepeatLayout() + { + return $this->_repeatLayout; + } + + /** + * @param TRepeatLayout how the repeated items should be displayed, using table or using line breaks. + */ + public function setRepeatLayout($value) + { + $this->_repeatLayout=TPropertyValue::ensureEnum($value,'TRepeatLayout'); + } + + /** + * Renders the repeated items. + * @param THtmlWriter writer for the rendering purpose + * @param IRepeatInfoUser repeat information user + */ + public function renderRepeater($writer, IRepeatInfoUser $user) + { + if($this->_repeatLayout===TRepeatLayout::Table) + { + $control=new TTable; + if($this->_caption!=='') + { + $control->setCaption($this->_caption); + $control->setCaptionAlign($this->_captionAlign); + } + } + else if($this->_repeatLayout===TRepeatLayout::Raw) + { + $this->renderRawContents($writer,$user); + return; + } + else + $control=new TWebControl; + $control->setID($user->getClientID()); + $control->copyBaseAttributes($user); + if($user->getHasStyle()) + $control->getStyle()->copyFrom($user->getStyle()); + $control->renderBeginTag($writer); + $writer->writeLine(); + + if($this->_repeatDirection===TRepeatDirection::Vertical) + $this->renderVerticalContents($writer,$user); + else + $this->renderHorizontalContents($writer,$user); + + $control->renderEndTag($writer); + } + + /** + * Renders contents in raw format. + * @param THtmlWriter writer for the rendering purpose + * @param IRepeatInfoUser repeat information user + */ + protected function renderRawContents($writer,$user) + { + if($user->getHasHeader()) + $user->renderItem($writer,$this,'Header',-1); + + // render items + $hasSeparators=$user->getHasSeparators(); + $itemCount=$user->getItemCount(); + for($i=0;$i<$itemCount;++$i) + { + $user->renderItem($writer,$this,'Item',$i); + if($hasSeparators && $i!=$itemCount-1) + $user->renderItem($writer,$this,'Separator',$i); + } + if($user->getHasFooter()) + $user->renderItem($writer,$this,'Footer',-1); + } + + /** + * Renders contents in horizontal repeat direction. + * @param THtmlWriter writer for the rendering purpose + * @param IRepeatInfoUser repeat information user + */ + protected function renderHorizontalContents($writer,$user) + { + $tableLayout=($this->_repeatLayout===TRepeatLayout::Table); + $hasSeparators=$user->getHasSeparators(); + $itemCount=$user->getItemCount(); + $columns=$this->_repeatColumns===0?$itemCount:$this->_repeatColumns; + $totalColumns=$hasSeparators?$columns+$columns:$columns; + $needBreak=$columns<$itemCount; + + if($user->getHasHeader()) + $this->renderHeader($writer,$user,$tableLayout,$totalColumns,$needBreak); + + // render items + if($tableLayout) + { + $writer->renderBeginTag('tbody'); + $column=0; + for($i=0;$i<$itemCount;++$i) + { + if($column==0) + $writer->renderBeginTag('tr'); + if(($style=$user->generateItemStyle('Item',$i))!==null) + $style->addAttributesToRender($writer); + $writer->renderBeginTag('td'); + $user->renderItem($writer,$this,'Item',$i); + $writer->renderEndTag(); + $writer->writeLine(); + if($hasSeparators && $i!=$itemCount-1) + { + if(($style=$user->generateItemStyle('Separator',$i))!==null) + $style->addAttributesToRender($writer); + $writer->renderBeginTag('td'); + $user->renderItem($writer,$this,'Separator',$i); + $writer->renderEndTag(); + $writer->writeLine(); + } + $column++; + if($i==$itemCount-1) + { + $restColumns=$columns-$column; + if($hasSeparators) + $restColumns=$restColumns?$restColumns+$restColumns+1:1; + for($j=0;$j<$restColumns;++$j) + $writer->write("\n"); + } + if($column==$columns || $i==$itemCount-1) + { + $writer->renderEndTag(); + $writer->writeLine(); + $column=0; + } + } + $writer->renderEndTag(); + } + else + { + $column=0; + for($i=0;$i<$itemCount;++$i) + { + $user->renderItem($writer,$this,'Item',$i); + if($hasSeparators && $i!=$itemCount-1) + $user->renderItem($writer,$this,'Separator',$i); + $column++; + if($column==$columns || $i==$itemCount-1) + { + if($needBreak) + $writer->writeBreak(); + $column=0; + } + $writer->writeLine(); + } + } + + if($user->getHasFooter()) + $this->renderFooter($writer,$user,$tableLayout,$totalColumns,$needBreak); + } + + /** + * Renders contents in veritcal repeat direction. + * @param THtmlWriter writer for the rendering purpose + * @param IRepeatInfoUser repeat information user + */ + protected function renderVerticalContents($writer,$user) + { + $tableLayout=($this->_repeatLayout===TRepeatLayout::Table); + $hasSeparators=$user->getHasSeparators(); + $itemCount=$user->getItemCount(); + if($this->_repeatColumns<=1) + { + $rows=$itemCount; + $columns=1; + $lastColumns=1; + } + else + { + $columns=$this->_repeatColumns; + $rows=(int)(($itemCount+$columns-1)/$columns); + if($rows==0 && $itemCount>0) + $rows=1; + if(($lastColumns=$itemCount%$columns)==0) + $lastColumns=$columns; + } + $totalColumns=$hasSeparators?$columns+$columns:$columns; + + if($user->getHasHeader()) + $this->renderHeader($writer,$user,$tableLayout,$totalColumns,false); + + if($tableLayout) + { + $writer->renderBeginTag('tbody'); + $renderedItems=0; + for($row=0;$row<$rows;++$row) + { + $index=$row; + $writer->renderBeginTag('tr'); + for($col=0;$col<$columns;++$col) + { + if($renderedItems>=$itemCount) + break; + if($col>0) + { + $index+=$rows; + if($col-1>=$lastColumns) + $index--; + } + if($index>=$itemCount) + continue; + $renderedItems++; + if(($style=$user->generateItemStyle('Item',$index))!==null) + $style->addAttributesToRender($writer); + $writer->renderBeginTag('td'); + $user->renderItem($writer,$this,'Item',$index); + $writer->renderEndTag(); + $writer->writeLine(); + if(!$hasSeparators) + continue; + if($renderedItems<$itemCount-1) + { + if($columns==1) + { + $writer->renderEndTag(); + $writer->renderBeginTag('tr'); + } + if(($style=$user->generateItemStyle('Separator',$index))!==null) + $style->addAttributesToRender($writer); + $writer->renderBeginTag('td'); + $user->renderItem($writer,$this,'Separator',$index); + $writer->renderEndTag(); + $writer->writeLine(); + } + else if($columns>1) + $writer->write("\n"); + } + if($row==$rows-1) + { + $restColumns=$columns-$lastColumns; + if($hasSeparators) + $restColumns+=$restColumns; + for($col=0;$col<$restColumns;++$col) + $writer->write("\n"); + } + $writer->renderEndTag(); + $writer->writeLine(); + } + $writer->renderEndTag(); + } + else + { + $renderedItems=0; + for($row=0;$row<$rows;++$row) + { + $index=$row; + for($col=0;$col<$columns;++$col) + { + if($renderedItems>=$itemCount) + break; + if($col>0) + { + $index+=$rows; + if($col-1>=$lastColumns) + $index--; + } + if($index>=$itemCount) + continue; + $renderedItems++; + $user->renderItem($writer,$this,'Item',$index); + $writer->writeLine(); + if(!$hasSeparators) + continue; + if($renderedItems<$itemCount-1) + { + if($columns==1) + $writer->writeBreak(); + $user->renderItem($writer,$this,'Separator',$index); + } + $writer->writeLine(); + } + if($row<$rows-1 || $user->getHasFooter()) + $writer->writeBreak(); + } + } + + if($user->getHasFooter()) + $this->renderFooter($writer,$user,$tableLayout,$totalColumns,false); + + } + + /** + * Renders header. + * @param THtmlWriter writer for the rendering purpose + * @param IRepeatInfoUser repeat information user + * @param boolean whether to render using table layout + * @param integer number of columns to be rendered + * @param boolean if a line break is needed at the end + */ + protected function renderHeader($writer,$user,$tableLayout,$columns,$needBreak) + { + if($tableLayout) + { + $writer->renderBeginTag('thead'); + $writer->renderBeginTag('tr'); + if($columns>1) + $writer->addAttribute('colspan',"$columns"); + $writer->addAttribute('scope','col'); + if(($style=$user->generateItemStyle('Header',-1))!==null) + $style->addAttributesToRender($writer); + $writer->renderBeginTag('th'); + $user->renderItem($writer,$this,'Header',-1); + $writer->renderEndTag(); + $writer->renderEndTag(); + $writer->renderEndTag(); + } + else + { + $user->renderItem($writer,$this,'Header',-1); + if($needBreak) + $writer->writeBreak(); + } + $writer->writeLine(); + } + + /** + * Renders footer. + * @param THtmlWriter writer for the rendering purpose + * @param IRepeatInfoUser repeat information user + * @param boolean whether to render using table layout + * @param integer number of columns to be rendered + */ + protected function renderFooter($writer,$user,$tableLayout,$columns) + { + if($tableLayout) + { + $writer->renderBeginTag('tfoot'); + $writer->renderBeginTag('tr'); + if($columns>1) + $writer->addAttribute('colspan',"$columns"); + if(($style=$user->generateItemStyle('Footer',-1))!==null) + $style->addAttributesToRender($writer); + $writer->renderBeginTag('td'); + $user->renderItem($writer,$this,'Footer',-1); + $writer->renderEndTag(); + $writer->renderEndTag(); + $writer->renderEndTag(); + } + else + $user->renderItem($writer,$this,'Footer',-1); + $writer->writeLine(); + } +} + + +/** + * TRepeatDirection class. + * TRepeatDirection defines the enumerable type for the possible directions + * that repeated contents can repeat along + * + * The following enumerable values are defined: + * - Vertical + * - Horizontal + * + * @author Qiang Xue + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0.4 + */ +class TRepeatDirection extends TEnumerable +{ + const Vertical='Vertical'; + const Horizontal='Horizontal'; +} + +/** + * TRepeatLayout class. + * TRepeatLayout defines the enumerable type for the possible layouts + * that repeated contents can take. + * + * The following enumerable values are defined: + * - Table: the repeated contents are organized using an HTML table + * - Flow: the repeated contents are organized using HTML spans and breaks + * - Raw: the repeated contents are stacked together without any additional decorations + * + * @author Qiang Xue + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0.4 + */ +class TRepeatLayout extends TEnumerable +{ + const Table='Table'; + const Flow='Flow'; + const Raw='Raw'; +} + -- cgit v1.2.3