* @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
*/
/**
* TCheckBox class
*
* TCheckBox creates a check box on the page.
* You can specify the caption to display beside the check box by setting
* the Text property. The caption can appear either on the right
* or left of the check box, which is determined by the TextAlign
* property.
*
* To determine whether the TCheckBox component is checked,
* test the Checked property. The OnCheckedChanged event
* is raised when the Checked state of the TCheckBox component changes
* between posts to the server. You can provide an event handler for
* the OnCheckedChanged event to to programmatically
* control the actions performed when the state of the TCheckBox component changes
* between posts to the server.
*
* Note, Text will be HTML encoded before it is displayed in the TCheckBox component.
* If you don't want it to be so, set EncodeText to false.
*
* Namespace: System.Web.UI.WebControls
*
* Properties
* - Text, string, kept in viewstate
*
Gets or sets the text caption displayed in the TCheckBox component.
* - EncodeText, boolean, default=true, kept in viewstate
*
Gets or sets the value indicating whether Text should be HTML-encoded when rendering.
* - TextAlign, Left|Right, default=Right, kept in viewstate
*
Gets or sets the alignment of the text label associated with the TCheckBox component.
* - Checked, boolean, default=false, kept in viewstate
*
Gets or sets a value indicating whether the TCheckBox component is checked.
* - AutoPostBack, boolean, default=false, kept in viewstate
*
Gets or sets a value indicating whether the TCheckBox automatically posts back to the server when clicked.
*
* Events
* - OnCheckedChanged Occurs when the value of the Checked property changes between posts to the server.
*
* Examples
* - On a page template file, insert the following line to create a TCheckBox component,
*
*
*
* The checkbox will show "Agree" text on its right side. If the user makes any change
* to the Checked state, the checkAgree() method of the page class will be invoked automatically.
*
* TFont encapsulates the CSS style fields related with font settings.
*
* @author Qiang Xue
* @version $Revision: $ $Date: $
* @package System.Web.UI.WebControls
* @since 3.0
*/
class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable
{
public static $TEXT_ALIGN=array('Left','Right');
protected function getTagName()
{
return 'input';
}
protected function 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 control has been changed
*/
public function loadPostData($key,$values)
{
$checked=$this->getChecked();
if(isset($values[$key])!=$checked)
{
$this->setChecked(!$checked);
return true;
}
else
return false;
}
/**
* Raises postdata changed event.
* This method calls {@link onCheckedChanged} method.
* 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->onCheckedChanged(new TEventParameter);
}
/**
* This method is invoked when the value of the Checked property changes between posts to the server.
* The method raises 'CheckedChanged' event to fire up the event delegates.
* If you override this method, be sure to call the parent implementation
* so that the event delegates can be invoked.
* @param TEventParameter event parameter to be passed to the event handlers
*/
protected function onCheckedChanged($param)
{
$this->raiseEvent('CheckedChanged',$this,$param);
}
/**
* Returns the value of the property that needs validation.
* @return mixed the property value to be validated
*/
public function getValidationPropertyValue()
{
return $this->getChecked();
}
/**
* @return string the text caption of the checkbox
*/
public function getText()
{
return $this->getViewState('Text','');
}
/**
* Sets the text caption of the checkbox.
* @param string the text caption to be set
*/
public function setText($value)
{
$this->setViewState('Text',$value,'');
}
/**
* @return string the alignment of the text caption
*/
public function getTextAlign()
{
return $this->getViewState('TextAlign','Right');
}
/**
* Sets the text alignment of the checkbox
* @param string either 'Left' or 'Right'
*/
public function setTextAlign($value)
{
$this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,self::$TEXT_ALIGN),'Right');
}
/**
* @return boolean whether the checkbox is checked
*/
public function getChecked()
{
return $this->getViewState('Checked',false);
}
/**
* Sets a value indicating whether the checkbox is to be checked or not.
* @param boolean whether the checkbox is to be checked or not.
*/
public function setChecked($value)
{
$this->setViewState('Checked',$value,false);
}
/**
* @return boolean whether clicking on the checkbox will post the page.
*/
public function getAutoPostBack()
{
return $this->getViewState('AutoPostBack',false);
}
/**
* Sets a value indicating whether clicking on the checkbox will post the page.
* @param boolean whether clicking on the checkbox will post the page.
*/
public function setAutoPostBack($value)
{
$this->setViewState('AutoPostBack',$value,false);
}
/**
* @return boolean whether postback event trigger by this checkbox 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 checkbox will cause input validation.
* @param boolean whether postback event trigger by this checkbox will cause input validation.
*/
public function setCausesValidation($value)
{
$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
}
/**
* @return string the group of validators which the checkbox causes validation upon postback
*/
public function getValidationGroup()
{
return $this->getViewState('ValidationGroup','');
}
/**
* @param string the group of validators which the checkbox causes validation upon postback
*/
public function setValidationGroup($value)
{
$this->setViewState('ValidationGroup',$value,'');
}
/**
* Returns the attributes to be rendered.
* This method overrides the parent's implementation.
* @return ArrayObject attributes to be rendered
*/
protected function getAttributesToRender()
{
$attributes=parent::getAttributesToRender();
if(isset($attributes['id'])) unset($attributes['id']);
if(isset($attributes['accesskey'])) unset($attributes['accesskey']);
if(isset($attributes['tabindex'])) unset($attributes['tabindex']);
return $attributes;
}
/**
* Renders the body content of the control.
* This method overrides the parent's implementation.
* @return string the rendering result.
*/
protected function renderBody()
{
$name=$this->getUniqueID();
$disabled=!$this->isEnabled();
$id=$this->getClientID();
$input="isChecked())
$input.=" checked=\"checked\"";
if($disabled)
$input.=" disabled=\"disabled\"";
if($this->isAutoPostBack())
{
$page=$this->getPage();
$script=$page->getPostBackClientEvent($this,'');
$input.=" onclick=\"javascript:$script\"";
}
$accessKey=$this->getAccessKey();
if(strlen($accessKey))
$input.=" accesskey=\"$accessKey\"";
$tabIndex=$this->getTabIndex();
if(!empty($tabIndex))
$input.=" tabindex=\"$tabIndex\"";
$input.='/>';
$text=$this->isEncodeText()?pradoEncodeData($this->getText()):$this->getText();
if(strlen($text))
{
$label="";
if($this->getTextAlign()=='Left')
$input="{$label}{$input}";
else
$input.=$label;
}
return $input;
}
protected function renderControl($writer)
{
$this->addAttributesToRender($writer);
$page=$this->getPage();
$page->ensureRenderInForm($this);
$needSpan=true;
if($this->getHasStyle())
{
$this->getStyle()->addAttributesToRender($writer);
$needSpan=true;
}
if(!$this->getEnabled(true))
{
$writer->addAttribute('disabled','disabled');
$needSpan=true;
}
if(($tooltip=$this->getToolTip())!=='')
{
$writer->addAttribute('title',$tooltip);
$needSpan=true;
}
$onclick=null;
if($this->getHasAttributes())
{
$attributes=$this->getAttributes();
$value=$attributes->remove('value');
$onclick=$attributes->remove('onclick');
if($attributes->getCount())
{
foreach($attributes as $name=>$value)
$writer->addAttribute($name,$value);
}
$needSpan=true;
if($value!==null)
$attributes->add('value',$value);
}
if($needSpan)
$writer->renderBeginTag('span');
$clientID=$this->getClientID();
if(($text=$this->getText())!=='')
{
if($this->getTextAlign()==='Left')
{
$this->renderLabel($writer,$text,$clientID);
$this->renderInputTag($writer,$clientID,$onclick);
}
else
{
$this->renderInputTag($writer,$clientID,$onclick);
$this->renderLabel($writer,$text,$clientID);
}
}
else
$this->renderInputTag($writer,$clientID,$onclick);
if($needSpan)
$writer->renderEndTag();
}
private function renderLabel($writer,$text,$clientID)
{
$writer->addAttribute('for',$clientID);
// todo: custom label attributes rendering
$writer->renderBeginTag('label');
$writer->write($text);
$writer->renderEndTag();
}
protected function renderInputTag($writer,$clientID,$onclick)
{
if($clientID!=='')
$writer->addAttribute('id',$clientID);
$writer->addAttribute('type','checkbox');
if(($uniqueID=$this->getUniqueID())!=='')
$writer->addAttribute('name',$uniqueID);
//todo: render value attribute here
if($this->getChecked())
$writer->addAttribute('checked','checked');
if(!$this->getEnabled(true))
$writer->addAttribute('disabled','disabled');
$page=$this->getPage();
if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())
{
$option=new TPostBackOptions($this);
if($this->getCausesValidation() && $page->getValidators($this->getValidationGroup())->getCount())
{
$option->PerformValidation=true;
$option->ValidationGroup=$this->getValidationGroup;
}
if($page->getForm())
$option->AutoPostBack=true;
if(!empty($onclick))
$onclick=rtrim($onclick,';').';';
$onclick.=$page->getClientScript()->getPostBackEventReference($this,'',$option,false);
}
if(!empty($onclick))
$writer->addAttribute('onclick','javascript:'.$onclick);
if(($accesskey=$this->getAccessKey())!=='')
$writer->addAttribute('accesskey',$accesskey);
if(($tabindex=$this->getTabIndex())>0)
$writer->addAttribute('tabindex',$tabindex);
//todo: render input attributes
$writer->renderBeginTag('input');
$writer->renderEndTag();
}
// todo: onprerender???
}
?>