|
|
- <?php
-
- class QCollapsablePanel extends QPanel
- {
- protected $pnlHeader;
- protected $pnlBody;
- protected $btnToggle;
-
- protected $blnExpanded;
- /**
- * NOTE: When set to false this uses client side javascript to hide the body NOT a server action.
- * TODO: support server actions (ie, no javascript). Also, use native qcodo javascript lib for the
- * client side action.
- *@var boolean - use ajax call or client javascript
- */
- protected $blnUseAjax = true;
- /**
- *@var string - the base directory in which to find images
- */
- protected $strImagesPath;
- /**
- *@var string - the filename for the toggle button image with body expanded
- */
- protected $strExpandedImageUri;
- /**
- *@var string - the filename for the toggle button image with body collapsed
- */
- protected $strCollapsedImageUri;
-
- public function __construct($objParentObject,
- $strControlId = null,
- $blnExpanded = false,
- $blnUseAjax = true,
- $strExpandedImageUri = '/treenav_expanded.png',
- $strCollapsedImageUri = '/treenav_collapsed.png',
- $strImagesPath= null
- )
- {
-
- try {
- parent::__construct($objParentObject, $strControlId);
- } catch (QCallerException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- $this->blnExpanded = $blnExpanded;
- $this->blnUseAjax = $blnUseAjax;
- if(!$strImagesPath)
- $this->strImagesPath = __QUASI_CONTRIB_IMAGES__;
- else
- $this->strImagesPath = $strImagesPath;
- $this->strExpandedImageUri = $this->strImagesPath . $strExpandedImageUri;
- $this->strCollapsedImageUri = $this->strImagesPath . $strCollapsedImageUri;
-
- $this->AutoRenderChildren = true;
-
- $this->pnlHeader = new QPanel($this);
- $this->pnlHeader->CssClass = 'CollapsableHeader';
- $this->pnlBody = new QPanel($this);
- $this->pnlBody->CssClass = 'CollapsableBody';
- $this->btnToggle = new QImageButton($this->pnlHeader);
-
- $this->pnlHeader->AutoRenderChildren = true;
- $this->pnlBody->AutoRenderChildren = true;
-
- $this->setButtonAction();
-
- //fake a click to set the initial state - interesting breakage happens if you use this
- // $this->btnToggle_Click(null,null,null);
- }
-
- protected function setButtonAction()
- {
- $this->btnToggle->RemoveAllActions(QClickEvent::EventName);
- if ($this->blnUseAjax)
- {
- $this->btnToggle->AddAction(new QClickEvent(), new QAjaxControlAction($this, "btnToggle_Click"));
- ///fixme - why doesn't this work??
- // $this->pnlHeader->AddAction(new QClickEvent(), new QAjaxControlAction($this, "btnToggle_Click"));
- }
- else
- {
- $onclick = "el=document.getElementById('".$this->pnlBody->ControlId."'); imgEl=document.getElementById('".$this->btnToggle->ControlId."'); if (el.style.display=='block') {el.style.display='none'; imgEl.src = '".$this->strCollapsedImageUri."';} else {el.style.display='block'; imgEl.src = '".$this->strExpandedImageUri."';}";
- $this->btnToggle->AddAction(new QClickEvent(), new QJavaScriptAction($onclick));
- }
- }
-
- public function btnToggle_Click($strFormId, $strControlId, $strParameter)
- {
- if ($this->blnExpanded)
- $this->CollapseBody();
- else
- $this->ExpandBody();
- }
-
- public function ExpandBody()
- {
- if ($this->blnUseAjax)
- $this->pnlBody->Visible = true;
- else
- $this->pnlBody->DisplayStyle = QDisplayStyle::Block;
-
- if ($this->btnToggle instanceof QImageButton)
- $this->btnToggle->ImageUrl = $this->strExpandedImageUri;
-
- $this->blnExpanded = true;
- $this->MarkAsModified();
- }
-
- public function CollapseBody()
- {
- if ($this->blnUseAjax)
- $this->pnlBody->Visible = false;
- else
- $this->pnlBody->DisplayStyle = QDisplayStyle::None;
-
- $this->btnToggle->ImageUrl = $this->strCollapsedImageUri;
- $this->blnExpanded = false;
- $this->MarkAsModified();
- }
-
- /////////////////////////
- // Public Properties: GET
- /////////////////////////
- public function __get($strName)
- {
- switch ($strName)
- {
- case "Header":
- return $this->pnlHeader;
- case "Body":
- return $this->pnlBody;
- case "Button":
- return $this->btnToggle;
- case "Expanded":
- return $this->blnExpanded;
- case "UseAjax":
- return $this->blnUseAjax;
- case "ImagesPath":
- return $this->strImagesPath;
- case "ExpandedImageUri":
- return $this->strExpandedImageUri;
- case "CollapsedImageUri":
- return $this->strCollapsedImageUri;
-
- default:
- try {
- return parent::__get($strName);
- } catch (QCallerException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- }
- }
- /////////////////////////
- // Public Properties: SET
- /////////////////////////
- public function __set($strName, $mixValue)
- {
- $this->blnModified = true;
-
- switch ($strName)
- {
- case "Expanded":
- try {
- $this->blnExpanded = QType::Cast($mixValue, QType::Boolean);
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- if ($this->blnExpanded)
- $this->ExpandBody();
- else
- $this->CollapseBody();
- break;
- case "UseAjax":
- try {
- $this->blnUseAjax = QType::Cast($mixValue, QType::Boolean);
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- $this->setButtonAction();
- break;
-
- case "ExpandedImageUri":
- try {
- $tmp = QType::Cast($mixValue, QType::String);
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- if( '/' != $tmp[0] )
- $tmp = '/' . $tmp;
- $this->strExpandedImageUri = $this->strImagesPath . $tmp;
- break;
-
- case "CollapsedImageUri":
- try {
- $tmp = QType::Cast($mixValue, QType::String);
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- if( '/' != $tmp[0] )
- $tmp = '/' . $tmp;
- $this->strCollapsedImageUri = $this->strImagesPath . $tmp;
- break;
-
- case "ImagesPath":
- try {
- return ($this->strImagesPath = QType::Cast($mixValue, QType::String));
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
-
- default:
- try {
- parent::__set($strName, $mixValue);
- } catch (QCallerException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- }
- }
- }
- ?>
|