From ae43fa72cdae13bace16a5b8250170e472bb2b87 Mon Sep 17 00:00:00 2001 From: wei <> Date: Sun, 14 May 2006 00:30:53 +0000 Subject: refactor active controls. --- .../Web/UI/ActiveControls/TBaseActiveControl.php | 205 +++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 framework/Web/UI/ActiveControls/TBaseActiveControl.php (limited to 'framework/Web/UI/ActiveControls/TBaseActiveControl.php') diff --git a/framework/Web/UI/ActiveControls/TBaseActiveControl.php b/framework/Web/UI/ActiveControls/TBaseActiveControl.php new file mode 100644 index 00000000..c5a62ade --- /dev/null +++ b/framework/Web/UI/ActiveControls/TBaseActiveControl.php @@ -0,0 +1,205 @@ +_control = $control; + $this->_options = new TMap; + } + + protected function setOption($name,$value,$default=null) + { + $value = is_null($value) ? $default : $value; + if(!is_null($value)) + $this->_options->add($name,$value); + } + + protected function getOption($name,$default=null) + { + $item = $this->_options->itemAt($name); + return is_null($item) ? $default : $item; + } + + protected function getPage() + { + return $this->_control->getPage(); + } + + protected function getControl() + { + return $this->_control; + } + + /** + * @param boolean true to allow fine grain callback updates. + */ + public function setEnableUpdate($value) + { + $this->setOption('EnableUpdate', TPropertyValue::ensureBoolean($value), true); + } + + /** + * @return true to allow fine grain callback updates. + */ + public function getEnableUpdate() + { + return $this->getOption('EnableUpdate', true); + } + + public function canUpdateClientSide() + { + return $this->getControl()->getIsInitialized() + && $this->getPage()->getIsCallback() + && $this->getEnableUpdate(); + } +} + + +class TBaseActiveCallbackControl extends TBaseActiveControl +{ + /** + * Callback client-side options can be set by setting the properties of + * the ClientSide property. E.g. + * See {@link TCallbackClientSideOptions} for details on the properties of + * ClientSide. + * @return TCallbackClientSideOptions client-side callback options. + */ + public function getClientSide() + { + if(is_null($client = $this->getOption('ClientSide'))) + { + $client = $this->createClientSide(); + $this->setOption('ClientSide', $client); + } + return $client; + } + + /** + * @return TCallbackClientSideOptions callback client-side options. + */ + protected function createClientSide() + { + if(($id=$this->getCallbackOptions())!=='' + && ($control=$this->getControl()->findControl($id))!==null) + { + if($control instanceof TCallbackOptions) + return $control->getClientSide(); + } + return new TCallbackClientSideOptions; + } + + /** + * Sets the ID of a TCallbackOptions component to duplicate the client-side + * options for this control. The {@link getClientSide ClientSide} + * subproperties has precendent over the CallbackOptions property. + * @param string ID of a TCallbackOptions control from which ClientSide + * options are cloned. + */ + public function setCallbackOptions($value) + { + $this->setOption('CallbackOptions', $value, ''); + } + + /** + * @return string ID of a TCallbackOptions control from which ClientSide + * options are cloned. + */ + public function getCallbackOptions() + { + return $this->getOption('CallbackOptions', ''); + } + + /** + * @return boolean whether callback event trigger by this button will cause + * input validation, default is true + */ + public function getCausesValidation() + { + return $this->getOption('CausesValidation',true); + } + + /** + * @param boolean whether callback event trigger by this button will cause + * input validation + */ + public function setCausesValidation($value) + { + $this->setOption('CausesValidation',TPropertyValue::ensureBoolean($value),true); + } + + /** + * @return string the group of validators which the button causes validation + * upon callback + */ + public function getValidationGroup() + { + return $this->getOption('ValidationGroup',''); + } + + /** + * @param string the group of validators which the button causes validation + * upon callback + */ + public function setValidationGroup($value) + { + $this->getOption('ValidationGroup',$value,''); + } + + /** + * @return boolean whether to perform validation if the callback is + * requested. + */ + public function canCauseValidation() + { + if($this->getCausesValidation()) + { + $group=$this->getValidationGroup(); + return $this->getPage()->getValidators($group)->getCount()>0; + } + else + return false; + } + + /** + * @return array list of callback javascript options. + */ + protected function getClientSideOptions() + { + $options = $this->getClientSide()->getOptions()->toArray(); + $validate = $this->getCausesValidation(); + $options['CausesValidation']= $validate ? '' : false; + $options['ValidationGroup']=$this->getValidationGroup(); + return $options; + } + + public function registerCallbackClientScript($options=null) + { + $cs = $this->getPage()->getClientScript(); + if(is_array($options)) + $options = array_merge($this->getClientSideOptions(),$options); + else + $options = $this->getClientSideOptions(); + $cs->registerCallbackControl(get_class($this->getControl()), $options); + } + + /** + * Returns the javascript statement to invoke a callback request for this + * control. Additional options for callback can be set via subproperties of + * {@link getClientSide ClientSide} property. E.g. ClientSide. + * OnSuccess="..." + * @return string javascript statement to invoke a callback. + */ + public function getJavascript() + { + $client = $this->getPage()->getClientScript(); + return $client->getCallbackReference($this->getControl(),$this->getClientSideOptions()); + } +} + +?> \ No newline at end of file -- cgit v1.2.3