gecko/mobile/xul/chrome/content/AwesomePanel.js
2012-05-21 12:12:37 +01:00

211 lines
6.5 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 AwesomeScreen = {
offset: 0.25, // distance the popup will be offset from the left side of the window
get headers() {
delete this.headers;
return this.headers = document.getElementById("awesome-header");
},
get container() {
delete this.container;
return this.container = document.getElementById("awesome-panels");
},
_activePanel: null,
get activePanel() {
return this._activePanel;
},
get _targets() {
delete this._targets;
return this._targets = [
this.container,
#ifdef MOZ_SERVICES_SYNC
document.getElementById("syncsetup-container"),
#endif
document.getElementById("urlbar-container"),
document.getElementById("tool-app-close"),
document.getElementById("search-engines-popup"),
document.getElementById("context-popup")
]
},
_popupShowing: false,
handleEvent: function(aEvent) {
switch (aEvent.type) {
case "PopupChanged" :
this._popupShowing = (aEvent.detail != null);
break;
case "TapDown" :
// If a popup has been shown on top of the active
// awesome panel (e.g. context menu), the panel should
// not be dismissed on TapDown.
if (this._popupShowing)
break;
let target = aEvent.target;
while (target && this._targets.indexOf(target) == -1)
target = target.parentNode;
if (!target)
this.activePanel = null;
break;
}
},
set activePanel(aPanel) {
if (this._activePanel == aPanel)
return;
let willShowPanel = (!this._activePanel && aPanel);
if (willShowPanel) {
BrowserUI.pushDialog(aPanel);
BrowserUI._edit.attachController();
BrowserUI._editURI();
this.container.hidden = this.headers.hidden = false;
window.addEventListener("TapDown", this, false);
window.addEventListener("PopupChanged", this, false);
}
if (aPanel) {
aPanel.open();
if (BrowserUI._edit.value == "")
BrowserUI._showURI();
}
let willHidePanel = (this._activePanel && !aPanel);
if (willHidePanel) {
this.container.hidden = true;
this.headers.hidden = false;
BrowserUI._edit.reset();
BrowserUI._edit.detachController();
BrowserUI.popDialog();
window.removeEventListener("TapDown", this, false);
window.removeEventListener("PopupChanged", this, false);
}
if (this._activePanel)
this._activePanel.close();
// If the keyboard will cover the full screen, we do not want to show it right away.
let isReadOnly = (aPanel != AllPagesList || BrowserUI._isKeyboardFullscreen() || (!willShowPanel && BrowserUI._edit.readOnly));
BrowserUI._edit.readOnly = isReadOnly;
if (isReadOnly)
BrowserUI._edit.blur();
this._activePanel = aPanel;
if (willHidePanel || willShowPanel) {
let event = document.createEvent("UIEvents");
event.initUIEvent("NavigationPanel" + (willHidePanel ? "Hidden" : "Shown"), true, true, window, false);
window.dispatchEvent(event);
}
// maemo can change what is shown in the urlbar. we need to resize to ensure
// that the awesomescreen and urlbar are the same width
this.doResize(ViewableAreaObserver.width, ViewableAreaObserver.height);
},
updateHeader: function updateHeader(aString) {
this.headers.hidden = (aString != "");
// During an awesome search we always show the popup_autocomplete/AllPagesList
// panel since this looks in every places and the rationale behind typing
// is to find something, whereever it is.
if (this.activePanel != AllPagesList) {
let inputField = BrowserUI._edit;
let oldClickSelectsAll = inputField.clickSelectsAll;
inputField.clickSelectsAll = false;
this.activePanel = AllPagesList;
// changing the searchString property call updateAwesomeHeader again
inputField.controller.searchString = aString;
inputField.readOnly = false;
inputField.clickSelectsAll = oldClickSelectsAll;
return;
}
let event = document.createEvent("Events");
event.initEvent("onsearchbegin", true, true);
BrowserUI._edit.dispatchEvent(event);
},
doResize: function(aWidth, aHeight) {
// awesomebar and related panels
let popup = document.getElementById("awesome-panels");
popup.top = BrowserUI.toolbarH;
if (Util.isTablet()) {
let urlbar = document.getElementById("urlbar-container");
let urlbarRect = urlbar.getBoundingClientRect();
let toolbar = document.getElementById("toolbar-main");
let toolbarRect = toolbar.getBoundingClientRect();
let dpi = Util.displayDPI;
let minHeight = 500;
if (dpi > 96)
minHeight = 3*dpi;
if (Util.localeDir > 0) {
popup.left = toolbarRect.left + this.offset*dpi;
popup.width = urlbarRect.right - toolbarRect.left - this.offset*dpi;
} else {
popup.left = urlbarRect.left;
popup.width = toolbarRect.right - urlbarRect.left - this.offset*dpi;
}
popup.height = Math.min(aHeight - BrowserUI.toolbarH, minHeight);
} else {
popup.width = aWidth;
popup.height = aHeight - BrowserUI.toolbarH;
popup.left = 0;
}
}
}
var AwesomePanel = function(aElementId, aCommandId) {
let command = document.getElementById(aCommandId);
this.panel = document.getElementById(aElementId),
this.open = function aw_open() {
command.setAttribute("checked", "true");
this.panel.hidden = false;
if (this.panel.hasAttribute("onshow")) {
let func = new Function("panel", this.panel.getAttribute("onshow"));
func.call(this.panel);
}
if (this.panel.open)
this.panel.open();
},
this.close = function aw_close() {
if (this.panel.hasAttribute("onhide")) {
let func = new Function("panel", this.panel.getAttribute("onhide"));
func.call(this.panel);
}
if (this.panel.close)
this.panel.close();
this.panel.hidden = true;
command.removeAttribute("checked");
},
this.doCommand = function aw_doCommand() {
BrowserUI.doCommand(aCommandId);
},
this.openLink = function aw_openLink(aEvent) {
let item = aEvent.originalTarget;
let uri = item.getAttribute("url") || item.getAttribute("uri");
if (uri != "") {
Browser.selectedBrowser.userTypedValue = uri;
BrowserUI.goToURI(uri);
}
}
};