From 2ff1a4bcb650b0dce241c2d947fbf59759c2efff Mon Sep 17 00:00:00 2001
From: mikl <>
Date: Thu, 17 Apr 2008 16:16:03 +0000
Subject: Fixed #622

---
 .../UI/ActiveControls/TCallbackClientScript.php    | 68 +++++++++++++++++++++-
 framework/Web/UI/TControl.php                      | 18 +++++-
 framework/Web/UI/WebControls/TCheckBox.php         | 39 ++++++++-----
 3 files changed, 109 insertions(+), 16 deletions(-)

diff --git a/framework/Web/UI/ActiveControls/TCallbackClientScript.php b/framework/Web/UI/ActiveControls/TCallbackClientScript.php
index 4ddb0654..d372e057 100644
--- a/framework/Web/UI/ActiveControls/TCallbackClientScript.php
+++ b/framework/Web/UI/ActiveControls/TCallbackClientScript.php
@@ -164,6 +164,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function setAttribute($control, $name, $value)
 	{
+        if ($control instanceof TControl && $control instanceof IControlContainer) 
+            $control=$control->getContainerClientID();
 		$this->callClientFunction('Prado.Element.setAttribute',array($control, $name, $value));
 	}
 
@@ -191,6 +193,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function show($element)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.show', $element);
 	}
 
@@ -200,6 +204,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function hide($element)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.hide', $element);
 	}
 
@@ -211,6 +217,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function toggle($element, $effect=null, $options=array())
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.toggle', array($element,$effect,$options));
 	}
 
@@ -220,6 +228,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function remove($element)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.remove', $element);
 	}
 
@@ -236,6 +246,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function update($element, $content)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->replace($element, $content, 'Element.update');
 	}
 
@@ -246,6 +258,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function addCssClass($element, $cssClass)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.addClassName', array($element, $cssClass));
 	}
 
@@ -256,6 +270,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function removeCssClass($element, $cssClass)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.removeClassName', array($element, $cssClass));
 	}
 
@@ -276,6 +292,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function scrollTo($element)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Element.scrollTo', $element);
 	}
 
@@ -296,6 +314,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function setStyle($element, $styles)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction('Prado.Element.setStyle', array($element, $styles));
 	}
 
@@ -306,6 +326,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function appendContent($element, $content)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->replace($element, $content, 'Prado.Element.Insert.append');
 	}
 
@@ -316,6 +338,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function prependContent($element, $content)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->replace($element, $content, 'Prado.Element.Insert.prepend');
 	}
 
@@ -326,6 +350,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function insertContentAfter($element, $content)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->replace($element, $content, 'Prado.Element.Insert.after');
 	}
 
@@ -336,6 +362,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function insertContentBefore($element, $content)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->replace($element, $content, 'Prado.Element.Insert.before');
 	}
 
@@ -378,6 +406,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function replaceContent($element,$content)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->replace($element, $content);
 	}
 
@@ -428,6 +458,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function visualEffect($type, $element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->callClientFunction($type, array($element, $options));
 	}
 
@@ -438,6 +470,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function appear($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Appear', $element, $options);
 	}
 
@@ -448,6 +482,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function blindDown($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.BlindDown', $element, $options);
 	}
 
@@ -458,6 +494,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function blindUp($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.BlindUp', $element, $options);
 
 	}
@@ -469,6 +507,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function dropOut($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.DropOut', $element, $options);
 	}
 
@@ -479,6 +519,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function fade($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Fade', $element, $options);
 	}
 
@@ -489,6 +531,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function fold($element, $options = null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Fold', $element, $options);
 	}
 
@@ -499,6 +543,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function grow($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Grow', $element, $options);
 	}
 
@@ -509,6 +555,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function puff($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Puff', $element, $options);
 	}
 
@@ -519,6 +567,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function pulsate($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Pulsate', $element, $options);
 	}
 
@@ -529,6 +579,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function shake($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Shake', $element, $options);
 	}
 
@@ -539,6 +591,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function shrink($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Shrink', $element, $options);
 	}
 
@@ -549,6 +603,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function slideDown($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.SlideDown', $element, $options);
 	}
 
@@ -559,6 +615,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function slideUp($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.SlideUp', $element, $options);
 	}
 
@@ -569,6 +627,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function squish($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.Squish', $element, $options);
 	}
 
@@ -579,6 +639,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function switchOff($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Effect.SwitchOff', $element, $options);
 	}
 
@@ -589,6 +651,8 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function highlight($element, $options=null)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$this->visualEffect('Prado.Effect.Highlight', $element, $options);
 	}
 
