forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 2
/
SelectParentHelper.jsm
93 lines (73 loc) · 2.43 KB
/
SelectParentHelper.jsm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
this.EXPORTED_SYMBOLS = [
"SelectParentHelper"
];
let currentBrowser = null;
this.SelectParentHelper = {
populate: function(popup, items, selectedIndex) {
// Clear the current contents of the popup
popup.textContent = "";
populateChildren(popup, items, selectedIndex);
},
open: function(browser, popup, rect) {
currentBrowser = browser;
this._registerListeners(popup);
popup.hidden = false;
popup.openPopup(currentBrowser, "overlap", rect.left, rect.top + rect.height);
},
hide: function(popup) {
popup.hidePopup();
},
handleEvent: function(event) {
let popup = event.currentTarget;
switch (event.type) {
case "command":
if (event.target.hasAttribute("value")) {
currentBrowser.messageManager.sendAsyncMessage("Forms:SelectDropDownItem", {
value: event.target.value
});
}
popup.hidePopup();
break;
case "popuphidden":
currentBrowser.messageManager.sendAsyncMessage("Forms:DismissedDropDown", {});
currentBrowser = null;
this._unregisterListeners(popup);
break;
}
},
_registerListeners: function(popup) {
popup.addEventListener("command", this);
popup.addEventListener("popuphidden", this);
},
_unregisterListeners: function(popup) {
popup.removeEventListener("command", this);
popup.removeEventListener("popuphidden", this);
},
};
function populateChildren(element, options, selectedIndex, startIndex = 0, isGroup = false) {
let index = startIndex;
for (let option of options) {
let item = element.ownerDocument.createElement("menuitem");
item.setAttribute("label", option.textContent);
item.setAttribute("type", "radio");
if (index == selectedIndex) {
item.setAttribute("checked", "true");
}
element.appendChild(item);
if (option.children.length > 0) {
item.classList.add("contentSelectDropdown-optgroup");
item.setAttribute("disabled", "true");
index = populateChildren(element, option.children, selectedIndex, index, true);
} else {
item.setAttribute("value", index++);
if (isGroup) {
item.classList.add("contentSelectDropdown-ingroup")
}
}
}
return index;
}