150 lines
5 KiB
JavaScript
150 lines
5 KiB
JavaScript
/*
|
|
***** BEGIN LICENSE BLOCK *****
|
|
|
|
Copyright © 2018 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 *****
|
|
*/
|
|
|
|
Zotero.ProgressQueueDialog = function (progressQueue) {
|
|
const SUCCESS_IMAGE = 'chrome://zotero/skin/tick.png';
|
|
const FAILURE_IMAGE = 'chrome://zotero/skin/cross.png';
|
|
const LOADING_IMAGE = 'chrome://zotero/skin/arrow_refresh.png';
|
|
|
|
let _progressQueue = this.progressQueue = progressQueue;
|
|
|
|
let _progressWindow = null;
|
|
let _progressIndicator = null;
|
|
let _io = { progressQueue: _progressQueue };
|
|
let _status = null;
|
|
let _showMinimize = true;
|
|
|
|
this.open = function () {
|
|
if (_progressWindow) {
|
|
_progressWindow.focus();
|
|
return;
|
|
}
|
|
|
|
let win = Services.wm.getMostRecentWindow("navigator:browser");
|
|
if (win) {
|
|
_progressWindow = win.openDialog("chrome://zotero/content/progressQueueDialog.xhtml",
|
|
"", "chrome,close=yes,resizable=yes,dependent,dialog,centerscreen", _io);
|
|
}
|
|
else {
|
|
_progressWindow = Services.ww.openWindow(null, "chrome://zotero/content/progressQueueDialog.xhtml",
|
|
"", "chrome,close=yes,resizable=yes,dependent,dialog,centerscreen", _io);
|
|
}
|
|
|
|
_progressWindow.addEventListener('pageshow', _onWindowLoaded.bind(this), false);
|
|
};
|
|
|
|
this.setStatus = function (msg) {
|
|
_status = msg;
|
|
if (_progressWindow) {
|
|
let label = _progressWindow.document.getElementById("label");
|
|
if (label) {
|
|
label.value = msg;
|
|
}
|
|
}
|
|
};
|
|
|
|
this.showMinimizeButton = function (show) {
|
|
_showMinimize = show;
|
|
};
|
|
|
|
this.isOpen = function () {
|
|
return !!_progressWindow;
|
|
};
|
|
|
|
this.close = function () {
|
|
// In case close() is called before open()
|
|
if (!_progressWindow) {
|
|
return;
|
|
}
|
|
_progressWindow.close();
|
|
_progressQueue.cancel();
|
|
};
|
|
|
|
function _onWindowLoaded() {
|
|
var rootElement = _progressWindow.document.getElementById('zotero-progress-box');
|
|
Zotero.setFontSize(rootElement);
|
|
|
|
_progressIndicator = _progressWindow.document.getElementById('progress-indicator');
|
|
_progressWindow.document.getElementById('cancel-button')
|
|
.addEventListener('command', () => {
|
|
this.close();
|
|
}, false);
|
|
|
|
_progressWindow.document.getElementById('minimize-button')
|
|
.addEventListener('command', function () {
|
|
_progressWindow.close();
|
|
}, false);
|
|
|
|
_progressWindow.document.getElementById('close-button')
|
|
.addEventListener('command', () => {
|
|
this.close();
|
|
}, false);
|
|
|
|
_progressWindow.addEventListener('keypress', function (e) {
|
|
if (e.keyCode === _progressWindow.KeyEvent.DOM_VK_ESCAPE) {
|
|
// If done processing, Esc is equivalent to Close rather than Minimize
|
|
if (_progressQueue.getTotal() === _progressQueue.getProcessedTotal()) {
|
|
_progressQueue.cancel();
|
|
}
|
|
_progressWindow.close();
|
|
}
|
|
});
|
|
|
|
_progressWindow.addEventListener('unload', function () {
|
|
_progressQueue.removeListener('rowadded', _updateProgress);
|
|
_progressQueue.removeListener('rowupdated', _updateProgress);
|
|
_progressQueue.removeListener('rowdeleted', _updateProgress);
|
|
_progressWindow = null;
|
|
_progressIndicator = null;
|
|
_status = null;
|
|
_showMinimize = true;
|
|
});
|
|
|
|
_progressQueue.addListener('rowadded', _updateProgress);
|
|
_progressQueue.addListener('rowupdated', _updateProgress);
|
|
_progressQueue.addListener('rowdeleted', _updateProgress);
|
|
|
|
_updateProgress();
|
|
}
|
|
|
|
function _updateProgress() {
|
|
if (!_progressWindow) return;
|
|
let total = _progressQueue.getTotal();
|
|
let processed = _progressQueue.getProcessedTotal();
|
|
_progressIndicator.value = processed * 100 / total;
|
|
if (processed === total) {
|
|
_progressWindow.document.getElementById("cancel-button").hidden = true;
|
|
_progressWindow.document.getElementById("minimize-button").hidden = true;
|
|
_progressWindow.document.getElementById("close-button").hidden = false;
|
|
_progressWindow.document.getElementById("label").value = _status || Zotero.getString('general.finished');
|
|
}
|
|
else {
|
|
_progressWindow.document.getElementById("cancel-button").hidden = false;
|
|
_progressWindow.document.getElementById("minimize-button").hidden = !_showMinimize;
|
|
_progressWindow.document.getElementById("close-button").hidden = true;
|
|
_progressWindow.document.getElementById("label").value = _status || Zotero.getString('general.processing');
|
|
}
|
|
}
|
|
};
|