diff options
Diffstat (limited to 'framework/Web')
| -rw-r--r-- | framework/Web/Javascripts/datepicker/datepicker.js | 34 | ||||
| -rw-r--r-- | framework/Web/Javascripts/js/datepicker.js | 14 | ||||
| -rw-r--r-- | framework/Web/Javascripts/js/prado.js | 2 | ||||
| -rw-r--r-- | framework/Web/Javascripts/prototype/event.js | 1 | ||||
| -rw-r--r-- | framework/Web/UI/TTemplateManager.php | 34 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TDataBoundControl.php | 2 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TMarkdown.php | 113 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TRepeater.php | 3 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TValidationSummary.php | 17 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TWizard.php | 6 | 
10 files changed, 194 insertions, 32 deletions
diff --git a/framework/Web/Javascripts/datepicker/datepicker.js b/framework/Web/Javascripts/datepicker/datepicker.js index d5d9496c..e704e950 100644 --- a/framework/Web/Javascripts/datepicker/datepicker.js +++ b/framework/Web/Javascripts/datepicker/datepicker.js @@ -282,8 +282,11 @@ Prado.WebUI.TDatePicker.prototype =  		Event.observe(this._calDiv, "mousewheel", this.mouseWheelChange.bindEvent(this));		
  		Event.observe(calendarBody, "click", this.selectDate.bindEvent(this));
 +		
 +		Event.observe(this.control, "blur", this.hide.bind(this));
 +		Prado.Element.focus(this.control);
 -	},
 +	},A
  	ieHack : function(cleanup) 
  	{
 @@ -305,7 +308,7 @@ Prado.WebUI.TDatePicker.prototype =  		if (!ev) ev = document.parentWindow.event;
  		var kc = ev.keyCode != null ? ev.keyCode : ev.charCode;
 -		if(kc == Event.KEY_RETURN)
 +		if(kc == Event.KEY_RETURN || kc == Event.KEY_SPACEBAR)
  		{
  			this.setSelectedDate(this.selectedDate);
  			Event.stop(ev);
 @@ -526,6 +529,22 @@ Prado.WebUI.TDatePicker.prototype =  		this.setMonth(this.selectedDate.getMonth()-1);
  	},
 +	getDatePickerOffsetHeight : function()
 +	{
 +		if(this.options.InputMode == "TextBox")
 +			return this.control.offsetHeight;
 +
 +		var control = Prado.WebUI.TDatePicker.getDayListControl(this.control);
 +		if(control) return control.offsetHeight;
 +
 +		var control = Prado.WebUI.TDatePicker.getMonthListControl(this.control);
 +		if(control) return control.offsetHeight;		
 +
 +		var control = Prado.WebUI.TDatePicker.getYearListControl(this.control);
 +		if(control) return control.offsetHeight;	
 +		return 0;
 +	},
 +	
  	show : function() 
  	{
  		this.create();
 @@ -534,15 +553,8 @@ Prado.WebUI.TDatePicker.prototype =  		{
  			var pos = Position.cumulativeOffset(this.control);
 -			if(this.options.InputMode == "TextBox")
 -				pos[1] += this.control.offsetHeight;
 -			else
 -			{
 -				var dayList = Prado.WebUI.TDatePicker.getDayListControl(this.control);
 -				if(dayList)
 -					pos[1] += dayList.offsetHeight-1;
 -			}
 -
 +			pos[1] += this.getDatePickerOffsetHeight();
 +			
  			this._calDiv.style.display = "block";
  			this._calDiv.style.top = (pos[1]-1) + "px";
  			this._calDiv.style.left = pos[0] + "px";
 diff --git a/framework/Web/Javascripts/js/datepicker.js b/framework/Web/Javascripts/js/datepicker.js index a81bbeb4..e0bba502 100644 --- a/framework/Web/Javascripts/js/datepicker.js +++ b/framework/Web/Javascripts/js/datepicker.js @@ -23,10 +23,10 @@ div=document.createElement("div");div.className="calendarFooter";this._calDiv.ap  this.iePopUp.scrolling="no"  this.iePopUp.frameBorder="0"  document.body.appendChild(this.iePopUp);} -document.body.appendChild(this._calDiv);this.update();this.updateHeader();this.ieHack(true);previousMonth.hideFocus=true;nextMonth.hideFocus=true;todayButton.hideFocus=true;Event.observe(previousMonth,"click",this.prevMonth.bindEvent(this));Event.observe(nextMonth,"click",this.nextMonth.bindEvent(this));Event.observe(todayButton,"click",this.selectToday.bindEvent(this));Event.observe(this._monthSelect,"change",this.monthSelect.bindEvent(this));Event.observe(this._yearSelect,"change",this.yearSelect.bindEvent(this));Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bindEvent(this));Event.observe(calendarBody,"click",this.selectDate.bindEvent(this));},ieHack:function(cleanup) +document.body.appendChild(this._calDiv);this.update();this.updateHeader();this.ieHack(true);previousMonth.hideFocus=true;nextMonth.hideFocus=true;todayButton.hideFocus=true;Event.observe(previousMonth,"click",this.prevMonth.bindEvent(this));Event.observe(nextMonth,"click",this.nextMonth.bindEvent(this));Event.observe(todayButton,"click",this.selectToday.bindEvent(this));Event.observe(this._monthSelect,"change",this.monthSelect.bindEvent(this));Event.observe(this._yearSelect,"change",this.yearSelect.bindEvent(this));Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bindEvent(this));Event.observe(calendarBody,"click",this.selectDate.bindEvent(this));Event.observe(this.control,"blur",this.hide.bind(this));Prado.Element.focus(this.control);},ieHack:function(cleanup)  {if(this.iePopUp)  {this.iePopUp.style.display="block";this.iePopUp.style.top=(this._calDiv.offsetTop-1)+"px";this.iePopUp.style.left=(this._calDiv.offsetLeft-1)+"px";this.iePopUp.style.width=Math.abs(this._calDiv.offsetWidth-2)+"px";this.iePopUp.style.height=(this._calDiv.offsetHeight+1)+"px";if(cleanup)this.iePopUp.style.display="none";}},keyPressed:function(ev) -{if(!this.showing)return;if(!ev)ev=document.parentWindow.event;var kc=ev.keyCode!=null?ev.keyCode:ev.charCode;if(kc==Event.KEY_RETURN) +{if(!this.showing)return;if(!ev)ev=document.parentWindow.event;var kc=ev.keyCode!=null?ev.keyCode:ev.charCode;if(kc==Event.KEY_RETURN||kc==Event.KEY_SPACEBAR)  {this.setSelectedDate(this.selectedDate);Event.stop(ev);this.hide();}  if(kc==Event.KEY_ESC)  {Event.stop(ev);this.hide();} @@ -88,13 +88,11 @@ this.onChange();},getElement:function()  {var d=this.newDate(this.selectedDate);d.setFullYear(year);this.setSelectedDate(d);},setMonth:function(month)  {var d=this.newDate(this.selectedDate);d.setMonth(month);this.setSelectedDate(d);},nextMonth:function()  {this.setMonth(this.selectedDate.getMonth()+1);},prevMonth:function() -{this.setMonth(this.selectedDate.getMonth()-1);},show:function() +{this.setMonth(this.selectedDate.getMonth()-1);},getDatePickerOffsetHeight:function() +{if(this.options.InputMode=="TextBox") +return this.control.offsetHeight;var control=Prado.WebUI.TDatePicker.getDayListControl(this.control);if(control)return control.offsetHeight;var control=Prado.WebUI.TDatePicker.getMonthListControl(this.control);if(control)return control.offsetHeight;var control=Prado.WebUI.TDatePicker.getYearListControl(this.control);if(control)return control.offsetHeight;return 0;},show:function()  {this.create();if(!this.showing) -{var pos=Position.cumulativeOffset(this.control);if(this.options.InputMode=="TextBox") -pos[1]+=this.control.offsetHeight;else -{var dayList=Prado.WebUI.TDatePicker.getDayListControl(this.control);if(dayList) -pos[1]+=dayList.offsetHeight-1;} -this._calDiv.style.display="block";this._calDiv.style.top=(pos[1]-1)+"px";this._calDiv.style.left=pos[0]+"px";this.ieHack(false);this.documentClickEvent=this.hideOnClick.bindEvent(this);this.documentKeyDownEvent=this.keyPressed.bindEvent(this);Event.observe(document.body,"click",this.documentClickEvent);var date=this.getDateFromInput();if(date) +{var pos=Position.cumulativeOffset(this.control);pos[1]+=this.getDatePickerOffsetHeight();this._calDiv.style.display="block";this._calDiv.style.top=(pos[1]-1)+"px";this._calDiv.style.left=pos[0]+"px";this.ieHack(false);this.documentClickEvent=this.hideOnClick.bindEvent(this);this.documentKeyDownEvent=this.keyPressed.bindEvent(this);Event.observe(document.body,"click",this.documentClickEvent);var date=this.getDateFromInput();if(date)  {this.selectedDate=date;this.setSelectedDate(date);}  Event.observe(document,"keydown",this.documentKeyDownEvent);this.showing=true;}},getDateFromInput:function()  {if(this.options.InputMode=="TextBox") diff --git a/framework/Web/Javascripts/js/prado.js b/framework/Web/Javascripts/js/prado.js index aa02e98e..87fd69a6 100644 --- a/framework/Web/Javascripts/js/prado.js +++ b/framework/Web/Javascripts/js/prado.js @@ -111,7 +111,7 @@ this.registerFormCallbacks();else  this.registerCallback(this.element);},onElementEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}},registerFormCallbacks:function(){var elements=Form.getElements(this.element);for(var i=0;i<elements.length;i++)  this.registerCallback(elements[i]);},registerCallback:function(element){if(element.type){switch(element.type.toLowerCase()){case'checkbox':case'radio':Event.observe(element,'click',this.onElementEvent.bind(this));break;case'password':case'text':case'textarea':case'select-one':case'select-multiple':Event.observe(element,'change',this.onElementEvent.bind(this));break;}}}}  Form.Element.EventObserver=Class.create();Form.Element.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.EventObserver=Class.create();Form.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.serialize(this.element);}});if(!window.Event){var Event=new Object();} -Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},pointerX:function(event){return event.pageX||(event.clientX+ +Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_SPACEBAR:32,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},pointerX:function(event){return event.pageX||(event.clientX+  (document.documentElement.scrollLeft||document.body.scrollLeft));},pointerY:function(event){return event.pageY||(event.clientY+  (document.documentElement.scrollTop||document.body.scrollTop));},stop:function(event){if(event.preventDefault){event.preventDefault();event.stopPropagation();}else{event.returnValue=false;event.cancelBubble=true;}},findElement:function(event,tagName){var element=Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))  element=element.parentNode;return element;},observers:false,_observeAndCache:function(element,name,observer,useCapture){if(!this.observers)this.observers=[];if(element.addEventListener){this.observers.push([element,name,observer,useCapture]);element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){this.observers.push([element,name,observer,useCapture]);element.attachEvent('on'+name,observer);}},unloadCache:function(){if(!Event.observers)return;for(var i=0;i<Event.observers.length;i++){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i][0]=null;} diff --git a/framework/Web/Javascripts/prototype/event.js b/framework/Web/Javascripts/prototype/event.js index 51b9010e..4def0e4a 100644 --- a/framework/Web/Javascripts/prototype/event.js +++ b/framework/Web/Javascripts/prototype/event.js @@ -12,6 +12,7 @@ Object.extend(Event, {    KEY_RIGHT:    39,    KEY_DOWN:     40,    KEY_DELETE:   46, +  KEY_SPACEBAR: 32,    element: function(event) {      return event.target || event.srcElement; diff --git a/framework/Web/UI/TTemplateManager.php b/framework/Web/UI/TTemplateManager.php index 60ce11ca..cb05fa35 100644 --- a/framework/Web/UI/TTemplateManager.php +++ b/framework/Web/UI/TTemplateManager.php @@ -383,16 +383,37 @@ class TTemplate extends TApplicationComponent implements ITemplate  	 * @param string property name
  	 * @param mixed property initial value
  	 */
 +	protected function configureControl2($control,$name,$value)
 +	{
 +		if(strncasecmp($name,'on',2)===0)		// is an event
 +			$this->configureEvent($control,$name,$value,$control);
 +		else if(($pos=strrpos($name,'.'))===false)	// is a simple property or custom attribute
 +			$this->configureProperty($control,$name,$value);
 +		else	// is a subproperty
 +		{
 +			$subName=substr($name,$pos+1);
 +			if(strncasecmp($subName,'on',2)===0) // is an event: XXX.YYY.OnZZZ
 +			{
 +				$object=$control->getSubProperty(substr($name,0,$pos));
 +				if(($object instanceof TControl))
 +					$this->configureEvent($object,$subName,$value,$control);
 +				else
 +					$this->configureSubProperty($control,$name,$value);
 +			}
 +			else
 +				$this->configureSubProperty($control,$name,$value);
 +		}
 +	}
 +
  	protected function configureControl($control,$name,$value)
  	{
  		if(strncasecmp($name,'on',2)===0)		// is an event
 -			$this->configureEvent($control,$name,$value);
 -		else if(strpos($name,'.')===false)	// is a simple property or custom attribute
 +			$this->configureEvent($control,$name,$value,$control);
 +		else if(($pos=strrpos($name,'.'))===false)	// is a simple property or custom attribute
  			$this->configureProperty($control,$name,$value);
  		else	// is a subproperty
  			$this->configureSubProperty($control,$name,$value);
  	}
 -
  	/**
  	 * Configures a property of a non-control component.
  	 * @param TComponent component to be configured
 @@ -412,13 +433,14 @@ class TTemplate extends TApplicationComponent implements ITemplate  	 * @param TControl control to be configured
  	 * @param string event name
  	 * @param string event handler
 +	 * @param TControl context control
  	 */
 -	protected function configureEvent($component,$name,$value)
 +	protected function configureEvent($control,$name,$value,$contextControl)
  	{
  		if(strpos($value,'.')===false)
 -			$component->attachEventHandler($name,array($component,'TemplateControl.'.$value));
 +			$control->attachEventHandler($name,array($contextControl,'TemplateControl.'.$value));
  		else
 -			$component->attachEventHandler($name,array($component,$value));
 +			$control->attachEventHandler($name,array($contextControl,$value));
  	}
  	/**
 diff --git a/framework/Web/UI/WebControls/TDataBoundControl.php b/framework/Web/UI/WebControls/TDataBoundControl.php index 0bb771bf..9e6ecbf3 100644 --- a/framework/Web/UI/WebControls/TDataBoundControl.php +++ b/framework/Web/UI/WebControls/TDataBoundControl.php @@ -59,7 +59,7 @@ abstract class TDataBoundControl extends TWebControl  	 */
  	public function setDataSource($value)
  	{
 -		$this->_dataSource=$this->validateDataSource($value);;
 +		$this->_dataSource=$this->validateDataSource($value);
  		$this->onDataSourceChanged();
  	}
 diff --git a/framework/Web/UI/WebControls/TMarkdown.php b/framework/Web/UI/WebControls/TMarkdown.php new file mode 100644 index 00000000..49660b4e --- /dev/null +++ b/framework/Web/UI/WebControls/TMarkdown.php @@ -0,0 +1,113 @@ +<?php
 +/**
 + * TMarkdown class file
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @link http://www.pradosoft.com/
 + * @copyright Copyright © 2005 PradoSoft
 + * @license http://www.pradosoft.com/license/
 + * @version $Revision: $  $Date: $
 + * @package System.Web.UI.WebControls
 + */
 +
 +/**
 + * TMarkdown class
 + *
 + * TMarkdown is a control that produces HTML from code with markdown syntax.
 + *
 + * Markdown is a text-to-HTML conversion tool for web writers. Markdown allows 
 + * you to write using an easy-to-read, easy-to-write plain text format, then 
 + * convert it to structurally valid XHTML (or HTML).
 + * Further documentation regarding Markdown can be found at
 + * http://daringfireball.net/projects/markdown/
 + *
 + * To use TMarkdown, simply enclose the content to be rendered within
 + * the body of TMarkdown in a template.
 + *
 + * See http://www.pradosoft.com/demos/quickstart/?page=Markdown for
 + * details on the Markdown syntax usage.
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @version $Revision: $  $Date: $
 + * @package System.Web.UI.WebControls
 + * @since 3.0
 + */
 +class TMarkdown extends TControl
 +{
 +	/**
 +	 * @var TTextHighlighter
 +	 */
 +	private $_highlighter;
 +
 +	/**
 +	 * Renders body content.
 +	 * This method overrides parent implementation by removing
 +	 * malicious javascript code from the body content
 +	 * @param THtmlWriter writer
 +	 */
 +	public function render($writer)
 +	{
 +		$textWriter=new TTextWriter;
 +		parent::render(new THtmlWriter($textWriter));
 +		$writer->write($this->renderMarkdown($textWriter->flush()));
 +	}
 +
 +	/**
 +	 * Use MarkdownParser to render the HTML content.
 +	 * @param string markdown content
 +	 * @return string HTML content
 +	 */
 +	protected function renderMarkdown($text)
 +	{
 +		$renderer = Prado::createComponent('System.3rdParty.Markdown.MarkdownParser');
 +		$result = $renderer->parse($text);
 +		return preg_replace_callback(
 +				'/<pre><code>\[\s*(\w+)\s*\]\n+((.|\n)*?)\s*<\\/code><\\/pre>/im', 
 +				array($this, 'highlightCode'), $result);
 +	}
 +
 +	/**
 +	 * @return TTextHighlighter source code highlighter
 +	 */
 +	public function getTextHighlighter()
 +	{
 +		if(is_null($this->_highlighter))
 +			$this->_highlighter = new TTextHighlighter;
 +		return $this->_highlighter;
 +	}
 +
 +	
 +	/**
 +	 * Highlights source code using TTextHighlighter
 +	 * @param array matches of code blocks
 +	 * @return string highlighted code.
 +	 */
 +	protected function highlightCode($matches)
 +	{
 +		$text = new TTextWriter;
 +		$writer = new THtmlWriter($text);
 +		$hi = $this->getTextHighlighter();
 +		if($hi->getControls()->getCount() > 0)
 +			$hi->getControls()->removeAt(0);
 +		$hi->addParsedObject(html_entity_decode($matches[2]));
 +		$hi->setLanguage($matches[1]);
 +		$hi->render($writer);
 +		return $text->flush();
 +	}
 +
 +	/**
 +	 * Registers css style for the highlighted result.
 +	 * This method overrides parent implementation.
 +	 * @param THtmlWriter writer
 +	 */
 +	public function onPreRender($writer)
 +	{
 +		parent::onPreRender($writer);
 +		$hi = $this->getTextHighlighter();
 +		$this->getControls()->insertAt(0,$hi);
 +		$hi->onPreRender($writer);
 +		$this->getControls()->removeAt(0);
 +	}
 +}
 +
 +?>
\ No newline at end of file diff --git a/framework/Web/UI/WebControls/TRepeater.php b/framework/Web/UI/WebControls/TRepeater.php index 1acdc766..9aa7af8d 100644 --- a/framework/Web/UI/WebControls/TRepeater.php +++ b/framework/Web/UI/WebControls/TRepeater.php @@ -11,9 +11,10 @@   */
  /**
 - * Using TDataBoundControl cass
 + * Using TDataBoundControl and TDataFieldAccessor cass
   */
  Prado::using('System.Web.UI.WebControls.TDataBoundControl');
 +Prado::using('System.Util.TDataFieldAccessor');
  /**
   * TRepeater class
 diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php index 8148036b..cfb57c5b 100644 --- a/framework/Web/UI/WebControls/TValidationSummary.php +++ b/framework/Web/UI/WebControls/TValidationSummary.php @@ -223,9 +223,24 @@ class TValidationSummary extends TWebControl  	{
  		if(!$this->getEnabled(true) || !$this->getEnableClientScript())
  			return;
 +		$cs = $this->getPage()->getClientScript();
 +		$cs->registerPradoScript('validator');
 +
 +		//need to register the validation manager is validation summary is alone.
 +		$formID=$this->getPage()->getForm()->getClientID();
 +		$scriptKey = "TBaseValidator:$formID";
 +		if($this->getEnableClientScript() && !$cs->isEndScriptRegistered($scriptKey))
 +		{
 +			$manager['FormID'] = $formID;
 +			$options = TJavaScript::encode($manager); 
 +			$cs->registerPradoScript('validator');
 +			$cs->registerEndScript($scriptKey, "new Prado.ValidationManager({$options});");
 +		}
 +
 +
  		$options=TJavaScript::encode($this->getClientScriptOptions());
  		$script = "new Prado.WebUI.TValidationSummary({$options});";
 -		$this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script);
 +		$cs->registerEndScript($this->getClientID(), $script);
  	}
  	/**
 diff --git a/framework/Web/UI/WebControls/TWizard.php b/framework/Web/UI/WebControls/TWizard.php index 2d2815ba..811c4e76 100644 --- a/framework/Web/UI/WebControls/TWizard.php +++ b/framework/Web/UI/WebControls/TWizard.php @@ -622,7 +622,7 @@ class TWizard extends TWebControl implements INamingContainer  	}
  	/**
 -	 * @var TWizardNavigationContainer container of the start navigation
 +	 * @return TWizardNavigationContainer container of the start navigation
  	 */
  	public function getStartNavigation()
  	{
 @@ -630,7 +630,7 @@ class TWizard extends TWebControl implements INamingContainer  	}
  	/**
 -	 * @var TWizardNavigationContainer container of the step navigation
 +	 * @return TWizardNavigationContainer container of the step navigation
  	 */
  	public function getStepNavigation()
  	{
 @@ -638,7 +638,7 @@ class TWizard extends TWebControl implements INamingContainer  	}
  	/**
 -	 * @var TWizardNavigationContainer container of the finish navigation
 +	 * @return TWizardNavigationContainer container of the finish navigation
  	 */
  	public function getFinishNavigation()
  	{
  | 
