2006-08-02 16:49:19 +00:00
|
|
|
/*
|
2006-10-04 17:16:56 +00:00
|
|
|
***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Copyright © 2009 Center for History and New Media
|
|
|
|
George Mason University, Fairfax, Virginia, USA
|
|
|
|
http://zotero.org
|
2006-10-04 17:16:56 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
This file is part of Zotero.
|
2006-10-04 17:16:56 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Zotero is free software: you can redistribute it and/or modify
|
2011-05-18 18:34:22 +00:00
|
|
|
it under the terms of the GNU Affero General Public License as published by
|
2009-12-28 09:47:49 +00:00
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
2006-10-04 17:16:56 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
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
|
2011-05-18 18:34:22 +00:00
|
|
|
GNU Affero General Public License for more details.
|
2009-12-28 09:47:49 +00:00
|
|
|
|
2011-05-18 18:34:22 +00:00
|
|
|
You should have received a copy of the GNU Affero General Public License
|
2009-12-28 09:47:49 +00:00
|
|
|
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
2006-10-04 17:16:56 +00:00
|
|
|
|
|
|
|
***** END LICENSE BLOCK *****
|
2006-08-02 16:49:19 +00:00
|
|
|
*/
|
|
|
|
|
2006-06-02 15:27:52 +00:00
|
|
|
/*
|
|
|
|
* This object contains the various functions for the interface
|
|
|
|
*/
|
2011-01-30 09:44:01 +00:00
|
|
|
var ZoteroOverlay = new function()
|
2006-05-30 22:06:33 +00:00
|
|
|
{
|
2007-10-23 07:11:59 +00:00
|
|
|
const DEFAULT_ZPANE_HEIGHT = 300;
|
2016-12-21 10:01:50 +00:00
|
|
|
var toolbarCollapseState;
|
2011-06-14 00:36:21 +00:00
|
|
|
var zoteroPane, zoteroSplitter;
|
|
|
|
var _stateBeforeReload = false;
|
2011-01-30 09:44:01 +00:00
|
|
|
|
|
|
|
this.isTab = false;
|
|
|
|
|
2016-12-16 08:13:30 +00:00
|
|
|
this.onLoad = function () {
|
|
|
|
Zotero.spawn(function* () {
|
|
|
|
try {
|
|
|
|
//
|
|
|
|
// Code that runs in both full and connector mode
|
|
|
|
//
|
|
|
|
zoteroPane = document.getElementById('zotero-pane-stack');
|
|
|
|
zoteroSplitter = document.getElementById('zotero-splitter');
|
|
|
|
|
|
|
|
var iconLoaded = false;
|
|
|
|
|
|
|
|
if (!Zotero) {
|
|
|
|
throw new Error("No Zotero object");
|
|
|
|
}
|
|
|
|
if (Zotero.skipLoading) {
|
|
|
|
throw new Error("Skipping loading");
|
|
|
|
}
|
|
|
|
|
|
|
|
ZoteroPane_Overlay = ZoteroPane;
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// TODO: Add only when progress window is open
|
|
|
|
document.getElementById('appcontent').addEventListener('mousemove', Zotero.ProgressWindowSet.updateTimers, false);
|
|
|
|
|
|
|
|
// Hide browser chrome on Zotero tab
|
|
|
|
XULBrowserWindow.inContentWhitelist.push("chrome://zotero/content/tab.xul");
|
|
|
|
|
|
|
|
// Perform additional initialization for full mode
|
|
|
|
if (!Zotero.isConnector) {
|
|
|
|
yield _onLoadFull();
|
|
|
|
}
|
2015-12-30 09:31:57 +00:00
|
|
|
}
|
2016-12-16 08:13:30 +00:00
|
|
|
catch (e) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
|
|
|
|
// Add toolbar icon if still necessary
|
|
|
|
if (!iconLoaded) {
|
|
|
|
try {
|
|
|
|
Services.scriptloader.loadSubScript("chrome://zotero/content/icon.js", {}, "UTF-8");
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
Zotero.logError(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
throw e;
|
2013-08-12 00:51:16 +00:00
|
|
|
}
|
2016-12-16 08:13:30 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize overlay in new windows in full mode
|
|
|
|
*
|
|
|
|
* This is never run in Zotero for Firefox if Standalone is open first and Z4Fx is opened
|
|
|
|
* second, but we don't care.
|
|
|
|
*/
|
|
|
|
var _onLoadFull = function () {
|
|
|
|
return Zotero.spawn(function* () {
|
|
|
|
yield Zotero.Promise.all([Zotero.initializationPromise, Zotero.unlockPromise]);
|
|
|
|
|
2013-08-12 00:51:16 +00:00
|
|
|
Zotero.debug("Initializing overlay");
|
|
|
|
|
|
|
|
if (Zotero.skipLoading) {
|
2015-12-30 09:31:57 +00:00
|
|
|
throw new Error("Skipping loading");
|
2013-08-12 00:51:16 +00:00
|
|
|
}
|
|
|
|
|
2016-07-21 18:07:27 +00:00
|
|
|
ZoteroPane.init();
|
2015-03-06 19:21:33 +00:00
|
|
|
|
2015-03-17 03:40:57 +00:00
|
|
|
// 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
|
2015-05-05 06:35:04 +00:00
|
|
|
try {
|
2015-12-30 09:31:57 +00:00
|
|
|
iconLoaded = true;
|
2015-05-05 06:35:04 +00:00
|
|
|
Services.scriptloader.loadSubScript("chrome://zotero/content/icon.js", {}, "UTF-8");
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
Zotero.logError(e);
|
|
|
|
}
|
2013-08-12 00:51:16 +00:00
|
|
|
|
|
|
|
// Used for loading pages from upgrade wizard
|
|
|
|
if (Zotero.initialURL) {
|
|
|
|
setTimeout(function () {
|
|
|
|
gBrowser.selectedTab = gBrowser.addTab(Zotero.initialURL);
|
|
|
|
Zotero.initialURL = null;
|
|
|
|
}, 1);
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
2016-12-16 08:13:30 +00:00
|
|
|
}, this);
|
2011-01-30 09:44:01 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 06:20:00 +00:00
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
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
|
2012-02-20 08:11:53 +00:00
|
|
|
* @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.
|
2011-01-30 09:44:01 +00:00
|
|
|
*/
|
2012-02-20 08:11:53 +00:00
|
|
|
this.toggleDisplay = function(makeVisible, dontRefocus)
|
Async DB megacommit
Promise-based rewrite of most of the codebase, with asynchronous database and file access -- see https://github.com/zotero/zotero/issues/518 for details.
WARNING: This includes backwards-incompatible schema changes.
An incomplete list of other changes:
- Schema overhaul
- Replace main tables with new versions with updated schema
- Enable real foreign key support and remove previous triggers
- Don't use NULLs for local libraryID, which broke the UNIQUE index
preventing object key duplication. All code (Zotero and third-party)
using NULL for the local library will need to be updated to use 0
instead (already done for Zotero code)
- Add 'compatibility' DB version that can be incremented manually to break DB
compatibility with previous versions. 'userdata' upgrades will no longer
automatically break compatibility.
- Demote creators and tags from first-class objects to item properties
- New API syncing properties
- 'synced'/'version' properties to data objects
- 'etag' to groups
- 'version' to libraries
- Create Zotero.DataObject that other objects inherit from
- Consolidate data object loading into Zotero.DataObjects
- Change object reloading so that only the loaded and changed parts of objects are reloaded, instead of reloading all data from the database (with some exceptions, including item primary data)
- Items and collections now have .parentItem and .parentKey properties, replacing item.getSource() and item.getSourceKey()
- New function Zotero.serial(fn), to wrap an async function such that all calls are run serially
- New function Zotero.Utilities.Internal.forEachChunkAsync(arr, chunkSize, func)
- Add tag selector loading message
- Various API and name changes, since everything was breaking anyway
Known broken things:
- Syncing (will be completely rewritten for API syncing)
- Translation architecture (needs promise-based rewrite)
- Duplicates view
- DB integrity check (from schema changes)
- Dragging (may be difficult to fix)
Lots of other big and little things are certainly broken, particularly with the UI, which can be affected by async code in all sorts of subtle ways.
2014-08-06 21:38:05 +00:00
|
|
|
{
|
2016-11-10 05:55:30 +00:00
|
|
|
if (!Zotero || Zotero.startupError || Zotero.skipLoading) {
|
2011-07-20 03:48:17 +00:00
|
|
|
ZoteroPane.displayStartupError();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Async DB megacommit
Promise-based rewrite of most of the codebase, with asynchronous database and file access -- see https://github.com/zotero/zotero/issues/518 for details.
WARNING: This includes backwards-incompatible schema changes.
An incomplete list of other changes:
- Schema overhaul
- Replace main tables with new versions with updated schema
- Enable real foreign key support and remove previous triggers
- Don't use NULLs for local libraryID, which broke the UNIQUE index
preventing object key duplication. All code (Zotero and third-party)
using NULL for the local library will need to be updated to use 0
instead (already done for Zotero code)
- Add 'compatibility' DB version that can be incremented manually to break DB
compatibility with previous versions. 'userdata' upgrades will no longer
automatically break compatibility.
- Demote creators and tags from first-class objects to item properties
- New API syncing properties
- 'synced'/'version' properties to data objects
- 'etag' to groups
- 'version' to libraries
- Create Zotero.DataObject that other objects inherit from
- Consolidate data object loading into Zotero.DataObjects
- Change object reloading so that only the loaded and changed parts of objects are reloaded, instead of reloading all data from the database (with some exceptions, including item primary data)
- Items and collections now have .parentItem and .parentKey properties, replacing item.getSource() and item.getSourceKey()
- New function Zotero.serial(fn), to wrap an async function such that all calls are run serially
- New function Zotero.Utilities.Internal.forEachChunkAsync(arr, chunkSize, func)
- Add tag selector loading message
- Various API and name changes, since everything was breaking anyway
Known broken things:
- Syncing (will be completely rewritten for API syncing)
- Translation architecture (needs promise-based rewrite)
- Duplicates view
- DB integrity check (from schema changes)
- Dragging (may be difficult to fix)
Lots of other big and little things are certainly broken, particularly with the UI, which can be affected by async code in all sorts of subtle ways.
2014-08-06 21:38:05 +00:00
|
|
|
// Don't do anything if pane is already showing
|
|
|
|
if (makeVisible && ZoteroPane.isShowing()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-06-14 00:36:21 +00:00
|
|
|
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;
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
2011-06-14 00:36:21 +00:00
|
|
|
if(makeVisible === undefined) makeVisible = zoteroPane.hidden || zoteroPane.collapsed;
|
2011-01-30 09:44:01 +00:00
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
/*
|
|
|
|
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);
|
|
|
|
*/
|
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
if(makeVisible) {
|
2011-09-21 23:00:20 +00:00
|
|
|
zoteroSplitter.setAttribute('hidden', false);
|
|
|
|
zoteroPane.setAttribute('hidden', false);
|
|
|
|
zoteroPane.setAttribute('collapsed', false);
|
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
// Get saved height (makeVisible() may change it)
|
|
|
|
if (zoteroPane.hasAttribute('savedHeight')) {
|
|
|
|
var savedHeight = zoteroPane.getAttribute('savedHeight');
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
2011-01-30 09:44:01 +00:00
|
|
|
else {
|
|
|
|
var savedHeight = DEFAULT_ZPANE_HEIGHT;
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
// Restore height
|
|
|
|
var max = document.getElementById('appcontent').boxObject.height
|
|
|
|
- zoteroSplitter.boxObject.height;
|
|
|
|
zoteroPane.setAttribute('height', Math.min(savedHeight, max));
|
2010-07-13 18:33:47 +00:00
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
// Make visible
|
|
|
|
ZoteroPane.makeVisible();
|
2009-02-18 03:09:39 +00:00
|
|
|
|
2015-11-04 19:30:25 +00:00
|
|
|
// Warn about unsafe data directory on first display
|
2016-11-27 05:06:02 +00:00
|
|
|
Zotero.DataDirectory.checkForUnsafeLocation(Zotero.DataDirectory.dir); // async
|
2015-11-04 19:30:25 +00:00
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
// Make sure tags splitter isn't missing for people upgrading from <2.0b7
|
|
|
|
document.getElementById('zotero-tags-splitter').collapsed = false;
|
|
|
|
} else {
|
2011-02-11 22:16:32 +00:00
|
|
|
ZoteroPane.makeHidden();
|
|
|
|
|
2011-01-30 09:44:01 +00:00
|
|
|
// Collapse pane
|
2011-09-21 23:00:20 +00:00
|
|
|
zoteroSplitter.setAttribute('hidden', true);
|
2007-10-23 07:11:59 +00:00
|
|
|
zoteroPane.setAttribute('collapsed', true);
|
|
|
|
zoteroPane.height = 0;
|
|
|
|
|
2006-07-05 16:19:26 +00:00
|
|
|
document.getElementById('content').setAttribute('collapsed', false);
|
2012-02-20 08:11:53 +00:00
|
|
|
|
|
|
|
if(!dontRefocus) {
|
|
|
|
// Return focus to the browser content pane
|
|
|
|
window.content.window.focus();
|
|
|
|
}
|
2009-04-09 05:28:41 +00:00
|
|
|
}
|
2006-05-31 22:01:31 +00:00
|
|
|
}
|
2006-06-02 12:59:58 +00:00
|
|
|
}
|
|
|
|
|
2013-08-12 00:51:16 +00:00
|
|
|
window.addEventListener("load", function(e) {
|
|
|
|
try {
|
|
|
|
ZoteroOverlay.onLoad(e);
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
if (Zotero) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
dump(e + "\n\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, false);
|
2011-01-30 09:44:01 +00:00
|
|
|
window.addEventListener("unload", function(e) { ZoteroOverlay.onUnload(e); }, false);
|
|
|
|
window.addEventListener("beforeunload", function(e) { ZoteroOverlay.onBeforeUnload(e); }, false);
|