From 5af330b442f15be0f0535a9e3c053b8e6eb5a202 Mon Sep 17 00:00:00 2001 From: xue <> Date: Sun, 15 Jan 2006 06:14:10 +0000 Subject: Added TDataGridColumn. --- framework/Web/UI/WebControls/TDataGrid.php | 220 ++++++++++------- framework/Web/UI/WebControls/TDataGridColumn.php | 295 +++++++++++++++++++++++ framework/Web/UI/WebControls/TStyle.php | 2 + 3 files changed, 429 insertions(+), 88 deletions(-) create mode 100644 framework/Web/UI/WebControls/TDataGridColumn.php (limited to 'framework/Web/UI') diff --git a/framework/Web/UI/WebControls/TDataGrid.php b/framework/Web/UI/WebControls/TDataGrid.php index 23b45842..205b97a0 100644 --- a/framework/Web/UI/WebControls/TDataGrid.php +++ b/framework/Web/UI/WebControls/TDataGrid.php @@ -96,96 +96,10 @@ * * An OnItemCreated event will be raised right after each item is created in the datagrid. * - * Namespace: System.Web.UI.WebControls - * - * Properties - * - Items, TDataGridItemCollection, read-only - *
Gets the list of TDataGridItem controls that correspond to each data item. - * - Columns, TCollection, read-only - *
Gets the list of TDataGridColumn controls that are manually specified or created. - * - AutoGenerateColumns, boolean, default=true, kept in viewstate - *
Gets or sets the value indicating whether columns should be generated automatically based on the data in datasource. - * - AllowSorting, boolean, default=false, kept in viewstate - *
Gets or sets the value indicating whether sorting should be enabled. - * - AllowPaging, boolean, default=false, kept in viewstate - *
Gets or sets the value indicating whether paging should be enabled. - * - AllowCustomPaging, boolean, default=false, kept in viewstate - *
Gets or sets the value indicating whether custom paging should be enabled. - * - CurrentPageIndex, integer, default=0, stored in viewstate - *
Gets or sets the index for the page to be displayed - * - PageSize, integer, default=10, stored in viewstate - *
Gets or sets the number of data items to be displayed in each page. - * - PageCount, integer, read-only - *
Gets the number of pages to be displayed. - * - VirtualItemCount, integer, default=0, stored in viewstate - *
Gets or sets the number of data items available for paging purpose when custom paging is enabled. - * - PagerButtonCount, integer, default=10, stored in viewstate - *
Gets or sets the number of buttons to be displayed in pager for navigating among pages. - * - PagerDisplay, string (None,Top,Bottom,TopAndBottom), default=Bottom, stored in viewstate - *
Gets or sets where the pager should be displayed. - * - EditItemIndex, integer, default=-1, stored in viewstate - *
Gets or sets the index for edit item. - * - EditItem, TDataGridItem, read-only - *
Gets the edit item, null if none - * - EditItemStyle, string, stored in viewstate - *
Gets or sets the css style for the edit item - * - EditItemCssClass, string, stored in viewstate - *
Gets or sets the css classs for the edit item - * - SelectedItemIndex, integer, default=-1, stored in viewstate - *
Gets or sets the index for selected item. - * - SelectedItem, TDataGridItem, read-only - *
Gets the selected item, null if none - * - SelectedItemStyle, string, stored in viewstate - *
Gets or sets the css style for the selected item - * - SelectedItemCssClass, string, stored in viewstate - *
Gets or sets the css class for the selected item - * - ItemStyle, string, stored in viewstate - *
Gets or sets the css style for each item - * - ItemCssClass, string, stored in viewstate - *
Gets or sets the css class for each item - * - AlternatingItemStyle, string, stored in viewstate - *
Gets or sets the css style for each alternating item - * - AlternatingItemCssClass, string, stored in viewstate - *
Gets or sets the css class for each alternating item - * - HeaderStyle, string, stored in viewstate - *
Gets or sets the css style for the header - * - HeaderCssClass, string, stored in viewstate - *
Gets or sets the css class for the header - * - FooterStyle, string, stored in viewstate - *
Gets or sets the css style for the footer - * - FooterCssClass, string, stored in viewstate - *
Gets or sets the css class for the footer - * - PagerStyle, string, stored in viewstate - *
Gets or sets the css style for the pager - * - PagerCssClass, string, stored in viewstate - *
Gets or sets the css class for the pager - * - ShowHeader, boolean, default=true, stored in viewstate - *
Gets or sets the value whether to show header - * - ShowFooter, boolean, default=true, stored in viewstate - *
Gets or sets the value whether to show footer - * - Header, TDataGridItem - *
Gets the header of the data grid. - * - Footer, TDataGridItem - *
Gets the footer of the data grid. - * - Pager, TDataGridItem - *
Gets the pager of the data grid. - * - BackImageUrl, string, kept in viewstate - *
Gets or sets the URL of the background image to display behind the datagrid. - * - * Events - * - OnEditCommand, raised when a button control raises an OnCommand event with 'edit' command. - * - OnSelectCommand, raised when a button control raises an OnCommand event with 'select' command. - * - OnUpdateCommand, raised when a button control raises an OnCommand event with 'update' command. - * - OnCancelCommand, raised when a button control raises an OnCommand event with 'cancel' command. - * - OnDeleteCommand, raised when a button control raises an OnCommand event with 'delete' command. - * - OnPageCommand, raised when a button control raises an OnCommand event with 'page' command. - * - OnSortCommand, raised when a button control raises an OnCommand event with 'sort' command. - * - OnItemCommand, raised when a button control raises an OnCommand event. - * - OnItemCreatedCommand, raised right after an item is created. - * * @author Qiang Xue - * @version $Revision: 1.25 $ $Date: 2005/12/17 06:11:28 $ + * @version $Revision: $ $Date: $ * @package System.Web.UI.WebControls + * @since 3.0 */ class TDataGrid extends TBaseDataList { @@ -1152,6 +1066,136 @@ class TDataGridColumnCollection extends TList class TDataGridPagerStyle extends TTableItemStyle { + private $_mode=null; + private $_nextText=null; + private $_prevText=null; + private $_buttonCount=null; + private $_position=null; + private $_visible=null; + + public function getMode() + { + return $this->_mode===null?'NextPrev':$this->_mode; + } + + public function setMode($value) + { + $this->_mode=TPropertyValue::ensureEnum($value,'NextPrev','NumericPages'); + } + + public function getNextPageText() + { + return $this->_nextText===null?'>':$this->_nextText; + } + + public function setNextPageText($value) + { + $this->_nextText=$value; + } + + public function getPrevPageText() + { + return $this->_prevText===null?'<':$this->_prevText; + } + + public function setPrevPageText($value) + { + $this->_prevText=$value; + } + + public function getPageButtonCount() + { + return $this->_buttonCount===null?10:$this->_buttonCount; + } + + public function setPageButtonCount($value) + { + if(($value=TPropertyValue::ensureInteger($value))<1) + throw new TInvalidDataValueException('datagridpagerstyle_pagebuttoncount_invalid'); + $this->_buttonCount=$value; + } + + public function getPosition() + { + return $this->_position===null?'Bottom':$this->_position; + } + + public function setPosition($value) + { + $this->_position=TPropertyValue::ensureEnum($value,'Bottom','Top','TopAndBottom'); + } + + public function getVisible() + { + return $this->_visible===null?true:$this->_visible; + } + + public function setVisible($value) + { + $this->_visible=TPropertyValue::ensureBoolean($value); + } + + /** + * Resets the style to the original empty state. + */ + public function reset() + { + parent::reset(); + $this->_visible=null; + $this->_position=null; + $this->_buttonCount=null; + $this->_prevText=null; + $this->_nextText=null; + $this->_mode=null; + } + + /** + * Copies the style content from an existing style + * This method overrides the parent implementation by + * adding additional TDataGridPagerStyle specific attributes. + * @param TStyle source style + */ + public function copyFrom($style) + { + parent::copyFrom($style); + if($style instanceof TDataGridPagerStyle) + { + $this->_visible=$style->_visible; + $this->_position=$style->_position; + $this->_buttonCount=$style->_buttonCount; + $this->_prevText=$style->_prevText; + $this->_nextText=$style->_nextText; + $this->_mode=$style->_mode; + } + } + + /** + * Merges with a style. + * If a style field is not set in the current style but set in the new style + * it will take the value from the new style. + * This method overrides the parent implementation by + * merging with additional TDataGridPagerStyle specific attributes. + * @param TStyle the new style + */ + public function mergeWith($style) + { + parent::mergeWith($style); + if($style instanceof TDataGridPagerStyle) + { + if($style->_visible!==null && $this->_visible===null) + $this->_visible=$style->_visible; + if($style->_position!==null && $this->_position===null) + $this->_position=$style->_position; + if($style->_buttonCount!==null && $this->_buttonCount===null) + $this->_buttonCount=$style->_buttonCount; + if($style->_prevText!==null && $this->_prevText===null) + $this->_prevText=$style->_prevText; + if($style->_nextText!==null && $this->_nextText===null) + $this->_nextText=$style->_nextText; + if($style->_mode!==null && $this->_mode===null) + $this->_mode=$style->_mode; + } + } } ?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TDataGridColumn.php b/framework/Web/UI/WebControls/TDataGridColumn.php new file mode 100644 index 00000000..f78c636d --- /dev/null +++ b/framework/Web/UI/WebControls/TDataGridColumn.php @@ -0,0 +1,295 @@ + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + */ + +/** + * TDataGridColumn class + * + * TDataGridColumn serves as the base class for the different column types of the TDataGrid control. + * TDataGridColumn defines the properties and methods that are common to all column types. + * In particular, it initializes header and footer cells according to + * HeaderText, HeaderStyle, FooterText, and FooterStyle. + * If HeaderImageUrl is specified, the image will be displayed instead in the header cell. + * The ItemStyle is applied to non-header and -footer items. + * + * When the datagrid enables sorting, if the SortExpression is not empty, + * the header cell will display a button (linkbutton or imagebutton) that will + * bubble sort command event to the datagrid. + * + * The framework provides the following TDataGridColumn descendant classes, + * - TBoundColumn, associated with a specific field in datasource and displays the corresponding data. + * - TEditCommandColumn, displaying edit/update/cancel command buttons + * - TButtonColumn, displaying generic command buttons that may be bound to specific field in datasource. + * - THyperLinkColumn, displaying a hyperlink that may be boudn to specific field in datasource. + * - TTemplateColumn, displaying content based on templates. + * + * To create your own column class, simply override {@link initializeCell()} method, + * which is the major logic for managing the data and presentation of cells in the column. + * + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +abstract class TDataGridColumn extends TComponent +{ + private $_owner=null; + private $_viewState=array(); + + /** + * @return string the text to be displayed in the header of this column + */ + public function getHeaderText() + { + return $this->getViewState('HeaderText',''); + } + + /** + * @param string text to be displayed in the header of this column + */ + public function setHeaderText($value) + { + $this->setViewState('HeaderText',$value,''); + $this->onColumnChanged(); + } + + /** + * @return string the url of the image to be displayed in header + */ + public function getHeaderImageUrl() + { + return $this->getViewState('HeaderImageUrl',''); + } + + /** + * @param string the url of the image to be displayed in header + */ + public function setHeaderImageUrl($value) + { + $this->setViewState('HeaderImageUrl',$value,''); + $this->onColumnChanged(); + } + + /** + * @return TTableItemStyle the style for header + */ + public function getHeaderStyle() + { + if(($style=$this->getViewState('HeaderStyle',null))===null) + { + $style=new TTableItemStyle; + $this->setViewState('HeaderStyle',$style,null); + } + return $style; + } + + /** + * @return string the text to be displayed in the footer of this column + */ + public function getFooterText() + { + return $this->getViewState('FooterText',''); + } + + /** + * @param string text to be displayed in the footer of this column + */ + public function setFooterText($value) + { + $this->setViewState('FooterText',$value,''); + $this->onColumnChanged(); + } + + /** + * @return TTableItemStyle the style for footer + */ + public function getFooterStyle() + { + if(($style=$this->getViewState('FooterStyle',null))===null) + { + $style=new TTableItemStyle; + $this->setViewState('FooterStyle',$style,null); + } + return $style; + } + + /** + * @return TTableItemStyle the style for item + */ + public function getItemStyle() + { + if(($style=$this->getViewState('ItemStyle',null))===null) + { + $style=new TTableItemStyle; + $this->setViewState('ItemStyle',$style,null); + } + return $style; + } + + /** + * @param string the name of the field or expression for sorting + */ + public function setSortExpression($value) + { + $this->setViewState('SortExpression',$value,''); + $this->onColumnChanged(); + } + + /** + * @return string the name of the field or expression for sorting + */ + public function getSortExpression() + { + return $this->getViewState('SortExpression',''); + } + + /** + * @return boolean whether the column is visible. Defaults to true. + */ + public function getVisible($checkParents=true) + { + return $this->getViewState('Visible',true); + } + + /** + * @param boolean whether the column is visible + */ + public function setVisible($value) + { + $this->setViewState('Visible',TPropertyValue::ensureBoolean($value),true); + $this->onColumnChanged(); + } + + /** + * Returns a viewstate value. + * + * @param string the name of the viewstate value to be returned + * @param mixed the default value. If $key is not found in viewstate, $defaultValue will be returned + * @return mixed the viewstate value corresponding to $key + */ + protected function getViewState($key,$defaultValue=null) + { + return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue; + } + + /** + * Sets a viewstate value. + * + * Make sure that the viewstate value must be serializable and unserializable. + * @param string the name of the viewstate value + * @param mixed the viewstate value to be set + * @param mixed default value. If $value===$defaultValue, the item will be cleared from the viewstate. + */ + protected function setViewState($key,$value,$defaultValue=null) + { + if($value===$defaultValue) + unset($this->_viewState[$key]); + else + $this->_viewState[$key]=$value; + } + + protected function loadState($state) + { + $this->_viewState=$state; + } + + protected function saveState() + { + return $this->_viewState; + } + + protected function getOwner() + { + return $this->_owner; + } + + protected function setOwner(TDataGrid $value) + { + $this->_owner=$value; + } + + protected function onColumnChanged() + { + if($this->_owner) + $this->_owner->onColumnsChanged(); + } + + public function initialize() + { + } + + /** + * Initializes the specified cell to its initial values. + * The default implementation sets the content of header and footer cells. + * If sorting is enabled by the grid and sort expression is specified in the column, + * the header cell will show a link/image button. Otherwise, the header/footer cell + * will only show static text/image. + * This method can be overriden to provide customized intialization to column cells. + * @param TTableCell the cell to be initialized. + * @param integer the index to the Columns property that the cell resides in. + * @param string the type of cell (Header,Footer,Item,AlternatingItem,EditItem,SelectedItem) + */ + public function initializeCell($cell,$columnIndex,$itemType) + { + switch($itemType) + { + case 'Header': + $sortExpression=$this->getSortExpression(); + $allowSorting=$sortExpression!=='' && (!$this->_owner || $this->_owner->getAllowSorting()); + if($allowSorting) + { + if(($url=$this->getHeaderImageUrl())!=='') + { + $button=Prado::createComponent('System.Web.UI.WebControls.TImageButton'); + $button->setImageUrl($url); + $button->setCommandName('Sort'); + $button->setCommandParameter($sortExpression); + $button->setCausesValidation(false); + $cell->getControls()->add($button); + } + else if(($text=$this->getHeaderText())!=='') + { + $button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton'); + $button->setText($text); + $button->setCommandName('Sort'); + $button->setCommandParameter($sortExpression); + $button->setCausesValidation(false); + $cell->getControls()->add($button); + } + else + $cell->setText(' '); + } + else + { + if(($url=$this->getHeaderImageUrl())!=='') + { + $image=Prado::createComponent('System.Web.UI.WebControls.TImage'); + $image->setImageUrl($url); + $cell->getControls()->add($image); + } + else + { + if(($text=$this->getHeaderText())==='') + $text=' '; + $cell->setText($text); + } + } + break; + case 'Footer': + if(($text=$this->getFooterText())==='') + $text=' '; + $cell->setText($text); + break; + } + } +} + +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TStyle.php b/framework/Web/UI/WebControls/TStyle.php index 1996ca47..3198f770 100644 --- a/framework/Web/UI/WebControls/TStyle.php +++ b/framework/Web/UI/WebControls/TStyle.php @@ -260,6 +260,7 @@ class TStyle extends TComponent */ public function reset() { + parent::reset(); $this->_fields=array(); $this->_font=null; $this->_class=null; @@ -578,6 +579,7 @@ class TTableItemStyle extends TStyle */ public function reset() { + parent::reset(); $this->_verticalAlign=null; $this->_horizontalAlign=null; $this->_wrap=null; -- cgit v1.2.3