summaryrefslogtreecommitdiff
path: root/framework/Web/UI/WebControls/TWebControlDecorator.php
diff options
context:
space:
mode:
authorjavalizard <>2010-04-18 19:03:03 +0000
committerjavalizard <>2010-04-18 19:03:03 +0000
commitf50f883a91222b5727d5b8518cecbaa4c18d3741 (patch)
tree75b55757ab3887099ed3e157eb88633e04f740e3 /framework/Web/UI/WebControls/TWebControlDecorator.php
parent28bdf3c84990dbec6e16be94a0cf99e02defb581 (diff)
Adds a property to ensure an id is rendered. Also adds the creation of TWebControlDecorator. It also accounts for the render blocker in TWebControl. Adds an alternate render path when decorators are present. Adds the TWebControlDecorator class. Now skins can define their own surrounding tag html and templates instead of having to code every page.
Diffstat (limited to 'framework/Web/UI/WebControls/TWebControlDecorator.php')
-rw-r--r--framework/Web/UI/WebControls/TWebControlDecorator.php339
1 files changed, 339 insertions, 0 deletions
diff --git a/framework/Web/UI/WebControls/TWebControlDecorator.php b/framework/Web/UI/WebControls/TWebControlDecorator.php
new file mode 100644
index 00000000..07102d31
--- /dev/null
+++ b/framework/Web/UI/WebControls/TWebControlDecorator.php
@@ -0,0 +1,339 @@
+<?
+/**
+ * TWebControlDecorator class file.
+ *
+ * @author Brad Anderson <javalizard@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2010 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id: TWebControlDecorator.php 2541 2008-10-21 15:05:13Z qiang.xue $
+ * @package System.Web.UI.WebControls
+ */
+
+
+/**
+ * TWebControlDecorator class
+ *
+ * This places theme related html and templates before and after both the open and close
+ * tag of a {@link TWebControl}.
+ *
+ * This is an easy way to have your look and feel depend upon the theme instead of writing
+ * specific html in your templates to achieve your website desires. This makes updating the
+ * look and feel of your website much more simple. Here is an example of how to code your theme
+ * skin:
+ * <code>
+ * <com:THeader2 TagName="h3">
+ * <prop:Decorator.PreTagText>
+ * <!-- In case the them you are importing needs this for it's h3 to look right -->
+ * <div class="imported-theme-h3-container">
+ * </prop:Decorator.PreTagText>
+ * <prop:Decorator.PostTagText>
+ * <!-- To close things properly -->
+ * </div>
+ * </prop:Decorator.PostTagText>
+ * </com:THeader2>
+ * </code>
+ *
+ * The order of the inclusion of the decoration into the page goes like this:
+ * * PreTagTemplate
+ * * PreTagText
+ * * TWebControl Open Tag Rendered
+ * * PreContentsText
+ * * PreContentsTemplate
+ * * TWebControl Children Rendered
+ * * PostContentsTemplate
+ * * PostContentsText
+ * * TWebControl CloseTag Rendered
+ * * PostTagText
+ * * PostTagTemplate
+ *
+ * To move controls around please see the {@link TMigrate} control. You may use {@link TMigrate}
+ * in your Decorator templates to move controls in your MasterTemplate around using your theme
+ * elements around on your page.
+ *
+ * @author Brad Anderson <javalizard@gmail.com>
+ * @version $Id: TWebControlDecorator.php 2541 2008-10-21 15:05:13Z qiang.xue $
+ * @package System.Web.UI.WebControls
+ * @since 3.2
+ */
+
+class TWebControlDecorator extends TComponent {
+
+ /**
+ * @var boolean tells if there should only be decoration around the inner content
+ */
+ private $_internalonly;
+
+ /**
+ * @var TWebControl the control to decorate
+ */
+ private $_control;
+
+ /**
+ * @var boolean This tells if the Templates have been
+ */
+ private $_addedTemplateDecoration=false;
+
+
+ /**
+ * @var string the text that goes before the open tag
+ */
+ private $_pretagtext = '';
+ /**
+ * @var string the text that goes after the open tag
+ */
+ private $_precontentstext = '';
+ /**
+ * @var string the text that goes before the close tag
+ */
+ private $_postcontentstext = '';
+ /**
+ * @var string the text that goes after the close tag
+ */
+ private $_posttagtext = '';
+
+
+
+ /**
+ * @var TTemplate the template that goes before the open tag
+ */
+ private $_pretagtemplate;
+ /**
+ * @var TTemplate the template that goes after the open tag
+ */
+ private $_precontentstemplate;
+ /**
+ * @var TTemplate the template that goes before the close tag
+ */
+ private $_postcontentstemplate;
+ /**
+ * @var TTemplate the template that goes after the close tag
+ */
+ private $_posttagtemplate;
+
+ /**
+ * Constructor.
+ * Initializes the control .
+ * @param TWebControl The control that is to be decorated.
+ * @param boolean whether decoration is just around the inner content
+ */
+ public function __construct($control, $onlyinternal = false) {
+ parent::__construct();
+
+ $this->_control = $control;
+ $this->_internalonly = $onlyinternal;
+ }
+
+ /**
+ * @return string gets the text before the open tag in the TWebControl
+ */
+ public function getPreTagText() {
+ return $this->_pretagtext;
+ }
+
+ /**
+ * @param string sets the text before the open tag in the TWebControl
+ */
+ public function setPreTagText($value) {
+ if(!$this->_internalonly && !$this->_control->getIsSkinApplied())
+ $this->_pretagtext = TPropertyValue::ensureString($value);
+ }
+
+
+ /**
+ * @return string the text after the open tag in the TWebControl
+ */
+ public function getPreContentsText() {
+ return $this->_precontentstext;
+ }
+
+ /**
+ * @param string sets the text after the open tag in the TWebControl
+ */
+ public function setPreContentsText($value) {
+ if(!$this->_control->getIsSkinApplied())
+ $this->_precontentstext = TPropertyValue::ensureString($value);
+ }
+
+
+ /**
+ * @return string the text before the close tag in the TWebControl
+ */
+ public function getPostContentsText() {
+ return $this->_postcontentstext;
+ }
+
+ /**
+ * @param string sets the text before the close tag in the TWebControl
+ */
+ public function setPostContentsText($value) {
+ if(!$this->_control->getIsSkinApplied())
+ $this->_postcontentstext = TPropertyValue::ensureString($value);
+ }
+
+
+ /**
+ * @return string the text before the close tag in the TWebControl
+ */
+ public function getPostTagText() {
+ return $this->_posttagtext;
+ }
+
+ /**
+ * @param string sets the text after the close tag in the TWebControl
+ */
+ public function setPostTagText($value) {
+ if(!$this->_internalonly && !$this->_control->getIsSkinApplied())
+ $this->_posttagtext = TPropertyValue::ensureString($value);
+ }
+
+
+ /**
+ * @return TTemplate|null the template before the open tag in the TWebControl. Defaults to null.
+ */
+ public function getPreTagTemplate() {
+ return $this->_pretagtemplate;
+ }
+
+ /**
+ * @param TTemplate sets the template before the open tag in the TWebControl
+ */
+ public function setPreTagTemplate($value) {
+ if(!$this->_internalonly && !$this->_control->getIsSkinApplied())
+ $this->_pretagtemplate = $value;
+ }
+
+
+ /**
+ * @return TTemplate|null the template after the open tag in the TWebControl. Defaults to null.
+ */
+ public function getPreContentsTemplate() {
+ return $this->_precontentstemplate;
+ }
+
+ /**
+ * @param TTemplate sets the template after the open tag in the TWebControl
+ */
+ public function setPreContentsTemplate($value) {
+ if(!$this->_control->getIsSkinApplied())
+ $this->_precontentstemplate = $value;
+ }
+
+
+ /**
+ * @return TTemplate|null the template before the close tag in the TWebControl. Defaults to null.
+ */
+ public function getPostContentsTemplate() {
+ return $this->_postcontentstemplate;
+ }
+
+ /**
+ * @param TTemplate sets the template before the close tag in the TWebControl
+ */
+ public function setPostContentsTemplate($value) {
+ if(!$this->_control->getIsSkinApplied())
+ $this->_postcontentstemplate = $value;
+ }
+
+
+ /**
+ * @return TTemplate|null the template after the close tag in the TWebControl. Defaults to null.
+ */
+ public function getPostTagTemplate() {
+ return $this->_posttagtemplate;
+ }
+
+ /**
+ * @param TTemplate sets the template before the close tag in the TWebControl
+ */
+ public function setPostTagTemplate($value) {
+ if(!$this->_internalonly && !$this->_control->getIsSkinApplied())
+ $this->_posttagtemplate = $value;
+ }
+
+ /**
+ * this is a framework call. The Text decoration can't
+ * influence the object hierarchy because they are rendered into into the writer directly.
+ * This call attaches the ensureTemplateDecoration to the TPage onSaveStateComplete so
+ * these controls don't have page states. This is as close to not influencing the page as possible.
+ */
+ public function instantiate() {
+
+ $this->_addedTemplateDecoration = false;
+
+ if($this->getPreTagTemplate() || $this->getPreContentsTemplate() ||
+ $this->getPostContentsTemplate() || $this->getPostTagTemplate())
+ $control->Page->onSaveStateComplete[] = array($this, 'ensureTemplateDecoration');
+ // OnPreRenderComplete onSaveStateComplete
+ }
+
+
+ /**
+ * This method places the templates around the open and close tag
+ * @return boolean returns true if the template decorations have been added
+ */
+ public function ensureTemplateDecoration() {
+ $control = $this->_control;
+ if($this->_addedTemplateDecoration || !$control->Parent) return $this->_addedTemplateDecoration;
+
+ $this->_addedTemplateDecoration = true;
+
+ if($this->getPreTagTemplate()) {
+ $pretag = Prado::createComponent('TCompositeControl');
+ $this->getPreTagTemplate()->instantiateIn($pretag);
+ $control->getParent()->getControls()->insertBefore($control, $pretag);
+ }
+
+ if($this->getPreContentsTemplate()) {
+ $precontents = Prado::createComponent('TCompositeControl');
+ $this->getPreContentsTemplate()->instantiateIn($precontents);
+ $control->getControls()->insertAt(0, $precontents);
+ }
+
+ if($this->getPostContentsTemplate()) {
+ $postcontents = Prado::createComponent('TCompositeControl');
+ $this->getPostContentsTemplate()->instantiateIn($postcontents);
+ $control->getControls()->add($postcontents);
+ }
+
+ if($this->getPostTagTemplate()) {
+ $posttag = Prado::createComponent('TCompositeControl');
+ $this->getPostTagTemplate()->instantiateIn($posttag);
+ $control->getParent()->getControls()->insertAfter($control, $posttag);
+ }
+ return true;
+ }
+
+
+ /**
+ * This method places the pre tag text into the {@link TTextWriter}
+ * @param {@link TTextWriter} the writer to which the text is written
+ */
+ public function renderPreTagText($writer) {
+ $writer->write($this->getPreTagText());
+ }
+
+ /**
+ * This method places the pre contents text into the {@link TTextWriter}
+ * @param {@link TTextWriter} the writer to which the text is written
+ */
+ public function renderPreContentsText($writer) {
+ $writer->write($this->getPreContentsText());
+ }
+
+ /**
+ * This method places the post contents text into the {@link TTextWriter}
+ * @param {@link TTextWriter} the writer to which the text is written
+ */
+ public function renderPostContentsText($writer) {
+ $writer->write($this->getPostContentsText());
+ }
+
+ /**
+ * This method places the post tag text into the {@link TTextWriter}
+ * @param {@link TTextWriter} the writer to which the text is written
+ */
+ public function renderPostTagText($writer) {
+ $writer->write($this->getPostTagText());
+ }
+}