zotero/chrome/content/zotero/overlay.js
Dan Stillman a1bed8b5ad More icon tweaks
- New dedicated Zotero button, available in the Customize palette
- Remove "16px" Z SVG and just render "32px" one at the smaller size
  (there's a slight difference at the edges, but we should probably redo
  it anyway so that dark lines reach all the way to the bottom)
- Change "Open Zotero" back to just "Zotero", since 1) it's for closing
  too, 2) it can also just bring Standalone to the front, and 3) "Open
  Zotero" looks weird and inconsistent in the menu panel next to things
  like "Preferences"
- For now, show single large Z for combo buttons in customization
  palette with "Zotero (Combo)", though we can probably do something
  better.
- Fix some HiDPI bugs when moving items between areas

Still need a layout for the panel for the combo buttons
2015-02-27 03:35:18 -05:00

287 lines
9.2 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, showInPref;
var zoteroPane, zoteroSplitter;
var _stateBeforeReload = false;
this.isTab = false;
this.onLoad = function() {
try {
zoteroPane = document.getElementById('zotero-pane-stack');
zoteroSplitter = document.getElementById('zotero-splitter');
ZoteroPane_Overlay = ZoteroPane;
ZoteroPane.init();
// 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 !== 1;
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 === 3) {
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 if(showInPref === 1) {
// 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);
// Set a flag for hi-res displays
Zotero.hiDPI = window.devicePixelRatio > 1;
// Clear old Zotero icon pref
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch('extensions.zotero.');
prefBranch.clearUserPref('statusBarIcon');
// Add toolbar icon
Services.scriptloader.loadSubScript("chrome://zotero/content/icon.js", {}, "UTF-8");
if (Zotero && Zotero.initialized){
// TODO: Add only when progress window is open
document.getElementById('appcontent').addEventListener('mousemove', Zotero.ProgressWindowSet.updateTimers, 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
XULBrowserWindow.inContentWhitelist.push("chrome://zotero/content/tab.xul");
// Close pane before reload
ZoteroPane_Local.addBeforeReloadListener(function(newMode) {
if(newMode == "connector") {
// save current state
_stateBeforeReload = !zoteroPane.hidden && !zoteroPane.collapsed;
// ensure pane is closed
if(!zoteroPane.collapsed) ZoteroOverlay.toggleDisplay(false, true);
}
});
// Close pane if connector is enabled
ZoteroPane_Local.addReloadListener(function() {
if(!Zotero.isConnector) {
// reopen pane if it was open before
ZoteroOverlay.toggleDisplay(_stateBeforeReload, true);
}
});
}
catch (e) {
Zotero.debug(e);
}
}
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
* @param {Boolean} makeVisible Whether or not Zotero interface should be visible
* @param {Boolean} dontRefocus If true, don't focus content when closing Zotero pane. Used
* when closing pane because Zotero Standalone is being opened, to avoid pulling Firefox to
* the foreground.
*/
this.toggleDisplay = function(makeVisible, dontRefocus)
{
if(!Zotero || !Zotero.initialized) {
ZoteroPane.displayStartupError();
return;
}
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(makeVisible === undefined) makeVisible = zoteroPane.hidden || zoteroPane.collapsed;
/*
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) {
if (Zotero.locked) {
var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var msg = Zotero.getString('general.operationInProgress') + '\n\n' + Zotero.getString('general.operationInProgress.waitUntilFinished');
ps.alert(null, "", msg);
return false;
}
zoteroSplitter.setAttribute('hidden', false);
zoteroPane.setAttribute('hidden', false);
zoteroPane.setAttribute('collapsed', false);
// 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
zoteroSplitter.setAttribute('hidden', true);
zoteroPane.setAttribute('collapsed', true);
zoteroPane.height = 0;
document.getElementById('content').setAttribute('collapsed', false);
if(!dontRefocus) {
// Return focus to the browser content pane
window.content.window.focus();
}
}
}
/**
* 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(showInPref == 3) 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);