123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- /* 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";
- const EXPORTED_SYMBOLS = ["Status4Evar"];
- const CC = Components.classes;
- const CI = Components.interfaces;
- const CU = Components.utils;
- const s4e_service = CC["@caligonstudios.com/status4evar;1"].getService(CI.nsIStatus4Evar);
- CU.import("resource://gre/modules/Services.jsm");
- CU.import("resource://gre/modules/XPCOMUtils.jsm");
- CU.import("resource://gre/modules/AddonManager.jsm");
- CU.import("resource:///modules/statusbar/Status.jsm");
- CU.import("resource:///modules/statusbar/Progress.jsm");
- CU.import("resource:///modules/statusbar/Downloads.jsm");
- CU.import("resource:///modules/statusbar/Toolbars.jsm");
- function Status4Evar(window, gBrowser, toolbox)
- {
- this._window = window;
- this._toolbox = toolbox;
- this.getters = new S4EWindowGetters(this._window);
- this.toolbars = new S4EToolbars(this._window, gBrowser, this._toolbox, s4e_service, this.getters);
- this.statusService = new S4EStatusService(this._window, s4e_service, this.getters);
- this.progressMeter = new S4EProgressService(gBrowser, s4e_service, this.getters, this.statusService);
- this.downloadStatus = new S4EDownloadService(this._window, gBrowser, s4e_service, this.getters);
- this.sizeModeService = new SizeModeService(this._window, gBrowser, this);
- this._window.addEventListener("unload", this, false);
- }
- Status4Evar.prototype =
- {
- _window: null,
- _toolbox: null,
- getters: null,
- toolbars: null,
- statusService: null,
- progressMeter: null,
- downloadStatus: null,
- sizeModeService: null,
- setup: function()
- {
- this._toolbox.addEventListener("beforecustomization", this, false);
- this._toolbox.addEventListener("aftercustomization", this, false);
- this.toolbars.setup();
- this.updateWindow();
- // OMFG HAX! If a page is already loading, fake a network start event
- if(this._window.XULBrowserWindow._busyUI)
- {
- let nsIWPL = CI.nsIWebProgressListener;
- this.progressMeter.onStateChange(0, null, nsIWPL.STATE_START | nsIWPL.STATE_IS_NETWORK, 0);
- }
- },
- destroy: function()
- {
- this._window.removeEventListener("unload", this, false);
- this._toolbox.removeEventListener("aftercustomization", this, false);
- this._toolbox.removeEventListener("beforecustomization", this, false);
- this.getters.destroy();
- this.statusService.destroy();
- this.downloadStatus.destroy();
- this.progressMeter.destroy();
- this.toolbars.destroy();
- this.sizeModeService.destroy();
- ["_window", "_toolbox", "getters", "statusService", "downloadStatus",
- "progressMeter", "toolbars", "sizeModeService"].forEach(function(prop)
- {
- delete this[prop];
- }, this);
- },
- handleEvent: function(aEvent)
- {
- switch(aEvent.type)
- {
- case "unload":
- this.destroy();
- break;
- case "beforecustomization":
- this.beforeCustomization();
- break;
- case "aftercustomization":
- this.updateWindow();
- break;
- }
- },
- beforeCustomization: function()
- {
- this.toolbars.updateSplitters(false);
- this.toolbars.updateWindowGripper(false);
- this.statusService.setNoUpdate(true);
- let status_label = this.getters.statusWidgetLabel;
- if(status_label)
- {
- status_label.value = this.getters.strings.getString("statusText");
- }
- this.downloadStatus.customizing(true);
- },
- updateWindow: function()
- {
- this.statusService.setNoUpdate(false);
- this.getters.resetGetters();
- this.statusService.buildTextOrder();
- this.statusService.buildBinding();
- this.downloadStatus.init();
- this.downloadStatus.customizing(false);
- this.toolbars.updateSplitters(true);
- s4e_service.updateWindow(this._window);
- // This also handles the following:
- // * buildTextOrder()
- // * updateStatusField(true)
- // * updateWindowGripper(true)
- },
- launchOptions: function(currentWindow)
- {
- let optionsURL = "chrome://browser/content/statusbar/prefs.xul";
- let windows = Services.wm.getEnumerator(null);
- while (windows.hasMoreElements())
- {
- let win = windows.getNext();
- if (win.document.documentURI == optionsURL)
- {
- win.focus();
- return;
- }
- }
-
- let features = "chrome,titlebar,toolbar,centerscreen";
- try
- {
- let instantApply = Services.prefs.getBoolPref("browser.preferences.instantApply");
- features += instantApply ? ",dialog=no" : ",modal";
- }
- catch(e)
- {
- features += ",modal";
- }
- currentWindow.openDialog(optionsURL, "", features);
- }
- };
- function S4EWindowGetters(window)
- {
- this._window = window;
- }
- S4EWindowGetters.prototype =
- {
- _window: null,
- _getterMap:
- [
- ["addonbar", "addon-bar"],
- ["addonbarCloseButton", "addonbar-closebutton"],
- ["browserBottomBox", "browser-bottombox"],
- ["downloadButton", "status4evar-download-button"],
- ["downloadButtonTooltip", "status4evar-download-tooltip"],
- ["downloadButtonProgress", "status4evar-download-progress-bar"],
- ["downloadButtonLabel", "status4evar-download-label"],
- ["downloadButtonAnchor", "status4evar-download-anchor"],
- ["downloadNotifyAnchor", "status4evar-download-notification-anchor"],
- ["statusBar", "status4evar-status-bar"],
- ["statusWidget", "status4evar-status-widget"],
- ["statusWidgetLabel", "status4evar-status-text"],
- ["strings", "bundle_status4evar"],
- ["throbberProgress", "status4evar-throbber-widget"],
- ["toolbarProgress", "status4evar-progress-bar"]
- ],
- resetGetters: function()
- {
- let document = this._window.document;
- this._getterMap.forEach(function(getter)
- {
- let [prop, id] = getter;
- delete this[prop];
- this.__defineGetter__(prop, function()
- {
- delete this[prop];
- return this[prop] = document.getElementById(id);
- });
- }, this);
- delete this.statusOverlay;
- this.__defineGetter__("statusOverlay", function()
- {
- let so = this._window.XULBrowserWindow.statusTextField;
- if(!so)
- {
- return null;
- }
- delete this.statusOverlay;
- return this.statusOverlay = so;
- });
- },
- destroy: function()
- {
- this._getterMap.forEach(function(getter)
- {
- let [prop, id] = getter;
- delete this[prop];
- }, this);
- ["statusOverlay", "statusOverlay", "_window"].forEach(function(prop)
- {
- delete this[prop];
- }, this);
- }
- };
- function SizeModeService(window, gBrowser, s4e)
- {
- this._window = window;
- this._gBrowser = gBrowser;
- this._s4e = s4e;
- this._mm = this._window.messageManager;
- this.lastFullScreen = this._window.fullScreen;
- this.lastwindowState = this._window.windowState;
- if(s4e_service.advancedStatusDetectFullScreen)
- {
- this._mm.addMessageListener("status4evar@caligonstudios.com:video-detect-answer", this)
- this._mm.loadFrameScript("resource:///modules/statusbar/content-thunk.js", true);
- }
- this._window.addEventListener("sizemodechange", this, false);
- }
- SizeModeService.prototype =
- {
- _window: null,
- _gBrowser: null,
- _s4e: null,
- _mm: null,
- lastFullScreen: null,
- lastwindowState: null,
- destroy: function()
- {
- this._window.removeEventListener("sizemodechange", this, false);
- if(s4e_service.advancedStatusDetectFullScreen)
- {
- this._mm.removeDelayedFrameScript("resource:///modules/statusbar/content-thunk.js");
- this._mm.removeMessageListener("status4evar@caligonstudios.com:video-detect-answer", this);
- }
- ["_window", "_gBrowser", "_s4e", "_mm"].forEach(function(prop)
- {
- delete this[prop];
- }, this);
- },
- handleEvent: function(e)
- {
- if(this._window.fullScreen != this.lastFullScreen && s4e_service.advancedStatusDetectFullScreen)
- {
- this.lastFullScreen = this._window.fullScreen;
- if(this.lastFullScreen && s4e_service.advancedStatusDetectVideo)
- {
- this._gBrowser.selectedBrowser.messageManager.sendAsyncMessage("status4evar@caligonstudios.com:video-detect");
- }
- else
- {
- this._s4e.statusService.setFullScreenState(this.lastFullScreen, false);
- }
- }
- if(this._window.windowState != this.lastwindowState)
- {
- this.lastwindowState = this._window.windowState;
- this._s4e.toolbars.updateWindowGripper(true);
- }
- },
- receiveMessage: function(message)
- {
- if(message.name == "status4evar@caligonstudios.com:video-detect-answer")
- {
- this._s4e.statusService.setFullScreenState(this.lastFullScreen, message.data.isVideo);
- }
- },
- QueryInterface: XPCOMUtils.generateQI([ CI.nsIDOMEventListener, CI.nsIMessageListener ])
- };
|