diff options
Diffstat (limited to '')
-rw-r--r-- | comm/suite/base/content/viewApplyThemeOverlay.js | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/comm/suite/base/content/viewApplyThemeOverlay.js b/comm/suite/base/content/viewApplyThemeOverlay.js new file mode 100644 index 0000000000..557dc50a3b --- /dev/null +++ b/comm/suite/base/content/viewApplyThemeOverlay.js @@ -0,0 +1,170 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + + * 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/. */ + +const {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm"); +ChromeUtils.defineModuleGetter(this, "LightweightThemeManager", + "resource://gre/modules/LightweightThemeManager.jsm"); + +var gThemes = []; +var gApplyThemeBundle; +var gBackgroundIsActive; + +function reloadThemes() +{ + AddonManager.getAddonsByTypes(["theme"], function(themes) { + gThemes = themes.sort(function(a, b) { + return a.name.localeCompare(b.name); + }); + }); +} + +var gAddonListener = { + onEnabling: function(val) {}, + onEnabled: function(val) {}, + onDisabling: function(val) {}, + onDisabled: function(val) {}, + onInstalling: function(val) {}, + onInstalled: reloadThemes, + onUninstalling: function(val) {}, + onUninstalled: reloadThemes, + onOperationCancelled: reloadThemes +}; + +function getNewThemes() +{ + // get URL for more themes from prefs + try { + openURL(Services.urlFormatter.formatURLPref("extensions.getMoreThemesURL")); + } + catch (e) { + dump(e); + } +} + +function getPersonas() +{ + // get URL for more themes from prefs + try { + openURL(Services.urlFormatter.formatURLPref("extensions.getPersonasURL")); + } + catch (e) { + dump(e); + } +} + +function checkTheme(popup) +{ + const ID_SUFFIX = "@personas.mozilla.org"; + gBackgroundIsActive = false; + + var usedThemes = LightweightThemeManager.usedThemes; + usedThemes = new Map(usedThemes.map( x => [x.id + ID_SUFFIX, x] )); + + while (popup.lastChild.localName != 'menuseparator') + popup.lastChild.remove(); + gThemes.forEach(function(theme) { + var menuitem = document.createElement('menuitem'); + menuitem.setAttribute("label", theme.name); + menuitem.setAttribute("type", "radio"); + menuitem.setAttribute("name", "themeGroup"); + if (theme.description) + menuitem.setAttribute("tooltiptext", theme.description); + if (!theme.userDisabled) + menuitem.setAttribute("checked", "true"); + else if (!(theme.permissions & AddonManager.PERM_CAN_ENABLE)) + menuitem.setAttribute("disabled", "true"); + menuitem.theme = theme; + + var persona = usedThemes.get(theme.id); + if (persona) { + menuitem.persona = persona; + if (theme.isActive) + gBackgroundIsActive = true; + } + + popup.appendChild(menuitem); + }); +} + +function previewTheme(event) +{ + if (!gBackgroundIsActive || !event.target.persona) + return; + + switch (event.type) { + case "DOMMenuItemActive": + LightweightThemeManager.previewTheme(event.target.persona); + break; + case "DOMMenuItemInactive": + LightweightThemeManager.resetPreview(); + break; + } +} + +function restartApp() +{ + // Notify all windows that an application quit has been requested. + var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"] + .createInstance(Ci.nsISupportsPRBool); + + Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart"); + + // Something aborted the quit process. + if (cancelQuit.data) + return; + + Services.prefs.setBoolPref("browser.sessionstore.resume_session_once", true); + const appStartup = Services.startup; + appStartup.quit(appStartup.eRestart | appStartup.eAttemptQuit); +} + +function applyTheme(menuitem) +{ + if (!menuitem.theme) + return; + + menuitem.theme.userDisabled = false; + if (!menuitem.theme.isActive) { + var promptTitle = gApplyThemeBundle.getString("switchskinstitle"); + // gBrandBundle: bundle_brand stringbundle from overlayed XUL file + var brandName = gBrandBundle.getString("brandShortName"); + var promptMsg = gApplyThemeBundle.getFormattedString("switchskins", [brandName]); + var promptNow = gApplyThemeBundle.getString("switchskinsnow"); + var promptLater = gApplyThemeBundle.getString("switchskinslater"); + var check = {value: false}; + var flags = Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING + + Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_IS_STRING; + var pressedVal = Services.prompt.confirmEx(window, promptTitle, promptMsg, + flags, promptNow, promptLater, + null, null, check); + if (pressedVal == 0) + restartApp(); + } +} + +function applyThemeOnLoad() +{ + // init globals + gApplyThemeBundle = document.getElementById("bundle_viewApplyTheme"); + AddonManager.addAddonListener(gAddonListener); + reloadThemes(); + + removeEventListener("load", applyThemeOnLoad, false); + addEventListener("unload", applyThemeOnUnload, false); + var popup = document.getElementById("menu_viewApplyTheme_Popup"); + popup.addEventListener("DOMMenuItemActive", previewTheme); + popup.addEventListener("DOMMenuItemInactive", previewTheme); +} + +function applyThemeOnUnload() +{ + AddonManager.removeAddonListener(gAddonListener); + var popup = document.getElementById("menu_viewApplyTheme_Popup"); + popup.removeEventListener("DOMMenuItemActive", previewTheme); + popup.removeEventListener("DOMMenuItemInactive", previewTheme); +} + +addEventListener("load", applyThemeOnLoad, false); |