diff options
Diffstat (limited to 'framework/Web/UI/WebControls/TMultiView.php')
-rw-r--r-- | framework/Web/UI/WebControls/TMultiView.php | 756 |
1 files changed, 378 insertions, 378 deletions
diff --git a/framework/Web/UI/WebControls/TMultiView.php b/framework/Web/UI/WebControls/TMultiView.php index 81d404b2..0c40cd06 100644 --- a/framework/Web/UI/WebControls/TMultiView.php +++ b/framework/Web/UI/WebControls/TMultiView.php @@ -1,378 +1,378 @@ -<?php
-/**
- * TMultiView and TView class file.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.pradosoft.com/
- * @copyright Copyright © 2005-2012 PradoSoft
- * @license http://www.pradosoft.com/license/
- * @version $Id$
- * @package System.Web.UI.WebControls
- */
-
-/**
- * TMultiView class
- *
- * TMultiView serves as a container for a group of {@link TView} controls.
- * The view collection can be retrieved by {@link getViews Views}.
- * Each view contains child controls. TMultiView determines which view and its
- * child controls are visible. At any time, at most one view is visible (called
- * active). To make a view active, set {@link setActiveView ActiveView} or
- * {@link setActiveViewIndex ActiveViewIndex}.
- *
- * TMultiView also responds to specific command events raised from button controls
- * contained in current active view. A command event with name 'NextView'
- * will cause TMultiView to make the next available view active.
- * Other command names recognized by TMultiView include
- * - PreviousView : switch to previous view
- * - SwitchViewID : switch to a view by its ID path
- * - SwitchViewIndex : switch to a view by its index in the {@link getViews Views} collection.
- *
- * TMultiView raises {@link OnActiveViewChanged OnActiveViewChanged} event
- * when its active view is changed during a postback.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @version $Id$
- * @package System.Web.UI.WebControls
- * @since 3.0
- */
-class TMultiView extends TControl
-{
- const CMD_NEXTVIEW='NextView';
- const CMD_PREVIOUSVIEW='PreviousView';
- const CMD_SWITCHVIEWID='SwitchViewID';
- const CMD_SWITCHVIEWINDEX='SwitchViewIndex';
- private $_cachedActiveViewIndex=-1;
- private $_ignoreBubbleEvents=false;
-
- /**
- * Processes an object that is created during parsing template.
- * This method overrides the parent implementation by adding only {@link TView}
- * controls as children.
- * @param string|TComponent text string or component parsed and instantiated in template
- * @see createdOnTemplate
- * @throws TConfigurationException if controls other than {@link TView} is being added
- */
- public function addParsedObject($object)
- {
- if($object instanceof TView)
- $this->getControls()->add($object);
- else if(!is_string($object))
- throw new TConfigurationException('multiview_view_required');
- }
-
- /**
- * Creates a control collection object that is to be used to hold child controls
- * @return TViewCollection control collection
- */
- protected function createControlCollection()
- {
- return new TViewCollection($this);
- }
-
- /**
- * @return integer the zero-based index of the current view in the view collection. -1 if no active view. Default is -1.
- */
- public function getActiveViewIndex()
- {
- if($this->_cachedActiveViewIndex>-1)
- return $this->_cachedActiveViewIndex;
- else
- return $this->getControlState('ActiveViewIndex',-1);
- }
-
- /**
- * @param integer the zero-based index of the current view in the view collection. -1 if no active view.
- * @throws TInvalidDataValueException if the view index is invalid
- */
- public function setActiveViewIndex($value)
- {
- if(($index=TPropertyValue::ensureInteger($value))<0)
- $index=-1;
- $views=$this->getViews();
- $count=$views->getCount();
- if($count===0 && $this->getControlStage()<TControl::CS_CHILD_INITIALIZED)
- $this->_cachedActiveViewIndex=$index;
- else if($index<$count)
- {
- $this->setControlState('ActiveViewIndex',$index,-1);
- $this->_cachedActiveViewIndex=-1;
- if($index>=0)
- $this->activateView($views->itemAt($index),true);
- }
- else
- throw new TInvalidDataValueException('multiview_activeviewindex_invalid',$index);
- }
-
- /**
- * @return TView the currently active view, null if no active view
- * @throws TInvalidDataValueException if the current active view index is invalid
- */
- public function getActiveView()
- {
- $index=$this->getActiveViewIndex();
- $views=$this->getViews();
- if($index>=$views->getCount())
- throw new TInvalidDataValueException('multiview_activeviewindex_invalid',$index);
- if($index<0)
- return null;
- $view=$views->itemAt($index);
- if(!$view->getActive())
- $this->activateView($view,false);
- return $view;
- }
-
- /**
- * @param TView the view to be activated
- * @throws TInvalidOperationException if the view is not in the view collection
- */
- public function setActiveView($view)
- {
- if(($index=$this->getViews()->indexOf($view))>=0)
- $this->setActiveViewIndex($index);
- else
- throw new TInvalidOperationException('multiview_view_inexistent');
- }
-
- /**
- * Activates the specified view.
- * If there is any view currently active, it will be deactivated.
- * @param TView the view to be activated
- * @param boolean whether to trigger OnActiveViewChanged event.
- */
- protected function activateView($view,$triggerViewChangedEvent=true)
- {
- if($view->getActive())
- return;
- $triggerEvent=$triggerViewChangedEvent && ($this->getControlStage()>=TControl::CS_STATE_LOADED || ($this->getPage() && !$this->getPage()->getIsPostBack()));
- foreach($this->getViews() as $v)
- {
- if($v===$view)
- {
- $view->setActive(true);
- if($triggerEvent)
- {
- $view->onActivate(null);
- $this->onActiveViewChanged(null);
- }
- }
- else if($v->getActive())
- {
- $v->setActive(false);
- if($triggerEvent)
- $v->onDeactivate(null);
- }
- }
- }
-
- /**
- * @return TViewCollection the view collection
- */
- public function getViews()
- {
- return $this->getControls();
- }
-
- /**
- * Makes the multiview ignore all bubbled events.
- * This is method is used internally by framework and control
- * developers.
- */
- public function ignoreBubbleEvents()
- {
- $this->_ignoreBubbleEvents=true;
- }
-
- /**
- * Initializes the active view if any.
- * This method overrides the parent implementation.
- * @param TEventParameter event parameter
- */
- public function onInit($param)
- {
- parent::onInit($param);
- if($this->_cachedActiveViewIndex>=0)
- $this->setActiveViewIndex($this->_cachedActiveViewIndex);
- }
-
- /**
- * Raises <b>OnActiveViewChanged</b> event.
- * The event is raised when the currently active view is changed to a new one
- * @param TEventParameter event parameter
- */
- public function onActiveViewChanged($param)
- {
- $this->raiseEvent('OnActiveViewChanged',$this,$param);
- }
-
- /**
- * Processes the events bubbled from child controls.
- * The method handles view-related command events.
- * @param TControl sender of the event
- * @param mixed event parameter
- * @return boolean whether this event is handled
- */
- public function bubbleEvent($sender,$param)
- {
- if(!$this->_ignoreBubbleEvents && ($param instanceof TCommandEventParameter))
- {
- switch($param->getCommandName())
- {
- case self::CMD_NEXTVIEW:
- if(($index=$this->getActiveViewIndex())<$this->getViews()->getCount()-1)
- $this->setActiveViewIndex($index+1);
- else
- $this->setActiveViewIndex(-1);
- return true;
- case self::CMD_PREVIOUSVIEW:
- if(($index=$this->getActiveViewIndex())>=0)
- $this->setActiveViewIndex($index-1);
- return true;
- case self::CMD_SWITCHVIEWID:
- $view=$this->findControl($viewID=$param->getCommandParameter());
- if($view!==null && $view->getParent()===$this)
- {
- $this->setActiveView($view);
- return true;
- }
- else
- throw new TInvalidDataValueException('multiview_viewid_invalid', $viewID);
- case self::CMD_SWITCHVIEWINDEX:
- $index=TPropertyValue::ensureInteger($param->getCommandParameter());
- $this->setActiveViewIndex($index);
- return true;
- }
- }
- return false;
- }
-
- /**
- * Loads state into the wizard.
- * This method is invoked by the framework when the control state is being saved.
- */
- public function loadState()
- {
- // a dummy call to ensure the view is activated
- $this->getActiveView();
- }
-
- /**
- * Renders the currently active view.
- * @param THtmlWriter the writer for the rendering purpose.
- */
- public function render($writer)
- {
- if(($view=$this->getActiveView())!==null)
- $view->renderControl($writer);
- }
-}
-
-/**
- * TViewCollection class.
- * TViewCollection represents a collection that only takes {@link TView} instances
- * as collection elements.
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @version $Id$
- * @package System.Web.UI.WebControls
- * @since 3.0
- */
-class TViewCollection extends TControlCollection
-{
- /**
- * Inserts an item at the specified position.
- * This overrides the parent implementation by ensuring only {@link TView}
- * controls be added into the collection.
- * @param integer the speicified position.
- * @param mixed new item
- * @throws TInvalidDataTypeException if the item to be inserted is neither a string nor a TControl.
- */
- public function insertAt($index,$item)
- {
- if($item instanceof TView)
- parent::insertAt($index,$item);
- else
- throw new TInvalidDataTypeException('viewcollection_view_required');
- }
-}
-
-/**
- * TView class
- *
- * TView is a container for a group of controls. TView must be contained
- * within a {@link TMultiView} control in which only one view can be active
- * at one time.
- *
- * To activate a view, set {@link setActive Active} to true.
- * When a view is activated, it raises {@link onActivate OnActivate} event;
- * and when a view is deactivated, it raises {@link onDeactivate OnDeactivate}.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @version $Id$
- * @package System.Web.UI.WebControls
- * @since 3.0
- */
-class TView extends TControl
-{
- private $_active=false;
-
- /**
- * Raises <b>OnActivate</b> event.
- * @param TEventParameter event parameter
- */
- public function onActivate($param)
- {
- $this->raiseEvent('OnActivate',$this,$param);
- }
-
- /**
- * Raises <b>OnDeactivate</b> event.
- * @param TEventParameter event parameter
- */
- public function onDeactivate($param)
- {
- $this->raiseEvent('OnDeactivate',$this,$param);
- }
-
- /**
- * @return boolean whether this view is active. Defaults to false.
- */
- public function getActive()
- {
- return $this->_active;
- }
-
- /**
- * @param boolean whether this view is active.
- */
- public function setActive($value)
- {
- $value=TPropertyValue::ensureBoolean($value);
- $this->_active=$value;
- parent::setVisible($value);
- }
-
- /**
- * @param boolean whether the parents should also be checked if visible
- * @return boolean whether this view is visible.
- * The view is visible if it is active and its parent is visible.
- */
- public function getVisible($checkParents=true)
- {
- if(($parent=$this->getParent())===null)
- return $this->getActive();
- else if($this->getActive())
- return $parent->getVisible($checkParents);
- else
- return false;
- }
-
- /**
- * @param boolean
- * @throws TInvalidOperationException whenever this method is invoked.
- */
- public function setVisible($value)
- {
- throw new TInvalidOperationException('view_visible_readonly');
- }
-}
-
+<?php +/** + * TMultiView and TView class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005-2012 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Id$ + * @package System.Web.UI.WebControls + */ + +/** + * TMultiView class + * + * TMultiView serves as a container for a group of {@link TView} controls. + * The view collection can be retrieved by {@link getViews Views}. + * Each view contains child controls. TMultiView determines which view and its + * child controls are visible. At any time, at most one view is visible (called + * active). To make a view active, set {@link setActiveView ActiveView} or + * {@link setActiveViewIndex ActiveViewIndex}. + * + * TMultiView also responds to specific command events raised from button controls + * contained in current active view. A command event with name 'NextView' + * will cause TMultiView to make the next available view active. + * Other command names recognized by TMultiView include + * - PreviousView : switch to previous view + * - SwitchViewID : switch to a view by its ID path + * - SwitchViewIndex : switch to a view by its index in the {@link getViews Views} collection. + * + * TMultiView raises {@link OnActiveViewChanged OnActiveViewChanged} event + * when its active view is changed during a postback. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TMultiView extends TControl +{ + const CMD_NEXTVIEW='NextView'; + const CMD_PREVIOUSVIEW='PreviousView'; + const CMD_SWITCHVIEWID='SwitchViewID'; + const CMD_SWITCHVIEWINDEX='SwitchViewIndex'; + private $_cachedActiveViewIndex=-1; + private $_ignoreBubbleEvents=false; + + /** + * Processes an object that is created during parsing template. + * This method overrides the parent implementation by adding only {@link TView} + * controls as children. + * @param string|TComponent text string or component parsed and instantiated in template + * @see createdOnTemplate + * @throws TConfigurationException if controls other than {@link TView} is being added + */ + public function addParsedObject($object) + { + if($object instanceof TView) + $this->getControls()->add($object); + else if(!is_string($object)) + throw new TConfigurationException('multiview_view_required'); + } + + /** + * Creates a control collection object that is to be used to hold child controls + * @return TViewCollection control collection + */ + protected function createControlCollection() + { + return new TViewCollection($this); + } + + /** + * @return integer the zero-based index of the current view in the view collection. -1 if no active view. Default is -1. + */ + public function getActiveViewIndex() + { + if($this->_cachedActiveViewIndex>-1) + return $this->_cachedActiveViewIndex; + else + return $this->getControlState('ActiveViewIndex',-1); + } + + /** + * @param integer the zero-based index of the current view in the view collection. -1 if no active view. + * @throws TInvalidDataValueException if the view index is invalid + */ + public function setActiveViewIndex($value) + { + if(($index=TPropertyValue::ensureInteger($value))<0) + $index=-1; + $views=$this->getViews(); + $count=$views->getCount(); + if($count===0 && $this->getControlStage()<TControl::CS_CHILD_INITIALIZED) + $this->_cachedActiveViewIndex=$index; + else if($index<$count) + { + $this->setControlState('ActiveViewIndex',$index,-1); + $this->_cachedActiveViewIndex=-1; + if($index>=0) + $this->activateView($views->itemAt($index),true); + } + else + throw new TInvalidDataValueException('multiview_activeviewindex_invalid',$index); + } + + /** + * @return TView the currently active view, null if no active view + * @throws TInvalidDataValueException if the current active view index is invalid + */ + public function getActiveView() + { + $index=$this->getActiveViewIndex(); + $views=$this->getViews(); + if($index>=$views->getCount()) + throw new TInvalidDataValueException('multiview_activeviewindex_invalid',$index); + if($index<0) + return null; + $view=$views->itemAt($index); + if(!$view->getActive()) + $this->activateView($view,false); + return $view; + } + + /** + * @param TView the view to be activated + * @throws TInvalidOperationException if the view is not in the view collection + */ + public function setActiveView($view) + { + if(($index=$this->getViews()->indexOf($view))>=0) + $this->setActiveViewIndex($index); + else + throw new TInvalidOperationException('multiview_view_inexistent'); + } + + /** + * Activates the specified view. + * If there is any view currently active, it will be deactivated. + * @param TView the view to be activated + * @param boolean whether to trigger OnActiveViewChanged event. + */ + protected function activateView($view,$triggerViewChangedEvent=true) + { + if($view->getActive()) + return; + $triggerEvent=$triggerViewChangedEvent && ($this->getControlStage()>=TControl::CS_STATE_LOADED || ($this->getPage() && !$this->getPage()->getIsPostBack())); + foreach($this->getViews() as $v) + { + if($v===$view) + { + $view->setActive(true); + if($triggerEvent) + { + $view->onActivate(null); + $this->onActiveViewChanged(null); + } + } + else if($v->getActive()) + { + $v->setActive(false); + if($triggerEvent) + $v->onDeactivate(null); + } + } + } + + /** + * @return TViewCollection the view collection + */ + public function getViews() + { + return $this->getControls(); + } + + /** + * Makes the multiview ignore all bubbled events. + * This is method is used internally by framework and control + * developers. + */ + public function ignoreBubbleEvents() + { + $this->_ignoreBubbleEvents=true; + } + + /** + * Initializes the active view if any. + * This method overrides the parent implementation. + * @param TEventParameter event parameter + */ + public function onInit($param) + { + parent::onInit($param); + if($this->_cachedActiveViewIndex>=0) + $this->setActiveViewIndex($this->_cachedActiveViewIndex); + } + + /** + * Raises <b>OnActiveViewChanged</b> event. + * The event is raised when the currently active view is changed to a new one + * @param TEventParameter event parameter + */ + public function onActiveViewChanged($param) + { + $this->raiseEvent('OnActiveViewChanged',$this,$param); + } + + /** + * Processes the events bubbled from child controls. + * The method handles view-related command events. + * @param TControl sender of the event + * @param mixed event parameter + * @return boolean whether this event is handled + */ + public function bubbleEvent($sender,$param) + { + if(!$this->_ignoreBubbleEvents && ($param instanceof TCommandEventParameter)) + { + switch($param->getCommandName()) + { + case self::CMD_NEXTVIEW: + if(($index=$this->getActiveViewIndex())<$this->getViews()->getCount()-1) + $this->setActiveViewIndex($index+1); + else + $this->setActiveViewIndex(-1); + return true; + case self::CMD_PREVIOUSVIEW: + if(($index=$this->getActiveViewIndex())>=0) + $this->setActiveViewIndex($index-1); + return true; + case self::CMD_SWITCHVIEWID: + $view=$this->findControl($viewID=$param->getCommandParameter()); + if($view!==null && $view->getParent()===$this) + { + $this->setActiveView($view); + return true; + } + else + throw new TInvalidDataValueException('multiview_viewid_invalid', $viewID); + case self::CMD_SWITCHVIEWINDEX: + $index=TPropertyValue::ensureInteger($param->getCommandParameter()); + $this->setActiveViewIndex($index); + return true; + } + } + return false; + } + + /** + * Loads state into the wizard. + * This method is invoked by the framework when the control state is being saved. + */ + public function loadState() + { + // a dummy call to ensure the view is activated + $this->getActiveView(); + } + + /** + * Renders the currently active view. + * @param THtmlWriter the writer for the rendering purpose. + */ + public function render($writer) + { + if(($view=$this->getActiveView())!==null) + $view->renderControl($writer); + } +} + +/** + * TViewCollection class. + * TViewCollection represents a collection that only takes {@link TView} instances + * as collection elements. + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TViewCollection extends TControlCollection +{ + /** + * Inserts an item at the specified position. + * This overrides the parent implementation by ensuring only {@link TView} + * controls be added into the collection. + * @param integer the speicified position. + * @param mixed new item + * @throws TInvalidDataTypeException if the item to be inserted is neither a string nor a TControl. + */ + public function insertAt($index,$item) + { + if($item instanceof TView) + parent::insertAt($index,$item); + else + throw new TInvalidDataTypeException('viewcollection_view_required'); + } +} + +/** + * TView class + * + * TView is a container for a group of controls. TView must be contained + * within a {@link TMultiView} control in which only one view can be active + * at one time. + * + * To activate a view, set {@link setActive Active} to true. + * When a view is activated, it raises {@link onActivate OnActivate} event; + * and when a view is deactivated, it raises {@link onDeactivate OnDeactivate}. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id$ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TView extends TControl +{ + private $_active=false; + + /** + * Raises <b>OnActivate</b> event. + * @param TEventParameter event parameter + */ + public function onActivate($param) + { + $this->raiseEvent('OnActivate',$this,$param); + } + + /** + * Raises <b>OnDeactivate</b> event. + * @param TEventParameter event parameter + */ + public function onDeactivate($param) + { + $this->raiseEvent('OnDeactivate',$this,$param); + } + + /** + * @return boolean whether this view is active. Defaults to false. + */ + public function getActive() + { + return $this->_active; + } + + /** + * @param boolean whether this view is active. + */ + public function setActive($value) + { + $value=TPropertyValue::ensureBoolean($value); + $this->_active=$value; + parent::setVisible($value); + } + + /** + * @param boolean whether the parents should also be checked if visible + * @return boolean whether this view is visible. + * The view is visible if it is active and its parent is visible. + */ + public function getVisible($checkParents=true) + { + if(($parent=$this->getParent())===null) + return $this->getActive(); + else if($this->getActive()) + return $parent->getVisible($checkParents); + else + return false; + } + + /** + * @param boolean + * @throws TInvalidOperationException whenever this method is invoked. + */ + public function setVisible($value) + { + throw new TInvalidOperationException('view_visible_readonly'); + } +} + |