Mypal/application/palemoon/components/statusbar/status4evar.js

696 lines
16 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/. */
"use strict";
// Component constants
const CC = Components.classes;
const CI = Components.interfaces;
const CU = Components.utils;
CU.import("resource://gre/modules/XPCOMUtils.jsm");
CU.import("resource://gre/modules/Services.jsm");
const CURRENT_MIGRATION = 8;
function Status_4_Evar(){}
Status_4_Evar.prototype =
{
classID: Components.ID("{33d0433d-07be-4dc4-87fd-954057310efd}"),
QueryInterface: XPCOMUtils.generateQI([
CI.nsISupportsWeakReference,
CI.nsIObserver,
CI.nsIStatus4Evar
]),
prefs: null,
addonbarBorderStyle: false,
addonbarCloseButton: false,
addonbarWindowGripper: true,
advancedStatusDetectFullScreen: true,
advancedStatusDetectVideo: true,
downloadButtonAction: 1,
downloadButtonActionCommand: "",
downloadColorActive: null,
downloadColorPaused: null,
downloadForce: false,
downloadLabel: 0,
downloadLabelForce: true,
downloadNotifyAnimate: true,
downloadNotifyTimeout: 60000,
downloadProgress: 1,
downloadTooltip: 1,
firstRun: true,
progressToolbarCSS: null,
progressToolbarForce: false,
progressToolbarStyle: false,
status: 1,
statusDefault: true,
statusNetwork: true,
statusTimeout: 10000,
statusLinkOver: 1,
statusLinkOverDelayShow: 70,
statusLinkOverDelayHide: 150,
statusToolbarMaxLength: 0,
statusToolbarInvertMirror: false,
statusToolbarMouseMirror: true,
pref_registry:
{
"addonbar.borderStyle":
{
update: function()
{
this.addonbarBorderStyle = this.prefs.getBoolPref("addonbar.borderStyle");
},
updateWindow: function(win)
{
let browser_bottom_box = win.caligon.status4evar.getters.browserBottomBox;
if(browser_bottom_box)
{
this.setBoolElementAttribute(browser_bottom_box, "s4eboarder", this.addonbarBorderStyle);
}
}
},
"addonbar.closeButton":
{
update: function()
{
this.addonbarCloseButton = this.prefs.getBoolPref("addonbar.closeButton");
},
updateWindow: function(win)
{
let addonbar_close_button = win.caligon.status4evar.getters.addonbarCloseButton;
if(addonbar_close_button)
{
addonbar_close_button.hidden = !this.addonbarCloseButton;
}
}
},
"addonbar.windowGripper":
{
update: function()
{
this.addonbarWindowGripper = this.prefs.getBoolPref("addonbar.windowGripper");
},
updateWindow: function(win)
{
win.caligon.status4evar.toolbars.updateWindowGripper(true);
}
},
"advanced.status.detectFullScreen":
{
update: function()
{
this.advancedStatusDetectFullScreen = this.prefs.getBoolPref("advanced.status.detectFullScreen");
}
},
"advanced.status.detectVideo":
{
update: function()
{
this.advancedStatusDetectVideo = this.prefs.getBoolPref("advanced.status.detectVideo");
}
},
"download.button.action":
{
update: function()
{
this.downloadButtonAction = this.prefs.getIntPref("download.button.action");
},
updateWindow: function(win)
{
win.caligon.status4evar.downloadStatus.updateBinding();
}
},
"download.button.action.command":
{
update: function()
{
this.downloadButtonActionCommand = this.prefs.getCharPref("download.button.action.command");
}
},
"download.color.active":
{
update: function()
{
this.downloadColorActive = this.prefs.getCharPref("download.color.active");
},
updateDynamicStyle: function(sheet)
{
sheet.cssRules[2].style.backgroundColor = this.downloadColorActive;
}
},
"download.color.paused":
{
update: function()
{
this.downloadColorPaused = this.prefs.getCharPref("download.color.paused");
},
updateDynamicStyle: function(sheet)
{
sheet.cssRules[3].style.backgroundColor = this.downloadColorPaused;
}
},
"download.force":
{
update: function()
{
this.downloadForce = this.prefs.getBoolPref("download.force");
},
updateWindow: function(win)
{
let download_button = win.caligon.status4evar.getters.downloadButton;
if(download_button)
{
this.setBoolElementAttribute(download_button, "forcevisible", this.downloadForce);
}
let download_notify_anchor = win.caligon.status4evar.getters.downloadNotifyAnchor;
this.setBoolElementAttribute(download_notify_anchor, "forcevisible", this.downloadForce);
}
},
"download.label":
{
update: function()
{
this.downloadLabel = this.prefs.getIntPref("download.label");
},
updateWindow: function(win)
{
win.caligon.status4evar.downloadStatus.updateButton();
}
},
"download.label.force":
{
update: function()
{
this.downloadLabelForce = this.prefs.getBoolPref("download.label.force");
},
updateWindow: function(win)
{
let download_button = win.caligon.status4evar.getters.downloadButton;
if(download_button)
{
this.setBoolElementAttribute(download_button, "forcelabel", this.downloadLabelForce);
}
}
},
"download.notify.animate":
{
update: function()
{
this.downloadNotifyAnimate = this.prefs.getBoolPref("download.notify.animate");
}
},
"download.notify.timeout":
{
update: function()
{
this.downloadNotifyTimeout = (this.prefs.getIntPref("download.notify.timeout") * 1000);
}
},
"download.progress":
{
update: function()
{
this.downloadProgress = this.prefs.getIntPref("download.progress");
},
updateWindow: function(win)
{
win.caligon.status4evar.downloadStatus.updateButton();
}
},
"download.tooltip":
{
update: function()
{
this.downloadTooltip = this.prefs.getIntPref("download.tooltip");
},
updateWindow: function(win)
{
win.caligon.status4evar.downloadStatus.updateButton();
}
},
"progress.toolbar.css":
{
update: function()
{
this.progressToolbarCSS = this.prefs.getCharPref("progress.toolbar.css");
},
updateDynamicStyle: function(sheet)
{
sheet.cssRules[1].style.background = this.progressToolbarCSS;
}
},
"progress.toolbar.force":
{
update: function()
{
this.progressToolbarForce = this.prefs.getBoolPref("progress.toolbar.force");
},
updateWindow: function(win)
{
let toolbar_progress = win.caligon.status4evar.getters.toolbarProgress;
if(toolbar_progress)
{
this.setBoolElementAttribute(toolbar_progress, "forcevisible", this.progressToolbarForce);
}
}
},
"progress.toolbar.style":
{
update: function()
{
this.progressToolbarStyle = this.prefs.getBoolPref("progress.toolbar.style");
},
updateWindow: function(win)
{
let toolbar_progress = win.caligon.status4evar.getters.toolbarProgress;
if(toolbar_progress)
{
this.setBoolElementAttribute(toolbar_progress, "s4estyle", this.progressToolbarStyle);
}
}
},
"status":
{
update: function()
{
this.status = this.prefs.getIntPref("status");
},
updateWindow: function(win)
{
win.caligon.status4evar.statusService.clearStatusField();
win.caligon.status4evar.statusService.updateStatusField(true);
}
},
"status.default":
{
update: function()
{
this.statusDefault = this.prefs.getBoolPref("status.default");
},
updateWindow: function(win)
{
win.caligon.status4evar.statusService.buildTextOrder();
win.caligon.status4evar.statusService.updateStatusField(true);
}
},
"status.linkOver":
{
update: function()
{
this.statusLinkOver = this.prefs.getIntPref("status.linkOver");
}
},
"status.linkOver.delay.show":
{
update: function()
{
this.statusLinkOverDelayShow = this.prefs.getIntPref("status.linkOver.delay.show");
}
},
"status.linkOver.delay.hide":
{
update: function()
{
this.statusLinkOverDelayHide = this.prefs.getIntPref("status.linkOver.delay.hide");
}
},
"status.network":
{
update: function()
{
this.statusNetwork = this.prefs.getBoolPref("status.network");
},
updateWindow: function(win)
{
win.caligon.status4evar.statusService.buildTextOrder();
}
},
"status.network.xhr":
{
update: function()
{
this.statusNetworkXHR = this.prefs.getBoolPref("status.network.xhr");
},
updateWindow: function(win)
{
win.caligon.status4evar.statusService.buildTextOrder();
}
},
"status.timeout":
{
update: function()
{
this.statusTimeout = (this.prefs.getIntPref("status.timeout") * 1000);
},
updateWindow: function(win)
{
win.caligon.status4evar.statusService.updateStatusField(true);
}
},
"status.toolbar.maxLength":
{
update: function()
{
this.statusToolbarMaxLength = this.prefs.getIntPref("status.toolbar.maxLength");
},
updateWindow: function(win)
{
let status_widget = win.caligon.status4evar.getters.statusWidget;
if(status_widget)
{
status_widget.maxWidth = (this.statusToolbarMaxLength || "");
}
}
},
"status.popup.invertMirror":
{
update: function()
{
this.statusToolbarInvertMirror = this.prefs.getBoolPref("status.popup.invertMirror");
},
updateWindow: function(win)
{
let statusOverlay = win.caligon.status4evar.getters.statusOverlay;
if(statusOverlay)
{
statusOverlay.invertMirror = this.statusToolbarInvertMirror;
}
}
},
"status.popup.mouseMirror":
{
update: function()
{
this.statusToolbarMouseMirror = this.prefs.getBoolPref("status.popup.mouseMirror");
},
updateWindow: function(win)
{
let statusOverlay = win.caligon.status4evar.getters.statusOverlay;
if(statusOverlay)
{
statusOverlay.mouseMirror = this.statusToolbarMouseMirror;
}
}
}
},
// nsIObserver
observe: function(subject, topic, data)
{
try
{
switch(topic)
{
case "profile-after-change":
this.startup();
break;
case "quit-application":
this.shutdown();
break;
case "nsPref:changed":
this.updatePref(data, true);
break;
}
}
catch(e)
{
CU.reportError(e);
}
},
startup: function()
{
this.prefs = Services.prefs.getBranch("status4evar.").QueryInterface(CI.nsIPrefBranch2);
this.firstRun = this.prefs.getBoolPref("firstRun");
if(this.firstRun)
{
this.prefs.setBoolPref("firstRun", false);
}
this.migrate();
for(let pref in this.pref_registry)
{
let pro = this.pref_registry[pref];
pro.update = pro.update.bind(this);
if(pro.updateWindow)
{
pro.updateWindow = pro.updateWindow.bind(this);
}
if(pro.updateDynamicStyle)
{
pro.updateDynamicStyle = pro.updateDynamicStyle.bind(this);
}
this.prefs.addObserver(pref, this, true);
this.updatePref(pref, false);
}
Services.obs.addObserver(this, "quit-application", true);
},
shutdown: function()
{
Services.obs.removeObserver(this, "quit-application");
for(let pref in this.pref_registry)
{
this.prefs.removeObserver(pref, this);
}
this.prefs = null;
},
migrate: function()
{
if(!this.firstRun)
{
let migration = 0;
try
{
migration = this.prefs.getIntPref("migration");
}
catch(e) {}
switch(migration)
{
case 5:
this.migrateBoolPref("status.detectFullScreen", "advanced.status.detectFullScreen");
case 6:
let oldDownloadAction = this.prefs.getIntPref("download.button.action");
let newDownloadAction = 1;
switch(oldDownloadAction)
{
case 2:
newDownloadAction = 1;
break;
case 3:
newDownloadAction = 2;
break;
case 4:
newDownloadAction = 1;
break;
}
this.prefs.setIntPref("download.button.action", newDownloadAction);
case 7:
let progressLocation = this.prefs.getIntPref("status");
if (progressLocation == 2)
this.prefs.setIntPref("status", 1);
let linkOverLocation = this.prefs.getIntPref("status.linkOver");
if (linkOverLocation == 2)
this.prefs.setIntPref("status.linkOver", 1);
break;
case CURRENT_MIGRATION:
break;
}
}
this.prefs.setIntPref("migration", CURRENT_MIGRATION);
},
migrateBoolPref: function(oldPref, newPref)
{
if(this.prefs.prefHasUserValue(oldPref))
{
this.prefs.setBoolPref(newPref, this.prefs.getBoolPref(oldPref));
this.prefs.clearUserPref(oldPref);
}
},
migrateIntPref: function(oldPref, newPref)
{
if(this.prefs.prefHasUserValue(oldPref))
{
this.prefs.setIntPref(newPref, this.prefs.getIntPref(oldPref));
this.prefs.clearUserPref(oldPref);
}
},
migrateCharPref: function(oldPref, newPref)
{
if(this.prefs.prefHasUserValue(oldPref))
{
this.prefs.setCharPref(newPref, this.prefs.getCharPref(oldPref));
this.prefs.clearUserPref(oldPref);
}
},
updatePref: function(pref, updateWindows)
{
if(!(pref in this.pref_registry))
{
return;
}
let pro = this.pref_registry[pref];
pro.update();
if(updateWindows)
{
let windowsEnum = Services.wm.getEnumerator("navigator:browser");
while(windowsEnum.hasMoreElements())
{
this.updateWindow(windowsEnum.getNext(), pro);
}
}
if(pro.alsoUpdate)
{
pro.alsoUpdate.forEach(function (alsoPref)
{
this.updatePref(alsoPref);
}, this);
}
},
// Updtate a browser window
updateWindow: function(win, pro)
{
if(!(win instanceof CI.nsIDOMWindow)
|| !(win.document.documentElement.getAttribute("windowtype") == "navigator:browser"))
{
return;
}
if(pro)
{
this.handlePro(win, pro);
}
else
{
for(let pref in this.pref_registry)
{
this.handlePro(win, this.pref_registry[pref]);
}
}
},
handlePro: function(win, pro)
{
if(pro.updateWindow)
{
pro.updateWindow(win);
}
if(pro.updateDynamicStyle)
{
let styleSheets = win.document.styleSheets;
for(let i = 0; i < styleSheets.length; i++)
{
let styleSheet = styleSheets[i];
if(styleSheet.href == "chrome://browser/skin/statusbar/dynamic.css")
{
pro.updateDynamicStyle(styleSheet);
break;
}
}
}
},
setBoolElementAttribute: function(elem, attr, val)
{
if(val)
{
elem.setAttribute(attr, "true");
}
else
{
elem.removeAttribute(attr);
}
},
setStringElementAttribute: function(elem, attr, val)
{
if(val)
{
elem.setAttribute(attr, val);
}
else
{
elem.removeAttribute(attr);
}
},
resetPrefs: function()
{
let childPrefs = this.prefs.getChildList("");
childPrefs.forEach(function(pref)
{
if(this.prefs.prefHasUserValue(pref))
{
this.prefs.clearUserPref(pref);
}
}, this);
}
};
const NSGetFactory = XPCOMUtils.generateNSGetFactory([Status_4_Evar]);