zotero/chrome/content/zotero/tab.js
2012-02-09 03:56:30 -05:00

139 lines
4.9 KiB
JavaScript

/*
***** BEGIN LICENSE BLOCK *****
Copyright © 2009 Center for History and New Media
George Mason University, Fairfax, Virginia, USA
http://zotero.org
This file is part of Zotero.
Zotero is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Zotero is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
***** END LICENSE BLOCK *****
*/
/*
* This object contains the various functions for the interface
*/
var ZoteroTab = new function()
{
this.onLoad = function() {
var me = this;
// find window this tab is loaded in
this.containerWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShell)
.chromeEventHandler.ownerDocument.defaultView;
if(!this.containerWindow) return;
var tabs = (this.containerWindow.gBrowser.tabs
? this.containerWindow.gBrowser.tabs : this.containerWindow.gBrowser.mTabs);
// loop over all browsers in this window
for(var i=0; i<this.containerWindow.gBrowser.browsers.length; i++) {
var currentBrowser = this.containerWindow.gBrowser.browsers[i];
if(currentBrowser.contentWindow == window) {
// find containerBrowser and containerTab
this.containerBrowser = currentBrowser;
this.containerTab = tabs[i];
continue;
}
// if we somehow ended up with other Zotero tabs in the window, close them
if(currentBrowser && ZOTERO_TAB_URL == currentBrowser.currentURI.spec) {
this.containerWindow.gBrowser.removeTab(tabs[i]);
}
}
// stop drop events from propagating
this.containerBrowser.addEventListener("drop", _dropPropagationKiller, false);
// initialize ZoteroPane and swap out old window ZoteroPane object
if(this.containerWindow.ZoteroPane) {
this._swapZoteroPane();
} else {
this.containerWindow.addEventListener("load", function() { this._swapZoteroPane() }, false);
}
// get tab for browser
if(this.containerWindow.gBrowser.selectedTab === this.containerTab) {
// if tab is already selected, init now
ZoteroPane.init();
ZoteroPane.makeVisible();
} else {
// otherwise, add a handler to wait until this tab is selected
var listener = function(event) {
if(event.target !== me.containerTab) return;
me.containerWindow.gBrowser.tabContainer.removeEventListener("TabSelect", listener, false);
ZoteroPane.init();
ZoteroPane.makeVisible();
}
this.containerWindow.gBrowser.tabContainer.addEventListener("TabSelect", listener, false);
}
if(Zotero && Zotero.Prefs.get("showIn") != 2) {
// on Fx 4, add an event listener so the pinned tab isn't restored on close
var pinnedTabCloser = function() {
try {
me.containerWindow.gBrowser.removeTab(me.containerTab);
} catch(e) {}
}
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.addObserver(pinnedTabCloser, "quit-application-requested", false);
this.containerWindow.addEventListener("close", pinnedTabCloser, false);
}
}
this._swapZoteroPane = function() {
if(!this.containerWindow.ZoteroOverlay.isTab) {
var tabs = (this.containerWindow.gBrowser.tabs
? this.containerWindow.gBrowser.tabs : this.containerWindow.gBrowser.mTabs);
if(tabs.length > 1) {
window.close();
} else {
if(tabs[0].pinned) this.containerWindow.gBrowser.unpinTab(tabs[0]);
document.location.replace(this.containerWindow.gHomeButton.getHomePage());
}
return;
}
this.containerWindow.ZoteroPane_Overlay = this.containerWindow.ZoteroPane;
this.containerWindow.ZoteroPane_Tab = ZoteroPane;
this.containerWindow.ZoteroPane = ZoteroPane;
}
this.onUnload = function() {
// remove drop propagation killer
this.containerBrowser.removeEventListener("drop", _dropPropagationKiller, false);
// replace window ZoteroPane
if(this.containerWindow.ZoteroPane === this.containerWindow.ZoteroPane_Tab) {
this.containerWindow.ZoteroPane = this.containerWindow.ZoteroPane_Overlay;
}
delete this.containerWindow.ZoteroPane_Tab;
// destroy pane
ZoteroPane.destroy();
}
function _dropPropagationKiller(event) {
event.stopPropagation();
event.preventDefault();
}
}
window.addEventListener("load", function(e) { ZoteroTab.onLoad(e); }, false);
window.addEventListener("unload", function(e) { ZoteroTab.onUnload(e); }, false);