357 lines
11 KiB
JavaScript
357 lines
11 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 ZoteroOverlay = new function()
|
|
{
|
|
const DEFAULT_ZPANE_HEIGHT = 300;
|
|
var toolbarCollapseState, isFx36, showInPref;
|
|
var zoteroPane, zoteroSplitter;
|
|
var _stateBeforeReload = false;
|
|
|
|
this.isTab = false;
|
|
|
|
this.onLoad = function() {
|
|
zoteroPane = document.getElementById('zotero-pane-stack');
|
|
zoteroSplitter = document.getElementById('zotero-splitter');
|
|
|
|
ZoteroPane_Overlay = ZoteroPane;
|
|
ZoteroPane.init();
|
|
|
|
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
|
|
.getService(Components.interfaces.nsIXULAppInfo);
|
|
isFx36 = appInfo.platformVersion.indexOf('1.9') === 0;
|
|
|
|
// Open Zotero app tab, if in Fx 4 and requested by pref
|
|
showInPref = Components.classes["@mozilla.org/preferences-service;1"]
|
|
.getService(Components.interfaces.nsIPrefService)
|
|
.getBranch('extensions.zotero.').getIntPref('showIn');
|
|
this.isTab = showInPref === 2;
|
|
if(!isFx36) {
|
|
var observerService = Components.classes["@mozilla.org/observer-service;1"]
|
|
.getService(Components.interfaces.nsIObserverService);
|
|
var zoteroObserver = function(subject, topic, data) {
|
|
if(subject != window) return;
|
|
observerService.removeObserver(this, "browser-delayed-startup-finished");
|
|
if(showInPref === 2) {
|
|
var tabbar = document.getElementById("TabsToolbar");
|
|
if(tabbar && window.getComputedStyle(tabbar).display !== "none") {
|
|
// load Zotero as a tab, if it isn't loading by default
|
|
ZoteroOverlay.loadZoteroTab(true);
|
|
}
|
|
} else {
|
|
// close Zotero as a tab, in case it was pinned
|
|
var zoteroTab = ZoteroOverlay.findZoteroTab();
|
|
if(zoteroTab) gBrowser.removeTab(zoteroTab);
|
|
}
|
|
};
|
|
|
|
observerService.addObserver(zoteroObserver, "browser-delayed-startup-finished", false);
|
|
}
|
|
|
|
// Make Zotero icon visible, if requested
|
|
var iconPref = Components.classes["@mozilla.org/preferences-service;1"]
|
|
.getService(Components.interfaces.nsIPrefService)
|
|
.getBranch('extensions.zotero.').getIntPref('statusBarIcon');
|
|
|
|
var fx36Icon = document.getElementById('zotero-status-bar-icon');
|
|
var addonBar = document.getElementById('addon-bar');
|
|
|
|
// Status bar in Fx3.6
|
|
if (isFx36) {
|
|
var icon = fx36Icon;
|
|
}
|
|
// In >=Fx4, add to add-on bar
|
|
else {
|
|
// add Zotero icon
|
|
var icon = document.createElement('toolbarbutton');
|
|
icon.id = 'zotero-addon-bar-icon';
|
|
icon.setAttribute('oncommand', 'ZoteroOverlay.toggleDisplay()');
|
|
icon.setAttribute('hidden', true);
|
|
addonBar.appendChild(icon);
|
|
if (addonBar.collapsed) {
|
|
// If no Zotero or icon isn't set to hidden, show add-on bar
|
|
if (iconPref != 0) {
|
|
setToolbarVisibility(addonBar, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (Zotero && Zotero.initialized){
|
|
document.getElementById('appcontent').addEventListener('mousemove', Zotero.ProgressWindowSet.updateTimers, false);
|
|
switch (iconPref) {
|
|
case 2:
|
|
icon.setAttribute('hidden', false);
|
|
break;
|
|
case 1:
|
|
icon.setAttribute('hidden', false);
|
|
icon.setAttribute('compact', true);
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
if (Zotero) {
|
|
var errMsg = Zotero.startupError;
|
|
}
|
|
|
|
// Use defaults if necessary
|
|
if (!errMsg) {
|
|
// Get the stringbundle manually
|
|
var src = 'chrome://zotero/locale/zotero.properties';
|
|
var localeService = Components.classes['@mozilla.org/intl/nslocaleservice;1'].
|
|
getService(Components.interfaces.nsILocaleService);
|
|
var appLocale = localeService.getApplicationLocale();
|
|
var stringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
|
|
.getService(Components.interfaces.nsIStringBundleService);
|
|
var stringBundle = stringBundleService.createBundle(src, appLocale);
|
|
|
|
var errMsg = stringBundle.GetStringFromName('startupError');
|
|
}
|
|
|
|
icon.setAttribute('tooltiptext', errMsg);
|
|
icon.setAttribute('error', 'true');
|
|
icon.setAttribute('hidden', false);
|
|
}
|
|
|
|
// Used for loading pages from upgrade wizard
|
|
if (Zotero && Zotero.initialURL) {
|
|
setTimeout(function () {
|
|
gBrowser.selectedTab = gBrowser.addTab(Zotero.initialURL);
|
|
Zotero.initialURL = null;
|
|
}, 1);
|
|
}
|
|
|
|
// Hide browser chrome on Zotero tab
|
|
if(Zotero.isFx4) {
|
|
XULBrowserWindow.inContentWhitelist.push("chrome://zotero/content/tab.xul");
|
|
}
|
|
|
|
// Close pane if connector is enabled
|
|
ZoteroPane_Local.addReloadListener(function() {
|
|
if(Zotero.isConnector) {
|
|
// save current state
|
|
_stateBeforeReload = !zoteroPane.hidden && !zoteroPane.collapsed;
|
|
// ensure pane is closed
|
|
if(!zoteroPane.collapsed) ZoteroOverlay.toggleDisplay(false);
|
|
} else {
|
|
// reopen pane if it was open before
|
|
ZoteroOverlay.toggleDisplay(_stateBeforeReload);
|
|
}
|
|
});
|
|
}
|
|
|
|
this.onUnload = function() {
|
|
ZoteroPane.destroy();
|
|
}
|
|
|
|
this.onBeforeUnload = function() {
|
|
// close Zotero as a tab, so it won't be pinned
|
|
var zoteroTab = ZoteroOverlay.findZoteroTab();
|
|
if(zoteroTab) gBrowser.removeTab(zoteroTab);
|
|
}
|
|
|
|
/**
|
|
* Hides/displays the Zotero interface
|
|
*/
|
|
this.toggleDisplay = function(makeVisible)
|
|
{
|
|
if(makeVisible || makeVisible === undefined) {
|
|
if(Zotero.isConnector) {
|
|
// If in connector mode, bring Zotero Standalone to foreground
|
|
Zotero.activateStandalone();
|
|
return;
|
|
} else if(this.isTab) {
|
|
// If in separate tab mode, just open the tab
|
|
this.loadZoteroTab();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(!Zotero || !Zotero.initialized) {
|
|
ZoteroPane.displayStartupError();
|
|
return;
|
|
}
|
|
|
|
if(makeVisible === undefined) makeVisible = zoteroPane.hidden || zoteroPane.collapsed;
|
|
|
|
zoteroSplitter.setAttribute('hidden', !makeVisible);
|
|
zoteroPane.setAttribute('hidden', false);
|
|
zoteroPane.setAttribute('collapsed', false);
|
|
|
|
/*
|
|
Zotero.debug("zoteroPane.boxObject.height: " + zoteroPane.boxObject.height);
|
|
Zotero.debug("zoteroPane.getAttribute('height'): " + zoteroPane.getAttribute('height'));
|
|
Zotero.debug("zoteroPane.getAttribute('minheight'): " + zoteroPane.getAttribute('minheight'));
|
|
Zotero.debug("savedHeight: " + savedHeight);
|
|
*/
|
|
|
|
if(makeVisible) {
|
|
// Get saved height (makeVisible() may change it)
|
|
if (zoteroPane.hasAttribute('savedHeight')) {
|
|
var savedHeight = zoteroPane.getAttribute('savedHeight');
|
|
}
|
|
else {
|
|
var savedHeight = DEFAULT_ZPANE_HEIGHT;
|
|
}
|
|
|
|
// Restore height
|
|
var max = document.getElementById('appcontent').boxObject.height
|
|
- zoteroSplitter.boxObject.height;
|
|
zoteroPane.setAttribute('height', Math.min(savedHeight, max));
|
|
|
|
// Make visible
|
|
ZoteroPane.makeVisible();
|
|
|
|
// Make sure tags splitter isn't missing for people upgrading from <2.0b7
|
|
document.getElementById('zotero-tags-splitter').collapsed = false;
|
|
} else {
|
|
ZoteroPane.makeHidden();
|
|
|
|
// Collapse pane
|
|
zoteroPane.setAttribute('collapsed', true);
|
|
zoteroPane.height = 0;
|
|
|
|
document.getElementById('content').setAttribute('collapsed', false);
|
|
|
|
// turn off full window mode, if it was on
|
|
_setFullWindowMode(false);
|
|
|
|
// Return focus to the browser content pane
|
|
window.content.window.focus();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Hides or shows navigation toolbars
|
|
* @param set {Boolean} Whether navigation toolbars should be hidden or shown
|
|
*/
|
|
function _setFullWindowMode(set) {
|
|
// hide or show navigation toolbars
|
|
if(!getNavToolbox) return;
|
|
var toolbox = getNavToolbox();
|
|
if(set) {
|
|
// the below would be a good thing to do if the whole title bar (and not just the center
|
|
// part) got updated when it happened...
|
|
/*if(Zotero.isMac) {
|
|
titlebarcolorState = document.documentElement.getAttribute("activetitlebarcolor");
|
|
document.documentElement.removeAttribute("activetitlebarcolor");
|
|
}*/
|
|
if(document.title != "Zotero") {
|
|
titleState = document.title;
|
|
document.title = "Zotero";
|
|
}
|
|
|
|
if(!toolbarCollapseState) {
|
|
toolbarCollapseState = [node.collapsed for each (node in toolbox.childNodes)];
|
|
for(var i=0; i<toolbox.childNodes.length; i++) {
|
|
toolbox.childNodes[i].collapsed = true;
|
|
}
|
|
}
|
|
} else {
|
|
/*if(Zotero.isMac) {
|
|
document.documentElement.setAttribute("activetitlebarcolor", titlebarcolorState);
|
|
}*/
|
|
if(document.title == "Zotero") document.title = titleState;
|
|
|
|
if(toolbarCollapseState) {
|
|
for(var i=0; i<toolbox.childNodes.length; i++) {
|
|
toolbox.childNodes[i].collapsed = toolbarCollapseState[i];
|
|
}
|
|
toolbarCollapseState = undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determines whether there is an open Zotero tab
|
|
*/
|
|
this.findZoteroTab = function() {
|
|
// Look for an existing tab
|
|
var tab = false;
|
|
var numTabs = gBrowser.browsers.length;
|
|
for(var index = 0; index < numTabs; index++) {
|
|
var currentBrowser = gBrowser.getBrowserAtIndex(index);
|
|
if(ZOTERO_TAB_URL == currentBrowser.currentURI.spec) {
|
|
tab = (gBrowser.tabs ? gBrowser.tabs : gBrowser.mTabs)[index];
|
|
break;
|
|
}
|
|
}
|
|
|
|
return tab;
|
|
}
|
|
|
|
/**
|
|
* Loads the Zotero tab, or adds a new tab if no tab yet exists
|
|
* @param {Boolean} background Whether the Zotero tab should be loaded in the background
|
|
*/
|
|
this.loadZoteroTab = function(background) {
|
|
var tab = this.findZoteroTab();
|
|
|
|
// If no existing tab, add a new tab
|
|
if(!tab) tab = gBrowser.addTab(ZOTERO_TAB_URL);
|
|
// Pin tab
|
|
if(!isFx36) gBrowser.pinTab(tab);
|
|
// If requested, activate tab
|
|
if(!background) gBrowser.selectedTab = tab;
|
|
}
|
|
|
|
/**
|
|
* Toggle between Zotero as a tab and Zotero as a pane
|
|
*/
|
|
this.toggleTab = function(setMode) {
|
|
var tab = this.findZoteroTab();
|
|
window.zoteroSavedItemSelection = ZoteroPane.itemsView.saveSelection();
|
|
window.zoteroSavedCollectionSelection = ZoteroPane.collectionsView.saveSelection();
|
|
if(tab) { // Zotero is running in a tab
|
|
if(setMode) return;
|
|
// if Zotero tab is the only tab, open the home page in a new tab
|
|
if((gBrowser.tabs ? gBrowser.tabs : gBrowser.mTabs).length === 1) {
|
|
gBrowser.addTab(gBrowser.homePage);
|
|
}
|
|
|
|
// swap ZoteroPane object
|
|
ZoteroPane = ZoteroPane_Overlay;
|
|
|
|
// otherwise, close Zotero tab and open Zotero pane
|
|
gBrowser.removeTab(tab);
|
|
this.isTab = false;
|
|
this.toggleDisplay();
|
|
} else { // Zotero is running in the pane
|
|
if(setMode === false) return;
|
|
// close Zotero pane
|
|
this.toggleDisplay(false);
|
|
|
|
// open Zotero tab
|
|
this.isTab = true;
|
|
this.loadZoteroTab();
|
|
}
|
|
}
|
|
}
|
|
|
|
window.addEventListener("load", function(e) { ZoteroOverlay.onLoad(e); }, false);
|
|
window.addEventListener("unload", function(e) { ZoteroOverlay.onUnload(e); }, false);
|
|
window.addEventListener("beforeunload", function(e) { ZoteroOverlay.onBeforeUnload(e); }, false);
|