<?php

Prado::using('Application.pages.ClassDefinition');

class Home extends TPage
{
	private $_classDefinition=null;

	public function getClassDefinition()
	{
		if(!$this->_classDefinition)
			$this->_classDefinition=new ClassDefinition;
		return $this->_classDefinition;
	}

	public function onInit($param)
	{
		parent::onInit($param);
		if(!$this->IsPostBack)
		{
			$properties=$this->ClassDefinition->Properties;
			$properties[]=new PropertyDefinition;
			$properties[]=new PropertyDefinition;
			$properties[]=new PropertyDefinition;
			$this->PropertyList->DataSource=$properties;
			$this->dataBind();
		}
	}

	public function propertyAction($sender,$param)
	{
		if($param->CommandName==='add')
			$this->ClassDefinition->Properties->add(new PropertyDefinition);
		if($param->CommandName==='remove')
			$this->ClassDefinition->Properties->removeAt($param->CommandParameter);
		else if($param->CommandName==='up')
		{
			$property=$this->ClassDefinition->Properties->itemAt($param->CommandParameter);
			$this->ClassDefinition->Properties->removeAt($param->CommandParameter);
			$this->ClassDefinition->Properties->insertAt($param->CommandParameter-1,$property);
		}
		else if($param->CommandName==='down')
		{
			$property=$this->ClassDefinition->Properties->itemAt($param->CommandParameter);
			$this->ClassDefinition->Properties->removeAt($param->CommandParameter);
			$this->ClassDefinition->Properties->insertAt($param->CommandParameter+1,$property);
		}
		$this->PropertyList->DataSource=$this->ClassDefinition->Properties;
		$this->PropertyList->dataBind();
	}

	public function eventAction($sender,$param)
	{
		if($param->CommandName==='add')
			$this->ClassDefinition->Events->add(new EventDefinition);
		else if($param->CommandName==='remove')
			$this->ClassDefinition->Events->removeAt($param->CommandParameter);
		else if($param->CommandName==='up')
		{
			$property=$this->ClassDefinition->Events->itemAt($param->CommandParameter);
			$this->ClassDefinition->Events->removeAt($param->CommandParameter);
			$this->ClassDefinition->Events->insertAt($param->CommandParameter-1,$property);
		}
		else if($param->CommandName==='down')
		{
			$property=$this->ClassDefinition->Events->itemAt($param->CommandParameter);
			$this->ClassDefinition->Events->removeAt($param->CommandParameter);
			$this->ClassDefinition->Events->insertAt($param->CommandParameter+1,$property);
		}
		$this->EventList->DataSource=$this->ClassDefinition->Events;
		$this->EventList->dataBind();
	}

	public function onLoad($param)
	{
		parent::onLoad($param);
		//if($this->IsPostBack && $this->IsValid)
		if($this->IsPostBack)
		{
			$def=$this->ClassDefinition;
			$def->reset();
			$def->ClassName=$this->ClassName->Text;
			$def->ParentClass=$this->ParentClass->Text;
			$def->Interfaces=$this->Interfaces->Text;
			$def->Comments=$this->Comments->Text;
			$def->Author=$this->AuthorName->Text;
			$def->Email=$this->AuthorEmail->Text;
			foreach($this->PropertyList->Items as $item)
			{
				$property=new PropertyDefinition;
				$property->Name=$item->PropertyName->Text;
				$property->Type=$item->PropertyType->Text;
				$property->DefaultValue=$item->DefaultValue->Text;
				$property->ReadOnly=$item->ReadOnly->Checked;
				$property->IsProtected=$item->IsProtected->Checked;
				$property->Comments=$item->Comments->Text;
				$property->Storage=$item->Storage->Text;
				$def->Properties[]=$property;
			}
			foreach($this->EventList->Items as $item)
			{
				$event=new EventDefinition;
				$event->Name=$item->EventName->Text;
				$event->Comments=$item->Comments->Text;
				$def->Events[]=$event;
			}
		}
	}

	public function generateCode($sender,$param)
	{
		$writer=Prado::createComponent('TTextWriter');
		$this->ClassDefinition->render($writer);
		$this->SourceCode->Text=$writer->flush();
	}
}