michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: this.EXPORTED_SYMBOLS = [ michael@0: "SelectParentHelper" michael@0: ]; michael@0: michael@0: let currentBrowser = null; michael@0: michael@0: this.SelectParentHelper = { michael@0: populate: function(popup, items, selectedIndex) { michael@0: // Clear the current contents of the popup michael@0: popup.textContent = ""; michael@0: populateChildren(popup, items, selectedIndex); michael@0: }, michael@0: michael@0: open: function(browser, popup, rect) { michael@0: currentBrowser = browser; michael@0: this._registerListeners(popup); michael@0: popup.hidden = false; michael@0: michael@0: let {x, y} = browser.mapScreenCoordinatesFromContent(rect.left, rect.top + rect.height); michael@0: popup.openPopupAtScreen(x, y); michael@0: }, michael@0: michael@0: hide: function(popup) { michael@0: popup.hidePopup(); michael@0: }, michael@0: michael@0: handleEvent: function(event) { michael@0: let popup = event.currentTarget; michael@0: michael@0: switch (event.type) { michael@0: case "command": michael@0: if (event.target.hasAttribute("value")) { michael@0: currentBrowser.messageManager.sendAsyncMessage("Forms:SelectDropDownItem", { michael@0: value: event.target.value michael@0: }); michael@0: } michael@0: popup.hidePopup(); michael@0: break; michael@0: michael@0: case "popuphidden": michael@0: currentBrowser.messageManager.sendAsyncMessage("Forms:DismissedDropDown", {}); michael@0: currentBrowser = null; michael@0: this._unregisterListeners(popup); michael@0: break; michael@0: } michael@0: }, michael@0: michael@0: _registerListeners: function(popup) { michael@0: popup.addEventListener("command", this); michael@0: popup.addEventListener("popuphidden", this); michael@0: }, michael@0: michael@0: _unregisterListeners: function(popup) { michael@0: popup.removeEventListener("command", this); michael@0: popup.removeEventListener("popuphidden", this); michael@0: }, michael@0: michael@0: }; michael@0: michael@0: function populateChildren(element, options, selectedIndex, startIndex = 0, isGroup = false) { michael@0: let index = startIndex; michael@0: michael@0: for (let option of options) { michael@0: let item = element.ownerDocument.createElement("menuitem"); michael@0: item.setAttribute("label", option.textContent); michael@0: item.setAttribute("type", "radio"); michael@0: michael@0: if (index == selectedIndex) { michael@0: item.setAttribute("checked", "true"); michael@0: } michael@0: michael@0: element.appendChild(item); michael@0: michael@0: if (option.children.length > 0) { michael@0: item.classList.add("contentSelectDropdown-optgroup"); michael@0: item.setAttribute("disabled", "true"); michael@0: index = populateChildren(element, option.children, selectedIndex, index, true); michael@0: } else { michael@0: item.setAttribute("value", index++); michael@0: michael@0: if (isGroup) { michael@0: item.classList.add("contentSelectDropdown-ingroup") michael@0: } michael@0: } michael@0: } michael@0: michael@0: return index; michael@0: }