- closes #130, add progress bar for import/export

- eliminates "unresponsive script" message on import/export

i tried to make a progress bar that actually provides useful information, but for some reason, XUL interface updates are done asynchronously, and thus don't actually happen as long as the import/export operation continues. the code is there, but disabled, if there's some solution to this issue, but i searched and couldn't find one.
This commit is contained in:
Simon Kornblith 2006-08-02 21:06:58 +00:00
parent 6ad7acf4d8
commit 30af2c89df
5 changed files with 189 additions and 15 deletions

View file

@ -1,4 +1,6 @@
Scholar_File_Interface = new function() {
var _unresponsiveScriptPreference;
this.exportFile = exportFile;
this.importFile = importFile;
this.bibliographyFromProject = bibliographyFromProject;
@ -21,11 +23,42 @@ Scholar_File_Interface = new function() {
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
translation.setLocation(fp.file);
translation.setTranslator(translators[fp.filterIndex]);
//translation.setHandler("done", _exportDone);
translation.translate();
//translation.setHandler("itemCount", _exportItemCount);
//translation.setHandler("itemDone", _exportItemDone);
translation.setHandler("done", _exportDone);
_disableUnresponsive();
Scholar_File_Interface.Progress.show(
Scholar.getString("fileInterface.itemsExported"),
function() {
translation.translate();
});
}
}
/*
* set progress indicator length
*/
function _exportItemCount(obj, number) {
Scholar.debug("count called with "+number);
Scholar_File_Interface.Progress.setNumber(number);
}
/*
* Increment progress for each item exported
*/
function _exportItemDone(obj, item) {
Scholar_File_Interface.Progress.increment();
}
/*
* closes items exported indicator
*/
function _exportDone(obj) {
Scholar_File_Interface.Progress.close();
_restoreUnresponsive();
}
/*
* Creates Scholar.Translate instance and shows file picker for file import
*/
@ -49,12 +82,56 @@ Scholar_File_Interface = new function() {
if(translators.length) {
// TODO: display a list of available translators
translation.setTranslator(translators[0]);
// show progress indicator
translation.setHandler("itemDone", _importItemDone);
translation.translate();
translation.setHandler("done", _importDone);
_disableUnresponsive();
Scholar_File_Interface.Progress.show(
Scholar.getString("fileInterface.itemsImported"),
function() {
translation.translate();
});
}
}
}
/*
* Saves items after they've been imported. We could have a nice little
* "items imported" indicator, too.
*/
function _importItemDone(obj, item) {
//Scholar_File_Interface.Progress.increment();
item.save();
}
/*
* closes items imported indicator
*/
function _importDone(obj) {
Scholar_File_Interface.Progress.close();
_restoreUnresponsive();
}
/*
* disables the "unresponsive script" warning; necessary for import and
* export, which can take quite a while to execute
*/
function _disableUnresponsive() {
var prefService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
_unresponsiveScriptPreference = prefService.getIntPref("dom.max_script_run_time");
prefService.setIntPref("dom.max_script_run_time", 0);
}
/*
* restores the "unresponsive script" warning
*/
function _restoreUnresponsive() {
var prefService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
prefService.setIntPref("dom.max_script_run_time", _unresponsiveScriptPreference);
}
/*
* Creates a bibliography
*/
@ -65,14 +142,6 @@ Scholar_File_Interface = new function() {
_doBibliographyOptions(Scholar.getItems(collection.getID()));
}
/*
* Saves items after they've been imported. We could have a nice little
* "items imported" indicator, too.
*/
function _importItemDone(obj, item) {
item.save();
}
/*
* Shows bibliography options and creates a bibliography
*/
@ -161,4 +230,79 @@ Scholar_File_Interface = new function() {
clipboardService.setData(transferable, null, Components.interfaces.nsIClipboard.kGlobalClipboard);
}
}
}
}
// Handles the display of a progress indicator
Scholar_File_Interface.Progress = new function() {
var _windowLoaded = false;
var _windowLoading = false;
var _progressWindow;
// keep track of all of these things in case they're called before we're
// done loading the progress window
var _loadHeadline, _loadNumber, _outOf, _callback;
this.show = show;
//this.setNumber = setNumber;
//this.increment = increment;
this.close = close;
function show(headline, callback) {
if(_windowLoading || _windowLoaded) { // already loading or loaded
return false;
}
_windowLoading = true;
_loadHeadline = headline;
_loadNumber = 0;
_outOf = 0;
_callback = callback;
_progressWindow = window.openDialog("chrome://scholar/chrome/fileProgress.xul", "", "chrome,resizable=no,close=no,dependent,dialog,centerscreen");
_progressWindow.addEventListener("pageshow", _onWindowLoaded, false);
}
/*function setNumber(number) {
_outOf = number;
if(_windowLoaded) {
var progressMeter = _progressWindow.document.getElementById("progress-indicator");
progressMeter.mode = "normal";
progressMeter.value = "0%";
}
}
function increment() {
_loadNumber++;
if(_windowLoaded) {
_progressWindow.document.getElementById("progress-items").value = _loadNumber;
if(_outOf) {
_progressWindow.document.getElementById("progress-indicator").value = ((_loadNumber/_outOf)*100).toString()+"%";
}
_progressWindow.getSelection();
}
}*/
function close() {
_windowLoaded = false;
try {
_progressWindow.close();
} catch(ex) {}
}
function _onWindowLoaded() {
_windowLoading = false;
_windowLoaded = true;
// do things we delayed because the winodw was loading
/*if(_outOf) {
var progressMeter = _progressWindow.document.getElementById("progress-indicator");
progressMeter.mode = "normal";
progressMeter.value = ((_loadNumber/_outOf)*100).toString()+"%";
}
_progressWindow.document.getElementById("progress-items").value = _loadNumber;*/
_progressWindow.document.getElementById("progress-label").value = _loadHeadline;
if(_callback) {
window.setTimeout(_callback, 1500);
}
}
}