@@ -599,9 +663,11 @@ class TCallbackClientScript extends TApplicationComponent
 	 */
 	public function setOpacity($element, $value)
 	{
+        if ($element instanceof TControl && $element instanceof IControlContainer) 
+            $element=$element->getContainerClientID();
 		$value = TPropertyValue::ensureFloat($value);
 		$this->callClientFunction('Element.setOpacity', array($element,$value));
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/framework/Web/UI/TControl.php b/framework/Web/UI/TControl.php
index d43ddf10..f20cd2d1 100644
--- a/framework/Web/UI/TControl.php
+++ b/framework/Web/UI/TControl.php
@@ -2151,6 +2151,22 @@ interface IButtonControl
 	public function getIsDefaultButton();
 }
 
+/**
+ * IControlContainer interface
+ *
+ * If a control can have an additional surrounding tag, it should implement this interface.
+ *
+ * @package System.Web.UI
+ * @since 3.1.2
+ */
+interface IControlContainer
+{
+	/**
+	 * @return string the id of the container html tag or of the input control itself if no container present.
+	 */
+	public function getContainerClientID();
+}
+
 /**
  * TBroadcastEventParameter class
  *
@@ -2358,4 +2374,4 @@ class TCompositeLiteral extends TComponent implements IRenderable, IBindable
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/framework/Web/UI/WebControls/TCheckBox.php b/framework/Web/UI/WebControls/TCheckBox.php
index 7a0fc603..4061f217 100644
--- a/framework/Web/UI/WebControls/TCheckBox.php
+++ b/framework/Web/UI/WebControls/TCheckBox.php
@@ -40,7 +40,7 @@
  * @package System.Web.UI.WebControls
  * @since 3.0
  */
-class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable, IDataRenderer
+class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable, IDataRenderer, IControlContainer
 {
 	private $_dataChanged=false;
 
@@ -267,6 +267,14 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl
 		$this->setViewState('ValidationGroup',$value,'');
 	}
 
+	/**
+	 * @return string the id of the surrounding tag or this clientID if no such tag present
+	 */
+	public function getContainerClientID()
+	{
+        return $this->getSpanNeeded() ? $this->getClientID().'_parent' : $this->getClientID();
+	}
+
 	/**
 	 * Renders the checkbox control.
 	 * This method overrides the parent implementation by rendering a checkbox input element
@@ -276,17 +284,10 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl
 	public function render($writer)
 	{
 		$this->getPage()->ensureRenderInForm($this);
-		$needSpan=false;
 		if($this->getHasStyle())
-		{
 			$this->getStyle()->addAttributesToRender($writer);
-			$needSpan=true;
-		}
 		if(($tooltip=$this->getToolTip())!=='')
-		{
 			$writer->addAttribute('title',$tooltip);
-			$needSpan=true;
-		}
 		if($this->getHasAttributes())
 		{
 			$attributes=$this->getAttributes();
@@ -295,17 +296,17 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl
 			if(($onclick=$attributes->remove('onclick'))===null)
 				$onclick='';
 			if($attributes->getCount())
-			{
 				$writer->addAttributes($attributes);
-				$needSpan=true;
-			}
 			if($value!==null)
 				$attributes->add('value',$value);
 		}
 		else
 			$onclick='';
-		if($needSpan)
+        if($needspan=$this->getSpanNeeded())
+        {
+            $writer->addAttribute('id',$this->getContainerClientID());
 			$writer->renderBeginTag('span');
+        }
 		$clientID=$this->getClientID();
 		if(($text=$this->getText())!=='')
 		{
@@ -322,7 +323,7 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl
 		}
 		else
 			$this->renderInputTag($writer,$clientID,$onclick);
-		if($needSpan)
+		if($needspan)
 			$writer->renderEndTag();
 	}
 
@@ -391,6 +392,16 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl
 		$this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true);
 	}
 
+    /**
+     * Check if we need a span tag to surround this control. The span tag will be created if
+     * the Text property is set for this control. 
+     *
+     * @return bool wether this control needs a surrounding span tag
+     */
+    protected function getSpanNeeded() {
+        return $this->getText()!=='';
+    }
+
 	/**
 	 * Renders a label beside the checkbox.
 	 * @param THtmlWriter the writer for the rendering purpose
@@ -500,4 +511,4 @@ class TTextAlign extends TEnumerable
 	const Right='Right';
 }
 
-?>
\ No newline at end of file
+?>
-- 
cgit v1.2.3