* @link http://www.landwehr-software.de/ * @copyright Copyright © 2009 LANDWEHR Computer und Software GmbH * @license http://www.pradosoft.com/license/ * @package Prado\Web\UI\ActiveControls * @version $Id$ */ namespace Prado\Web\UI\ActiveControls; /** * Includes the following used classes */ Prado::using('System.Web.UI.WebControls.TTableRow'); Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); Prado::using('System.Web.UI.ActiveControls.TCallbackEventParameter'); /** * TActiveTableRow class. * * TActiveTableRow is the active counterpart to the original {@link TTableRow} control * and displays a table row. The table cells in the row can be accessed * via {@link getCells Cells}. The horizontal and vertical alignments of the row * are specified via {@link setHorizontalAlign HorizontalAlign} and * {@link setVerticalAlign VerticalAlign} properties, respectively. * * TActiveTableRow allows the contents of the table row to be changed during callback. When * {@link onRowSelected RowSelected} property is set, selecting (clicking on) the row will * perform a callback request causing {@link onRowSelected OnRowSelected} event to be fired. * * It will also respond to a bubbled {@link onCellSelected OnCellSelected} event of a * {@link TActiveTableCell} child control and fire a {@link onRowSelected OnRowSelected} event. * * TActiveTableRow allows the client-side row contents to be updated during a * callback response by getting a new writer, invoking the render method and flushing the * output, similar to a {@link TActivePanel} control. * * function callback_request($sender, $param) * { * $this->active_row->render($param->getNewWriter()); * } * * * Please refer to the original documentation of the regular counterpart for usage. * * @author LANDWEHR Computer und Software GmbH * @package Prado\Web\UI\ActiveControls * @version $Id$ * @since 3.1.9 */ class TActiveTableRow extends TTableRow implements ICallbackEventHandler, IActiveControl { /** * @var TTable parent table control containing the row */ private $_table; /** * Creates a new callback control, sets the adapter to TActiveControlAdapter. * */ public function __construct() { parent::__construct(); $this->setAdapter(new TActiveControlAdapter($this)); } /** * @return TBaseActiveCallbackControl standard callback control options. */ public function getActiveControl() { return $this->getAdapter()->getBaseActiveControl(); } /** * @return TCallbackClientSide client side request options. */ public function getClientSide() { return $this->getAdapter()->getBaseActiveControl()->getClientSide(); } /** * @return string corresponding javascript class name for this TActiveTableRow. */ protected function getClientClassName() { return 'Prado.WebUI.TActiveTableRow'; } /** * Raises the callback event. This method is required by {@link ICallbackEventHandler} * interface. It will raise {@link onRowSelected OnRowSelected} event with a * {@link TActiveTableRowEventParameter} containing the zero-based index of the * TActiveTableRow. * This method is mainly used by framework and control developers. * @param TCallbackEventParameter the event parameter */ public function raiseCallbackEvent($param) { $parameter = new TActiveTableRowEventParameter($this->getResponse(), $param->getCallbackParameter(), $this->getRowIndex()); $this->onRowSelected($parameter); } /** * This method overrides parent's implementation and raises the control's * callback event. This will fire the {@link onRowSelected OnRowSelected} * event if an appropriate event handler is implemented. * @param TControl the sender of the event * @param TEventParameter event parameter * @return boolean whether the event bubbling should stop here. */ public function bubbleEvent($sender, $param) { if ($param instanceof TActiveTableCellEventParameter) { $this->raiseCallbackEvent($param); return true; } else return false; } /** * This method is invoked when a callback is requested. The method raises * 'OnRowSelected' event to fire up the event handlers. If you override this * method, be sure to call the parent implementation so that the event * handler can be invoked. * @param TActiveTableRowEventParameter event parameter to be passed to the event handlers */ public function onRowSelected($param) { $this->raiseEvent('OnRowSelected', $this, $param); } /** * Ensure that the ID attribute is rendered and registers the javascript code * for initializing the active control if the event handler for the * {@link onRowSelected OnRowSelected} event is set. * @param THtmlWriter the writer responsible for rendering */ protected function addAttributesToRender($writer) { parent::addAttributesToRender($writer); $writer->addAttribute('id', $this->getClientID()); if ($this->hasEventHandler('OnRowSelected')) $this->getActiveControl()->registerCallbackClientScript($this->getClientClassName(), $this->getPostBackOptions()); } /** * Renders and replaces the row's content on the client-side. When render() is * called before the OnPreRender event, such as when render() is called during * a callback event handler, the rendering is defered until OnPreRender event * is raised. * @param THtmlWriter html writer */ public function render($writer) { if ($this->getHasPreRendered()) { parent::render($writer); if ($this->getActiveControl()->canUpdateClientSide()) $this->getPage()->getCallbackClient()->replaceContent($this, $writer); } else { $this->getPage()->getAdapter()->registerControlToRender($this, $writer); // If we update a TActiveTableRow on callback, we shouldn't update all childs, // because the whole content will be replaced by the parent. if ($this->getHasControls()) { foreach ($this->findControlsByType('IActiveControl', false) as $control) $control->getActiveControl()->setEnableUpdate(false); } } } /** * Returns postback specifications for the table row. * This method is used by framework and control developers. * @return array parameters about how the row defines its postback behavior. */ protected function getPostBackOptions() { $options['ID'] = $this->getClientID(); $options['EventTarget'] = $this->getUniqueID(); return $options; } /** * Returns the zero-based index of the TActiveTableRow within the {@link TTableRowCollection} * of the parent {@link TTable} control. Raises a {@link TConfigurationException} if the row * is no member of the row collection. * @return integer the zero-based index of the row */ public function getRowIndex() { foreach ($this->getTable()->getRows() as $key => $row) if ($row == $this) return $key; throw new TConfigurationException('tactivetablerow_control_notincollection', get_class($this), $this->getUniqueID()); } /** * Returns the parent {@link TTable} control by looping through all parents until a {@link TTable} * is found. Raises a {@link TConfigurationException} if no table control is found. * @return TTable the parent table control */ public function getTable() { if ($this->_table === null) { $table = $this->getParent(); while (!($table instanceof TTable) && $table !== null) { $table = $table->getParent(); } if ($table instanceof TTable) $this->_table = $table; else throw new TConfigurationException('tactivetablerow_control_outoftable', get_class($this), $this->getUniqueID()); } return $this->_table; } }