gecko-dev/mobile/xul/chrome/content/AppMenu.js

186 строки
5.6 KiB
JavaScript

/* 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/. */
var AppMenu = {
offset: 10,
get panel() {
delete this.panel;
return this.panel = document.getElementById("appmenu");
},
get popup() {
delete this.popup;
return this.popup = document.getElementById("appmenu-popup");
},
shouldShow: function appmenu_shouldShow(aElement) {
return !aElement.hidden;
},
overflowMenu : [],
show: function show() {
let modals = document.getElementsByClassName("modal-block").length;
if (AwesomeScreen.activePanel || BrowserUI.isPanelVisible() || modals > 0 || BrowserUI.activeDialog)
return;
// Figure if we should show a menu-list or a pop-up menu
let menuButton = document.getElementById("tool-menu");
let listFormat = (getComputedStyle(menuButton).visibility == "visible");
addEventListener("keypress", this, true);
if (listFormat) {
let listbox = document.getElementById("appmenu-popup-appcommands");
while (listbox.firstChild)
listbox.removeChild(listbox.firstChild);
let siteCommandsBox = document.getElementById("appmenu-popup-sitecommands");
while (siteCommandsBox.firstChild)
siteCommandsBox.removeChild(siteCommandsBox.firstChild);
let childrenCount = this.panel.childElementCount;
for (let i = 0; i < childrenCount; i++) {
let child = this.panel.children[i];
if (!this.shouldShow(child))
continue;
child.setAttribute("show", true);
let item = document.createElement("richlistitem");
item.setAttribute("class", child.className);
item.onclick = function() { child.click(); }
let label = document.createElement("label");
label.textContent = child.label;
item.appendChild(label);
if (item.classList.contains("appmenu-pageaction"))
siteCommandsBox.appendChild(item);
else
listbox.appendChild(item);
}
this.popup.hidden = false;
this.popup.anchorTo(menuButton, "after_end");
BrowserUI.lockToolbar();
BrowserUI.pushPopup(this, [this.popup, menuButton]);
} else {
let shown = 0;
let lastShown = null;
this.overflowMenu = [];
let childrenCount = this.panel.childElementCount;
for (let i = 0; i < childrenCount; i++) {
if (this.shouldShow(this.panel.children[i])) {
if (shown == 6 && this.overflowMenu.length == 0) {
// if we are trying to show more than 6 elements fall back to showing a more button
lastShown.removeAttribute("show");
this.overflowMenu.push(lastShown);
this.panel.appendChild(this.createMoreButton());
}
if (this.overflowMenu.length > 0) {
this.overflowMenu.push(this.panel.children[i]);
} else {
lastShown = this.panel.children[i];
lastShown.setAttribute("show", shown);
shown++;
}
}
}
this.panel.setAttribute("count", shown);
this.panel.hidden = false;
BrowserUI.lockToolbar();
BrowserUI.pushPopup(this, [this.panel, Elements.toolbarContainer]);
}
},
hide: function hide() {
this.panel.hidden = true;
this.popup.hidden = true;
let moreButton = document.getElementById("appmenu-more-button");
if (moreButton)
moreButton.parentNode.removeChild(moreButton);
for (let i = 0; i < this.panel.childElementCount; i++) {
if (this.panel.children[i].hasAttribute("show"))
this.panel.children[i].removeAttribute("show");
}
removeEventListener("keypress", this, true);
BrowserUI.unlockToolbar();
BrowserUI.popPopup(this);
},
toggle: function toggle() {
(this.panel.hidden && this.popup.hidden) ? this.show() : this.hide();
},
handleEvent: function handleEvent(aEvent) {
this.hide();
},
showAsList: function showAsList() {
// allow menu to hide to remove the more button before we show the menulist
setTimeout((function() {
AppMenuOverflow.show(this.overflowMenu);
}).bind(this), 0)
},
createMoreButton: function() {
let button = document.createElement("toolbarbutton");
button.setAttribute("id", "appmenu-more-button");
button.setAttribute("class", "appmenu-button");
button.setAttribute("label", Strings.browser.GetStringFromName("appMenu.more"));
button.setAttribute("show", 6);
button.setAttribute("oncommand", "AppMenu.showAsList();");
return button;
}
};
var AppMenuOverflow = {
get container() {
delete this.container;
return this.container = document.getElementById("appmenu-overflow");
},
get list() {
delete this.list;
return this.list = document.getElementById("appmenu-overflow-commands");
},
show: function show(aList) {
let container = this.container;
let listbox = this.list;
while (listbox.firstChild)
listbox.removeChild(listbox.firstChild);
let children = aList;
for (let i = 0; i < children.length; i++) {
let child = children[i];
let item = document.createElement("richlistitem");
item.setAttribute("class", "appmenu-button");
item.onclick = function() { child.click(); }
let label = document.createElement("label");
label.setAttribute("value", child.label);
item.appendChild(label);
listbox.appendChild(item);
}
container.hidden = false;
BrowserUI.pushPopup(this, [this.container]);
},
hide: function hide() {
this.container.hidden = true;
BrowserUI.popPopup(this);
}
};