diff options
| -rw-r--r-- | framework/pradolite.php | 696 | 
1 files changed, 686 insertions, 10 deletions
diff --git a/framework/pradolite.php b/framework/pradolite.php index cc4bbb79..c80005e1 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@  <?php  /**   * File Name: pradolite.php - * Last Update: 2013/09/13 14:14:15 + * Last Update: 2013/10/18 15:00:54   * Generated By: buildscripts/phpbuilder/build.php   *   * This file is used in lieu of prado.php to boost PRADO application performance. @@ -475,9 +475,9 @@ class TApplicationComponent extends TComponent  		$fullPath=dirname($class->getFileName()).DIRECTORY_SEPARATOR.$assetPath;  		return $this->publishFilePath($fullPath);  	} -	public function publishFilePath($fullPath) +	public function publishFilePath($fullPath, $checkTimestamp=false)  	{ -		return Prado::getApplication()->getAssetManager()->publishFilePath($fullPath); +		return Prado::getApplication()->getAssetManager()->publishFilePath($fullPath, $checkTimestamp);  	}  }  abstract class TModule extends TApplicationComponent implements IModule @@ -1248,6 +1248,377 @@ class TTextWriter extends TComponent implements ITextWriter  		$this->write($str."\n");  	}  } +class TPriorityList extends TList  +{ +	private $_d=array(); +	private $_o=false; +	private $_fd=null; +	private $_c=0; +	private $_dp=10; +	private $_p=8; +	public function __construct($data=null,$readOnly=false,$defaultPriority=10,$precision=8) +	{ +		parent::__construct(); +		if($data!==null) +			$this->copyFrom($data); +		$this->setReadOnly($readOnly); +		$this->setPrecision($precision); +		$this->setDefaultPriority($defaultPriority); +	} +	public function count() +	{ +		return $this->getCount(); +	} +	public function getCount() +	{ +		return $this->_c; +	} +	public function getPriorityCount($priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		if(!isset($this->_d[$priority]) || !is_array($this->_d[$priority])) +			return false; +		return count($this->_d[$priority]); +	} +	public function getDefaultPriority() +	{ +		return $this->_dp; +	} +	protected function setDefaultPriority($value) +	{ +		$this->_dp=(string)round(TPropertyValue::ensureFloat($value),$this->_p); +	} +	public function getPrecision() +	{ +		return $this->_p; +	} +	protected function setPrecision($value) +	{ +		$this->_p=TPropertyValue::ensureInteger($value); +	} +	public function getIterator() +	{ +		return new ArrayIterator($this->flattenPriorities()); +	} +	public function getPriorities() +	{ +		$this->sortPriorities(); +		return array_keys($this->_d); +	} +	protected function sortPriorities() { +		if(!$this->_o) { +			ksort($this->_d,SORT_NUMERIC); +			$this->_o=true; +		} +	} +	protected function flattenPriorities() { +		if(is_array($this->_fd)) +			return $this->_fd; +		$this->sortPriorities(); +		$this->_fd=array(); +		foreach($this->_d as $priority => $itemsatpriority) +			$this->_fd=array_merge($this->_fd,$itemsatpriority); +		return $this->_fd; +	} +	public function itemAt($index) +	{ +		if($index>=0&&$index<$this->getCount()) { +			$arr=$this->flattenPriorities(); +			return $arr[$index]; +		} else +			throw new TInvalidDataValueException('list_index_invalid',$index); +	} +	public function itemsAtPriority($priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		return isset($this->_d[$priority])?$this->_d[$priority]:null; +	} +	public function itemAtIndexInPriority($index,$priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority), $this->_p); +		return !isset($this->_d[$priority])?false:( +				isset($this->_d[$priority][$index])?$this->_d[$priority][$index]:false +			); +	} +	public function add($item,$priority=null) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		return $this->insertAtIndexInPriority($item,false,$priority,true); +	} +	public function insertAt($index,$item) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if(($priority=$this->priorityAt($index,true))!==false) +			$this->insertAtIndexInPriority($item,$priority[1],$priority[0]); +		else +			throw new TInvalidDataValueException('list_index_invalid',$index); +	} +	public function insertAtIndexInPriority($item,$index=false,$priority=null,$preserveCache=false) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority), $this->_p); +		if($preserveCache) { +			$this->sortPriorities(); +			$cc=0; +			foreach($this->_d as $prioritykey=>$items) +				if($prioritykey>=$priority) +					break; +				else +					$cc+=count($items); +			if($index===false&&isset($this->_d[$priority])) { +				$c=count($this->_d[$priority]); +				$c+=$cc; +				$this->_d[$priority][]=$item; +			} else if(isset($this->_d[$priority])) { +				$c=$index+$cc; +				array_splice($this->_d[$priority],$index,0,array($item)); +			} else { +				$c = $cc; +				$this->_o = false; +				$this->_d[$priority]=array($item); +			} +			if($this->_fd&&is_array($this->_fd)) 				array_splice($this->_fd,$c,0,array($item)); +		} else { +			$c=null; +			if($index===false&&isset($this->_d[$priority])) { +				$cc=count($this->_d[$priority]); +				$this->_d[$priority][]=$item; +			} else if(isset($this->_d[$priority])) { +				$cc=$index; +				array_splice($this->_d[$priority],$index,0,array($item)); +			} else { +				$cc=0; +				$this->_o=false; +				$this->_d[$priority]=array($item); +			} +			if($this->_fd&&is_array($this->_fd)&&count($this->_d)==1) +				array_splice($this->_fd,$cc,0,array($item)); +			else +				$this->_fd=null; +		} +		$this->_c++; +		return $c; +	} +	public function remove($item,$priority=false) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if(($p=$this->priorityOf($item,true))!==false) +		{ +			if($priority!==false) { +				if($priority===null) +					$priority=$this->getDefaultPriority(); +				$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +				if($p[0]!=$priority) +					throw new TInvalidDataValueException('list_item_inexistent'); +			} +			$this->removeAtIndexInPriority($p[1],$p[0]); +			return $p[2]; +		} +		else +			throw new TInvalidDataValueException('list_item_inexistent'); +	} +	public function removeAt($index) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if(($priority=$this->priorityAt($index, true))!==false) +			return $this->removeAtIndexInPriority($priority[1],$priority[0]); +		throw new TInvalidDataValueException('list_index_invalid',$index); +	} +	public function removeAtIndexInPriority($index, $priority=null) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		if(!isset($this->_d[$priority])||$index<0||$index>=count($this->_d[$priority])) +			throw new TInvalidDataValueException('list_item_inexistent'); +				$value=array_splice($this->_d[$priority],$index,1); +		$value=$value[0]; +		if(!count($this->_d[$priority])) +			unset($this->_d[$priority]); +		$this->_c--; +		$this->_fd=null; +		return $value; +	} +	public function clear() +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		$d=array_reverse($this->_d,true); +		foreach($this->_d as $priority=>$items) { +			for($index=count($items)-1;$index>=0;$index--) +				$this->removeAtIndexInPriority($index,$priority); +			unset($this->_d[$priority]); +		} +	} +	public function contains($item) +	{ +		return $this->indexOf($item)>=0; +	} +	public function indexOf($item) +	{ +		if(($index=array_search($item,$this->flattenPriorities(),true))===false) +			return -1; +		else +			return $index; +	} +	public function priorityOf($item,$withindex = false) +	{ +		$this->sortPriorities(); +		$absindex = 0; +		foreach($this->_d as $priority=>$items) { +			if(($index=array_search($item,$items,true))!==false) { +				$absindex+=$index; +				return $withindex?array($priority,$index,$absindex,  +						'priority'=>$priority,'index'=>$index,'absindex'=>$absindex):$priority; +			} else +				$absindex+=count($items); +		} +		return false; +	} +	public function priorityAt($index,$withindex = false) +	{ +		if($index<0||$index>=$this->getCount()) +			throw new TInvalidDataValueException('list_index_invalid',$index); +		$absindex=$index; +		$this->sortPriorities(); +		foreach($this->_d as $priority=>$items) { +			if($index>=($c=count($items))) +				$index-=$c; +			else +				return $withindex?array($priority,$index,$absindex,  +						'priority'=>$priority,'index'=>$index,'absindex'=>$absindex):$priority; +		} +		return false; +	} +	public function insertBefore($indexitem, $item) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if(($priority=$this->priorityOf($indexitem,true))===false) +			throw new TInvalidDataValueException('list_item_inexistent'); +		$this->insertAtIndexInPriority($item,$priority[1],$priority[0]); +		return $priority[2]; +	} +	public function insertAfter($indexitem, $item) +	{ +		if($this->getReadOnly()) +			throw new TInvalidOperationException('list_readonly',get_class($this)); +		if(($priority=$this->priorityOf($indexitem,true))===false) +			throw new TInvalidDataValueException('list_item_inexistent'); +		$this->insertAtIndexInPriority($item,$priority[1]+1,$priority[0]); +		return $priority[2]+1; +	} +	public function toArray() +	{ +		return $this->flattenPriorities(); +	} +	public function toPriorityArray() +	{ +		$this->sortPriorities(); +		return $this->_d; +	} +	public function toArrayBelowPriority($priority,$inclusive=false) +	{ +		$this->sortPriorities(); +		$items=array(); +		foreach($this->_d as $itemspriority=>$itemsatpriority) +		{ +			if((!$inclusive&&$itemspriority>=$priority)||$itemspriority>$priority) +				break; +			$items=array_merge($items,$itemsatpriority); +		} +		return $items; +	} +	public function toArrayAbovePriority($priority,$inclusive=true) +	{ +		$this->sortPriorities(); +		$items=array(); +		foreach($this->_d as $itemspriority=>$itemsatpriority) +		{ +			if((!$inclusive&&$itemspriority<=$priority)||$itemspriority<$priority) +				continue; +			$items=array_merge($items,$itemsatpriority); +		} +		return $items; +	} +	public function copyFrom($data) +	{ +		if($data instanceof TPriorityList) +		{ +			if($this->getCount()>0) +				$this->clear(); +			foreach($data->getPriorities() as $priority) +			{ +				foreach($data->itemsAtPriority($priority) as $index=>$item) +					$this->insertAtIndexInPriority($item,$index,$priority); +			} +		} else if(is_array($data)||$data instanceof Traversable) { +			if($this->getCount()>0) +				$this->clear(); +			foreach($data as $key=>$item) +				$this->add($item); +		} else if($data!==null) +			throw new TInvalidDataTypeException('map_data_not_iterable'); +	} +	public function mergeWith($data) +	{ +		if($data instanceof TPriorityList) +		{ +			foreach($data->getPriorities() as $priority) +			{ +				foreach($data->itemsAtPriority($priority) as $index=>$item) +					$this->insertAtIndexInPriority($item,false,$priority); +			} +		} +		else if(is_array($data)||$data instanceof Traversable) +		{ +			foreach($data as $priority=>$item) +				$this->add($item); +		} +		else if($data!==null) +			throw new TInvalidDataTypeException('map_data_not_iterable'); +	} +	public function offsetExists($offset) +	{ +		return ($offset>=0&&$offset<$this->getCount()); +	} +	public function offsetGet($offset) +	{ +		return $this->itemAt($offset); +	} +	public function offsetSet($offset,$item) +	{ +		if($offset===null) +			return $this->add($item); +		if($offset===$this->getCount()) { +			$priority=$this->priorityAt($offset-1,true); +			$priority[1]++; +		} else { +			$priority=$this->priorityAt($offset,true); +			$this->removeAtIndexInPriority($priority[1],$priority[0]); +		} +		$this->insertAtIndexInPriority($item,$priority[1],$priority[0]); +	} +	public function offsetUnset($offset) +	{ +		$this->removeAt($offset); +	} +}  class TMap extends TComponent implements IteratorAggregate,ArrayAccess,Countable  {  	private $_d=array(); @@ -1392,6 +1763,310 @@ class TMapIterator implements Iterator  		return $this->_key!==false;  	}  } +class TPriorityMap extends TMap +{ +	private $_d=array(); +	private $_r=false; +	private $_o=false; +	private $_fd=null; +	private $_c=0; +	private $_dp=10; +	private $_p=8; +	public function __construct($data=null,$readOnly=false,$defaultPriority=10,$precision=8) +	{ +		if($data!==null) +			$this->copyFrom($data); +		$this->setReadOnly($readOnly); +		$this->setPrecision($precision); +		$this->setDefaultPriority($defaultPriority); +	} +	public function getReadOnly() +	{ +		return $this->_r; +	} +	protected function setReadOnly($value) +	{ +		$this->_r=TPropertyValue::ensureBoolean($value); +	} +	public function getDefaultPriority() +	{ +		return $this->_dp; +	} +	protected function setDefaultPriority($value) +	{ +		$this->_dp = (string)round(TPropertyValue::ensureFloat($value), $this->_p); +	} +	public function getPrecision() +	{ +		return $this->_p; +	} +	protected function setPrecision($value) +	{ +		$this->_p=TPropertyValue::ensureInteger($value); +	} +	public function getIterator() +	{ +		return new ArrayIterator($this->flattenPriorities()); +	} +	protected function sortPriorities() { +		if(!$this->_o) { +			ksort($this->_d, SORT_NUMERIC); +			$this->_o=true; +		} +	} +	protected function flattenPriorities() { +		if(is_array($this->_fd)) +			return $this->_fd; +		$this->sortPriorities(); +		$this->_fd = array(); +		foreach($this->_d as $priority => $itemsatpriority) +			$this->_fd = array_merge($this->_fd, $itemsatpriority); +		return $this->_fd; +	} +	public function count() +	{ +		return $this->getCount(); +	} +	public function getCount() +	{ +		return $this->_c; +	} +	public function getPriorityCount($priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		if(!isset($this->_d[$priority])||!is_array($this->_d[$priority])) +			return false; +		return count($this->_d[$priority]); +	} +	public function getPriorities() +	{ +		$this->sortPriorities(); +		return array_keys($this->_d); +	} +	public function getKeys() +	{ +		return array_keys($this->flattenPriorities()); +	} +	public function itemAt($key,$priority=false) +	{ +		if($priority===false){ +			$map=$this->flattenPriorities(); +			return isset($map[$key])?$map[$key]:null; +		} else { +			if($priority===null) +				$priority=$this->getDefaultPriority(); +			$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +			return (isset($this->_d[$priority])&&isset($this->_d[$priority][$key]))?$this->_d[$priority][$key]:null; +		} +	} +	public function setPriorityAt($key,$priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		$oldpriority=$this->priorityAt($key); +		if($oldpriority!==false&&$oldpriority!=$priority) { +			$value=$this->remove($key,$oldpriority); +			$this->add($key,$value,$priority); +		} +		return $oldpriority; +	} +	public function itemsAtPriority($priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		return isset($this->_d[$priority])?$this->_d[$priority]:null; +	} +	public function priorityOf($item) +	{ +		$this->sortPriorities(); +		foreach($this->_d as $priority=>$items) +			if(($index=array_search($item,$items,true))!==false) +				return $priority; +		return false; +	} +	public function priorityAt($key) +	{ +		$this->sortPriorities(); +		foreach($this->_d as $priority=>$items) +			if(array_key_exists($key,$items)) +				return $priority; +		return false; +	} +	public function add($key,$value,$priority=null) +	{ +		if($priority===null) +			$priority=$this->getDefaultPriority(); +		$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +		if(!$this->_r) +		{ +			foreach($this->_d as $innerpriority=>$items) +				if(array_key_exists($key,$items)) +				{ +					unset($this->_d[$innerpriority][$key]); +					$this->_c--; +					if(count($this->_d[$innerpriority])===0) +						unset($this->_d[$innerpriority]); +				} +			if(!isset($this->_d[$priority])) { +				$this->_d[$priority]=array($key=>$value); +				$this->_o=false; +			} +			else +				$this->_d[$priority][$key]=$value; +			$this->_c++; +			$this->_fd=null; +		} +		else +			throw new TInvalidOperationException('map_readonly',get_class($this)); +		return $priority; +	} +	public function remove($key,$priority=false) +	{ +		if(!$this->_r) +		{ +			if($priority===null) +				$priority=$this->getDefaultPriority(); +			if($priority===false) +			{ +				$this->sortPriorities(); +				foreach($this->_d as $priority=>$items) +					if(array_key_exists($key,$items)) +					{ +						$value=$this->_d[$priority][$key]; +						unset($this->_d[$priority][$key]); +						$this->_c--; +						if(count($this->_d[$priority])===0) +						{ +							unset($this->_d[$priority]); +							$this->_o=false; +						} +						$this->_fd=null; +						return $value; +					} +				return null; +			} +			else +			{ +				$priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); +				if(isset($this->_d[$priority])&&(isset($this->_d[$priority][$key])||array_key_exists($key,$this->_d[$priority]))) +				{ +					$value=$this->_d[$priority][$key]; +					unset($this->_d[$priority][$key]); +					$this->_c--; +					if(count($this->_d[$priority])===0) { +						unset($this->_d[$priority]); +						$this->_o=false; +					} +					$this->_fd=null; +					return $value; +				} +				else +					return null; +			} +		} +		else +			throw new TInvalidOperationException('map_readonly',get_class($this)); +	} +	public function clear() +	{ +		foreach($this->_d as $priority=>$items) +			foreach(array_keys($items) as $key) +				$this->remove($key); +	} +	public function contains($key) +	{ +		$map=$this->flattenPriorities(); +		return isset($map[$key])||array_key_exists($key,$map); +	} +	public function toArray() +	{ +		return $this->flattenPriorities(); +	} +	public function toArrayBelowPriority($priority,$inclusive=false) +	{ +		$this->sortPriorities(); +		$items=array(); +		foreach($this->_d as $itemspriority=>$itemsatpriority) +		{ +			if((!$inclusive&&$itemspriority>=$priority)||$itemspriority>$priority) +				break; +			$items=array_merge($items,$itemsatpriority); +		} +		return $items; +	} +	public function toArrayAbovePriority($priority,$inclusive=true) +	{ +		$this->sortPriorities(); +		$items=array(); +		foreach($this->_d as $itemspriority=>$itemsatpriority) +		{ +			if((!$inclusive&&$itemspriority<=$priority)||$itemspriority<$priority) +				continue; +			$items=array_merge($items,$itemsatpriority); +		} +		return $items; +	} +	public function copyFrom($data) +	{ +		if($data instanceof TPriorityMap) +		{ +			if($this->getCount()>0) +				$this->clear(); +			foreach($data->getPriorities() as $priority) { +				foreach($data->itemsAtPriority($priority) as $key => $value) { +					$this->add($key,$value,$priority); +				} +			} +		} +		else if(is_array($data)||$data instanceof Traversable) +		{ +			if($this->getCount()>0) +				$this->clear(); +			foreach($data as $key=>$value) +				$this->add($key,$value); +		} +		else if($data!==null) +			throw new TInvalidDataTypeException('map_data_not_iterable'); +	} +	public function mergeWith($data) +	{ +		if($data instanceof TPriorityMap) +		{ +			foreach($data->getPriorities() as $priority) +			{ +				foreach($data->itemsAtPriority($priority) as $key => $value) +					$this->add($key,$value,$priority); +			} +		} +		else if(is_array($data)||$data instanceof Traversable) +		{ +			foreach($data as $key=>$value) +				$this->add($key,$value); +		} +		else if($data!==null) +			throw new TInvalidDataTypeException('map_data_not_iterable'); +	} +	public function offsetExists($offset) +	{ +		return $this->contains($offset); +	} +	public function offsetGet($offset) +	{ +		return $this->itemAt($offset); +	} +	public function offsetSet($offset,$item) +	{ +		$this->add($offset,$item); +	} +	public function offsetUnset($offset) +	{ +		$this->remove($offset); +	} +}  class TStack extends TComponent implements IteratorAggregate,Countable  {  	private $_d=array(); @@ -3767,7 +4442,7 @@ class TAttributeCollection extends TMap  	}  	public function hasProperty($name)  	{ -		return $this->contains($name) || parent::hasProperty($name); +		return $this->contains($name) || parent::canGetProperty($name) || parent::canSetProperty($name);  	}  	public function canGetProperty($name)  	{ @@ -6436,12 +7111,9 @@ class TClientScriptManager extends TApplicationComponent  	public function getStyleSheetUrls()  	{  		$stylesheets = array_values( -			array_merge( -				array_map( -					create_function('$e', 'return is_array($e) ? $e[0] : $e;'), -					$this->_styleSheetFiles), -				$this->_styleSheets -			) +			array_map( +				create_function('$e', 'return is_array($e) ? $e[0] : $e;'), +				$this->_styleSheetFiles)  		);  		foreach(Prado::getApplication()->getAssetManager()->getPublished() as $path=>$url)  			if (substr($url,strlen($url)-4)=='.css') @@ -6449,6 +7121,10 @@ class TClientScriptManager extends TApplicationComponent  		$stylesheets = array_unique($stylesheets);  		return $stylesheets;  	} +	public function getStyleSheetCodes() +	{ +		return array_unique(array_values($this->_styleSheets)); +	}  	public function registerHeadScriptFile($key,$url)  	{  		$this->checkIfNotInRender();  | 
