diff options
Diffstat (limited to 'framework/Web/UI/WebControls/TRepeatInfo.php')
-rw-r--r-- | framework/Web/UI/WebControls/TRepeatInfo.php | 1118 |
1 files changed, 559 insertions, 559 deletions
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 @@ -<?php
-/**
- * IRepeatInfoUser, TRepeatInfo class file
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.pradosoft.com/
+<?php +/** + * IRepeatInfoUser, TRepeatInfo class file + * + * @author Qiang Xue <qiang.xue@gmail.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 <qiang.xue@gmail.com>
- * @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 <qiang.xue@gmail.com>
- * @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("<td></td>\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("<td></td>\n");
- }
- if($row==$rows-1)
- {
- $restColumns=$columns-$lastColumns;
- if($hasSeparators)
- $restColumns+=$restColumns;
- for($col=0;$col<$restColumns;++$col)
- $writer->write("<td></td>\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 <qiang.xue@gmail.com>
- * @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 <qiang.xue@gmail.com>
- * @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 <qiang.xue@gmail.com> + * @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 <qiang.xue@gmail.com> + * @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("<td></td>\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("<td></td>\n"); + } + if($row==$rows-1) + { + $restColumns=$columns-$lastColumns; + if($hasSeparators) + $restColumns+=$restColumns; + for($col=0;$col<$restColumns;++$col) + $writer->write("<td></td>\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 <qiang.xue@gmail.com> + * @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 <qiang.xue@gmail.com> + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0.4 + */ +class TRepeatLayout extends TEnumerable +{ + const Table='Table'; + const Flow='Flow'; + const Raw='Raw'; +} + |