From 55c4ac1bfe565f1ca7f537fdd8b7a201be28e581 Mon Sep 17 00:00:00 2001 From: xue <> Date: Thu, 10 Nov 2005 12:47:19 +0000 Subject: Initial import of prado framework --- framework/Web/UI/WebControls/TTextBox.php | 444 ++++++++++++++++++++++++++++++ 1 file changed, 444 insertions(+) create mode 100644 framework/Web/UI/WebControls/TTextBox.php (limited to 'framework/Web/UI/WebControls/TTextBox.php') diff --git a/framework/Web/UI/WebControls/TTextBox.php b/framework/Web/UI/WebControls/TTextBox.php new file mode 100644 index 00000000..700906e8 --- /dev/null +++ b/framework/Web/UI/WebControls/TTextBox.php @@ -0,0 +1,444 @@ + + * @link http://www.xisc.com/ + * @copyright Copyright © 2004-2005, Qiang Xue + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + */ + +/** + * TTextBox class + * + * TTextBox displays a text box on the Web page for user input. + * The text displayed in the TTextBox control is determined by the Text property. + * You can create a SingleLine, a MultiLine, or a Password text box + * by setting the TextMode property. + * If the TTextBox control is a multiline text box, the number of rows + * it displays is determined by the Rows property, and the Wrap property + * can be used to determine whether to wrap the text in the component. + * + * To specify the display width of the text box, in characters, set the Columns property. + * To prevent the text displayed in the component from being modified, + * set the ReadOnly property to true. If you want to limit the user input + * to a specified number of characters, set the MaxLength property. To use AutoComplete + * feature, set the AutoCompleteType property. + * + * If AutoPostBack is set true, updating the text box and then changing the focus out of it + * will cause postback action. And if CausesValidation is true, validation will also + * be processed, which can be further restricted within a ValidationGroup. + * + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable +{ + /** + * @var array enumeration of the valid AutoCompleteType values. + */ + public static $AUTO_COMPLETE_TYPE=array('BusinessCity','BusinessCountryRegion','BusinessFax','BusinessPhone','BusinessState','BusinessStreetAddress','BusinessUrl','BusinessZipCode','Cellular','Company','Department','Disabled','DisplayName','Email','FirstName','Gender','HomeCity','HomeCountryRegion','HomeFax','Homepage','HomePhone','HomeState','HomeStreetAddress','HomeZipCode','JobTitle','LastName','MiddleName','None','Notes','Office','Pager','Search'); + /** + * @var array enumeration of the valid TextMode values. + */ + public static $TEXT_MODE=array('SingleLine','MultiLine','Password'); + + /** + * @return string tag name of the textbox + */ + protected function getTagName() + { + return ($this->getTextMode()==='MultiLine')?'textarea':'input'; + } + + /** + * Processes an object that is created during parsing template. + * This overrides the parent implementation by forbidding any body components. + * @param mixed the newly created object in template + * @throws TInvalidOperationException if a component is found within body + */ + public function addParsedObject($object) + { + if(!is_string($object)) + throw new TInvalidOperationException('body_contents_not_allowed',get_class($this).':'.$this->getUniqueID()); + } + + /** + * Adds attribute name-value pairs to renderer. + * This overrides the parent implementation with additional textbox specific attributes. + * @param THtmlTextWriter the writer used for the rendering purpose + */ + protected function addAttributesToRender($writer) + { + $page=$this->getPage(); + $page->ensureRenderInForm($this); + if(($uid=$this->getUniqueID())!=='') + $writer->addAttribute('name',$uid); + if(($textMode=$this->getTextMode())==='MultiLine') + { + if(($rows=$this->getRows())>0) + $writer->addAttribute('rows',$rows); + if(($cols=$this->getColumns())>0) + $writer->addAttribute('cols',$cols); + if(!$this->getWrap()) + $writer->addAttribute('wrap','off'); + } + else + { + if($textMode==='SingleLine') + { + $writer->addAttribute('type','text'); + if(($text=$this->getText())!=='') + $writer->addAttribute('value',$text); + if(($act=$this->getAutoCompleteType())!=='None') + { + if($act==='Disabled') + $writer->addAttribute('autocomplete','off'); + else if($act==='Search') + $writer->addAttribute('vcard_name','search'); + else if($act==='HomeCountryRegion') + $writer->addAttribute('vcard_name','HomeCountry'); + else if($act==='BusinessCountryRegion') + $writer->addAttribute('vcard_name','BusinessCountry'); + else + { + if(($pos=strpos($act,'Business'))===0) + $act='Business'.'.'.substr($act,8); + else if(($pos=strpos($act,'Home'))===0) + $act='Home'.'.'.substr($act,4); + $writer->addAttribute('vcard_name','vCard.'.$act); + } + } + } + else + { + $writer->addAttribute('type','password'); + } + if(($cols=$this->getColumns())>0) + $writer->addAttribute('size',$cols); + if(($maxLength=$this->getMaxLength())>0) + $writer->addAttribute('maxlength',$maxLength); + } + if($this->getReadOnly()) + $writer->addAttribute('readonly','readonly'); + if(!$this->getEnabled(true) && $this->getEnabled()) // in this case parent will not render 'disabled' + $writer->addAttribute('disabled','disabled'); + if($this->getAutoPostBack() && $page->getClientSupportsJavaScript()) + { + $onchange=''; + $onkeypress='if (WebForm_TextBoxKeyHandler() == false) return false;'; + if($this->getHasAttributes()) + { + $attributes=$this->getAttributes(); + $onchange=$attributes->itemAt('onchange'); + if($onchange!=='') + $onchange=rtrim($onchange,';').';'; + $attributes->remove('onchange'); + $onkeypress.=$attributes->itemAt('onkeypress'); + $attributes->remove('onkeypress'); + } + + $option=new TPostBackOptions($this); + if($this->getCausesValidation()) + { + $option->PerformValidation=true; + $option->ValidationGroup=$this->getValidationGroup(); + } + if($page->getForm()) + $option->AutoPostBack=true; + $onchange.=$page->getClientScript()->getPostBackEventReference($option); + $writer->addAttribute('onchange',$onchange); + $writer->addAttribute('onkeypress',$onkeypress); + } + parent::addAttributesToRender($writer); + } + + /** + * Loads user input data. + * This method is primarly used by framework developers. + * @param string the key that can be used to retrieve data from the input data collection + * @param array the input data collection + * @return boolean whether the data of the component has been changed + */ + public function loadPostData($key,$values) + { + $value=$values[$key]; + if(!$this->getReadOnly() && $this->getText()!==$value) + { + $this->setText($value); + return true; + } + else + return false; + } + + protected function onPreRender($param) + { + parent::onPreRender($param); + if(($page=$this->getPage()) && $this->getEnabled(true)) + { + // TODO + //if($this->getTextMode()==='Password' || ($this->hasEventHandler('TextChanged') && $this->getVisible())) + // $page->registerEnabledControl($this); + if($this->getAutoPostBack()) + { + $page->registerWebFormsScript(); + $page->registerPostBackScript(); + $page->registerFocusScript(); + } + } + } + + /** + * Returns the value to be validated. + * This methid is required by IValidatable interface. + * @return mixed the value of the property to be validated. + */ + public function getValidationPropertyValue() + { + return $this->getText(); + } + + /** + * This method is invoked when the value of the Text property changes on postback. + * The method raises 'TextChanged' event. + * If you override this method, be sure to call the parent implementation to ensure + * the invocation of the attached event handlers. + * @param TEventParameter event parameter to be passed to the event handlers + */ + protected function onTextChanged($param) + { + $this->raiseEvent('TextChanged',$this,$param); + } + + /** + * Raises postdata changed event. + * This method is required by IPostBackDataHandler interface. + * It is invoked by the framework when Text property is changed on postback. + * This method is primarly used by framework developers. + */ + public function raisePostDataChangedEvent() + { + $page=$this->getPage(); + if($this->getAutoPostBack() && !$page->getIsPostBackEventControlRegistered()) + { + $page->setAutoPostBackControl($this); + if($this->getCausesValidation()) + $page->validate($this->getValidationGroup()); + } + $this->onTextChanged(new TEventParameter); + } + + /** + * Renders the body content of the textbox when it is in MultiLine text mode. + * @param THtmlTextWriter the writer for rendering + */ + protected function renderContents($writer) + { + if($this->getTextMode()==='MultiLine') + $writer->write(THttpUtility::htmlEncode($this->getText())); + } + + /** + * @return string the AutoComplete type of the textbox + */ + public function getAutoCompleteType() + { + return $this->getViewState('AutoCompleteType','None'); + } + + /** + * @param string the AutoComplete type of the textbox, default value is 'None'. + * Valid values include: + * 'BusinessCity','BusinessCountryRegion','BusinessFax','BusinessPhone', + * 'BusinessState','BusinessStreetAddress','BusinessUrl','BusinessZipCode', + * 'Cellular','Company','Department','Disabled','DisplayName','Email', + * 'FirstName','Gender','HomeCity','HomeCountryRegion','HomeFax','Homepage', + * 'HomePhone','HomeState','HomeStreetAddress','HomeZipCode','JobTitle', + * 'LastName','MiddleName','None','Notes','Office','Pager','Search' + * @throws TInvalidDataValueException if the input parameter is not a valid AutoComplete type + */ + public function setAutoCompleteType($value) + { + $this->setViewState('AutoCompleteType',TPropertyValue::ensureEnum($value,self::$AUTO_COMPLETE_TYPE),'None'); + } + + /** + * @return boolean a value indicating whether an automatic postback to the server + * will occur whenever the user modifies the text in the TTextBox control and + * then tabs out of the component. + */ + public function getAutoPostBack() + { + return $this->getViewState('AutoPostBack',false); + } + + /** + * Sets the value indicating if postback automatically. + * An automatic postback to the server will occur whenever the user + * modifies the text in the TTextBox control and then tabs out of the component. + * @param boolean the value indicating if postback automatically + */ + public function setAutoPostBack($value) + { + $this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false); + } + + /** + * @return boolean whether postback event trigger by this text box will cause input validation, default is true. + */ + public function getCausesValidation() + { + return $this->getViewState('CausesValidation',true); + } + + /** + * Sets the value indicating whether postback event trigger by this text box will cause input validation. + * @param boolean whether postback event trigger by this button will cause input validation. + */ + public function setCausesValidation($value) + { + $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); + } + + /** + * @return integer the display width of the text box in characters, default is 0 meaning not set. + */ + public function getColumns() + { + return $this->getViewState('Columns',0); + } + + /** + * Sets the display width of the text box in characters. + * @param integer the display width, set it 0 to clear the setting + */ + public function setColumns($value) + { + $this->setViewState('Columns',TPropertyValue::ensureInteger($value),0); + } + + /** + * @return integer the maximum number of characters allowed in the text box, default is 0 meaning not set. + */ + public function getMaxLength() + { + return $this->getViewState('MaxLength',0); + } + + /** + * Sets the maximum number of characters allowed in the text box. + * @param integer the maximum length, set it 0 to clear the setting + */ + public function setMaxLength($value) + { + $this->setViewState('MaxLength',TPropertyValue::ensureInteger($value),0); + } + + /** + * @return boolean whether the textbox is read only, default is false + */ + public function getReadOnly() + { + return $this->getViewState('ReadOnly',false); + } + + /** + * @param boolean whether the textbox is read only + */ + public function setReadOnly($value) + { + $this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false); + } + + /** + * @return integer the number of rows displayed in a multiline text box, default is 4 + */ + public function getRows() + { + return $this->getViewState('Rows',4); + } + + /** + * Sets the number of rows displayed in a multiline text box. + * @param integer the number of rows, set it 0 to clear the setting + */ + public function setRows($value) + { + $this->setViewState('Rows',TPropertyValue::ensureInteger($value),4); + } + + /** + * @return string the text content of the TTextBox control. + */ + public function getText() + { + return $this->getViewState('Text',''); + } + + /** + * Sets the text content of the TTextBox control. + * @param string the text content + */ + public function setText($value) + { + $this->setViewState('Text',$value,''); + } + + /** + * @return string the behavior mode (SingleLine, MultiLine, or Password) of the TTextBox component. + */ + public function getTextMode() + { + return $this->getViewState('TextMode','SingleLine'); + } + + /** + * Sets the behavior mode (SingleLine, MultiLine, or Password) of the TTextBox component. + * @param string the text mode + * @throws TInvalidDataValueException if the input value is not a valid text mode. + */ + public function setTextMode($value) + { + $this->setViewState('TextMode',TPropertyValue::ensureEnum($value,self::$TEXT_MODE),'SingleLine'); + } + + /** + * @return string the group of validators which the text box causes validation upon postback + */ + public function getValidationGroup() + { + return $this->getViewState('ValidationGroup',''); + } + + /** + * @param string the group of validators which the text box causes validation upon postback + */ + public function setValidationGroup($value) + { + $this->setViewState('ValidationGroup',$value,''); + } + + /** + * @return boolean whether the text content wraps within a multiline text box. + */ + public function getWrap() + { + return $this->getViewState('Wrap',true); + } + + /** + * Sets the value indicating whether the text content wraps within a multiline text box. + * @param boolean whether the text content wraps within a multiline text box. + */ + public function setWrap($value) + { + $this->setViewState('Wrap',TPropertyValue::ensureBoolean($value),true); + } +} + +?> \ No newline at end of file -- cgit v1.2.3