addItem($item, $control, $isStartElement); } } /** * Get the Menu Elements * * @api * @return MenuElement[] */ public function getElements() { return $this->elements; } /** * Add a Menu item * * @api * @param Control $item Item Control in the Menu bar * @param Control $control Toggled Menu Control * @param bool $isStartElement (optional) Whether the Menu should start with this Element * @return static */ public function addItem(Control $item, Control $control, $isStartElement = false) { $menuElement = new MenuElement($item, $control); $this->addElement($menuElement, $isStartElement); return $this; } /** * Add a Menu Element * * @api * @param MenuElement $menuElement Menu Element * @param bool $isStartElement (optional) Whether the Menu should start with this Element * @return static */ public function addElement(MenuElement $menuElement, $isStartElement = false) { if (!in_array($menuElement, $this->elements, true)) { array_push($this->elements, $menuElement); if ($isStartElement) { // new start element $this->setStartElement($menuElement); } else { // additional element - set invisible $menuElement->getControl() ->setVisible(false); } } return $this; } /** * Get the Element to start with * * @api * @return MenuElement */ public function getStartElement() { return $this->startElement; } /** * Set the Element to start with * * @api * @param MenuElement $startElement Start Element * @return static */ public function setStartElement(MenuElement $startElement = null) { $this->startElement = $startElement; if ($startElement && !in_array($startElement, $this->elements, true)) { array_push($this->elements, $startElement); } return $this; } /** * @see ScriptFeature::prepare() */ public function prepare(Script $script) { $updateFunctionName = self::FUNCTION_UPDATE_MENU; $elementsArrayText = $this->getElementsArrayText(); // OnInit if ($this->startElement) { $startControlId = Builder::escapeText($this->startElement->getControl()->getId()); $initScriptText = " {$updateFunctionName}({$elementsArrayText}, {$startControlId});"; $script->appendGenericScriptLabel(ScriptLabel::ONINIT, $initScriptText, true); } // MouseClick $scriptText = " declare MenuElements = {$elementsArrayText}; if (MenuElements.existskey(Event.Control.ControlId)) { declare ShownControlId = MenuElements[Event.Control.ControlId]; {$updateFunctionName}(MenuElements, ShownControlId); }"; $script->appendGenericScriptLabel(ScriptLabel::MOUSECLICK, $scriptText, true); // Update menu function $updateFunctionText = " Void {$updateFunctionName}(Text[Text] _Elements, Text _ShownControlId) { foreach (ItemId => ControlId in _Elements) { declare Control <=> (Page.GetFirstChild(ControlId)); Control.Visible = (ControlId == _ShownControlId); } }"; $script->addScriptFunction($updateFunctionName, $updateFunctionText); return $this; } /** * Build the array text for the Elements * * @return string */ protected function getElementsArrayText() { $elements = array(); foreach ($this->elements as $element) { $elementId = $element->getItem() ->getId(); $elements[$elementId] = $element->getControl() ->getId(); } return Builder::getArray($elements, true); } }