<?php class ClassDefinition extends TComponent { private $_className='ClassName'; private $_parentClass='TWebControl'; private $_interfaces=''; private $_properties=null; private $_events=null; private $_email=''; private $_author=''; private $_comments=''; public function reset() { $this->_className='ClassName'; $this->_parentClass='TWebControl'; $this->_interfaces=''; $this->_properties=new TList; $this->_events=new TList; $this->_email=''; $this->_author=''; $this->_comments=''; } public function render($writer) { $this->renderComments($writer); $this->renderClass($writer); } protected function renderComments($writer) { $str ="/**\n"; $str.=" * Class {$this->ClassName}.\n"; if($this->Comments!=='') { $str.=" *\n"; $str.=" * ".implode("\n * ",explode("\n",wordwrap($this->Comments))); $str.="\n *\n"; } if($this->Author!=='') { $str.=" * @author {$this->Author}"; if($this->Email!=='') $str.=" <{$this->Email}>"; $str.="\n"; } $str.=" * @version \$Revision: \$ \$Date: \$\n"; $str.=" */\n"; $writer->write($str); } protected function renderClass($writer) { $writer->write("class {$this->ClassName}"); if($this->ParentClass!=='') $writer->write(" extends {$this->ParentClass}"); if($this->Interfaces!=='') $writer->write(" implements {$this->Interfaces}"); $writer->write("\n{\n"); $this->renderVariables($writer); $this->renderProperties($writer); $this->renderEvents($writer); $writer->write("}\n"); } private function getVariableName($propertyName) { return '_'.strtolower($propertyName[0]).substr($propertyName,1); } protected function renderVariables($writer) { foreach($this->Properties as $property) { if($property->Storage==='Memory') { $name=$this->getVariableName($property->Name); $value=$this->getValueAsString($property->DefaultValue,$property->Type); $writer->write("\t/**\n\t * @var {$property->Type} {$property->Comments}\n\t */\n"); $writer->write("\tprivate \$$name=$value;\n"); } } } private function getValueAsString($value,$type) { switch($type) { case 'integer': $value=TPropertyValue::ensureInteger($value); break; case 'float': $value=TPropertyValue::ensureFloat($value); break; case 'boolean': if(TPropertyValue::ensureBoolean($value)) $value='true'; else $value='false'; break; case 'enumerable': $value="'$value'"; break; case 'mixed': $value='null'; break; case 'string': $value="'$value'"; break; } return "$value"; } private function getValueConversionString($type) { switch($type) { case 'integer': return 'TPropertyValue::ensureInteger($value)'; case 'float': return 'TPropertyValue::ensureFloat($value)'; case 'boolean': return 'TPropertyValue::ensureBoolean($value)'; case 'enumerable': return 'TPropertyValue::ensureEnum($value)'; case 'mixed': return '$value'; case 'string': return 'TPropertyValue::ensureString($value)'; } } protected function renderProperties($writer) { foreach($this->Properties as $property) { $name=$property->Name; if($name==='') continue; $comments=implode("\n\t * ",explode("\n",wordwrap($property->Comments))); $access=$property->IsProtected?'protected':'public'; $setter='set'.$property->Name.'($value)'; $getter='get'.$property->Name.'()'; $value=$this->getValueAsString($property->DefaultValue,$property->Type); if($property->Storage==='ViewState') { $readStatement="return \$this->getViewState('$name',$value);"; $writeStatement="\$this->setViewState('$name',".$this->getValueConversionString($property->Type).",$value);"; } else if($property->Storage==='ControlState') { $readStatement="return \$this->getControlState('$name',$value);"; $writeStatement="\$this->setControlState('$name',".$this->getValueConversionString($property->Type).",$value);"; } else { $varname=$this->getVariableName($property->Name); $readStatement="return \$this->$varname;"; $writeStatement="\$this->$varname=".$this->getValueConversionString($property->Type).";"; } $writer->write("\n\t/**\n\t * @return {$property->Type} $comments Defaults to $value.\n\t */\n"); $writer->write("\t$access function $getter\n\t{\n\t\t$readStatement\n\t}\n"); if(!$property->ReadOnly) { $writer->write("\n\t/**\n\t * @param {$property->Type} $comments\n\t */\n"); $writer->write("\t$access function $setter\n\t{\n\t\t$writeStatement\n\t}\n"); } } } protected function renderEvents($writer) { foreach($this->Events as $event) { $name=$event->Name; if($name==='') continue; if(strncasecmp($name,'on',2)!==0) $name='On'.$name; else { $name[0]='O'; $name[1]='n'; } $methodName=$name; $methodName[0]='o'; $comments=implode("\n\t * ",explode("\n",wordwrap($event->Comments))); $writer->write("\n\t/**\n\t * Raises <b>$name</b> event.\n\t * $comments\n\t * @param TEventParameter event parameter\n\t */\n"); $writer->write("\tpublic function $methodName(\$param)\n\t{\n\t\t\$this->raiseEvent('$name',\$this,\$param);\n\t}\n"); } } public function getClassName() { return $this->_className; } public function setClassName($value) { $this->_className=trim($value); } public function getParentClass() { return $this->_parentClass; } public function setParentClass($value) { $this->_parentClass=trim($value); } public function getInterfaces() { return $this->_interfaces; } public function setInterfaces($value) { $this->_interfaces=$value; } public function getProperties() { if(!$this->_properties) $this->_properties=new TList; return $this->_properties; } public function getEvents() { if(!$this->_events) $this->_events=new TList; return $this->_events; } public function getComments() { return $this->_comments; } public function setComments($value) { $this->_comments=$value; } public function getAuthor() { return $this->_author; } public function setAuthor($value) { $this->_author=trim($value); } public function getEmail() { return $this->_email; } public function setEmail($value) { $this->_email=trim($value); } } class EventDefinition extends TComponent { private $_name=''; private $_comments=''; public function getName() { return $this->_name; } public function setName($value) { $this->_name=ucfirst(trim($value)); } public function getComments() { return $this->_comments; } public function setComments($value) { $this->_comments=$value; } } class PropertyDefinition extends TComponent { private $_name=''; private $_type='string'; private $_default=''; private $_readOnly=false; private $_protected=false; private $_storage='ViewState'; private $_comments=''; public function getName() { return $this->_name; } public function setName($value) { $this->_name=ucfirst(trim($value)); } public function getType() { return $this->_type; } public function setType($value) { $this->_type=trim($value); } public function getDefaultValue() { return $this->_default; } public function setDefaultValue($value) { $this->_default=trim($value); } public function getReadOnly() { return $this->_readOnly; } public function setReadOnly($value) { $this->_readOnly=TPropertyValue::ensureBoolean($value); } public function getIsProtected() { return $this->_protected; } public function setIsProtected($value) { $this->_protected=TPropertyValue::ensureBoolean($value); } public function getStorage() { return $this->_storage; } public function setStorage($value) { $this->_storage=trim($value); } public function getComments() { return $this->_comments; } public function setComments($value) { $this->_comments=$value; } }