var Scholar_File_Interface = new function() { var _unresponsiveScriptPreference, _importCollection, _notifyItem, _notifyCollection; this.exportFile = exportFile; this.exportCollection = exportCollection; this.exportItems = exportItems; this.importFile = importFile; this.bibliographyFromCollection = bibliographyFromCollection; this.bibliographyFromItems = bibliographyFromItems; /* * Creates Scholar.Translate instance and shows file picker for file export */ function exportFile(name, items) { var translation = new Scholar.Translate("export"); var translators = translation.getTranslators(); const nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(nsIFilePicker); fp.init(window, Scholar.getString("fileInterface.export"), nsIFilePicker.modeSave); // set file name and extension. name = (name ? name : Scholar.getString("pane.collections.library")); fp.defaultString = name+"."+translators[0].target; // add save filters for(var i in translators) { var label = translators[i].label; // put extensions in parentheses if Mac (Windows users already // get extension) label += " (."+translators[i].target+")"; fp.appendFilter(label, "*."+translators[i].target); } var rv = fp.show(); if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) { if(items) { translation.setItems(items); } translation.setLocation(fp.file); translation.setTranslator(translators[fp.filterIndex]); translation.setHandler("options", _exportOptions); translation.setHandler("done", _exportDone); _disableUnresponsive(); Scholar_File_Interface.Progress.show( Scholar.getString("fileInterface.itemsExported"), function() { translation.translate(); }); } } /* * exports a collection or saved search */ function exportCollection() { var collection = ScholarPane.getSelectedCollection(); if (collection) { exportFile(collection.getName(), Scholar.getItems(collection.getID())); return; } var searchRef = ScholarPane.getSelectedSavedSearch(); if (searchRef) { var search = new Scholar.Search(); search.load(searchRef['id']); exportFile(search.getName(), Scholar.Items.get(search.search())); return; } throw ("No collection or saved search currently selected"); } /* * exports items */ function exportItems() { var items = ScholarPane.getSelectedItems(); if(!items || !items.length) throw("no items currently selected"); exportFile(Scholar.getString("fileInterface.exportedItems"), items); } /* * closes items exported indicator */ function _exportOptions(obj, options) { var io = {options:options} window.openDialog("chrome://scholar/content/exportOptions.xul", "_blank","chrome,modal,centerscreen", io); if(io.options) { // refocus dialog Scholar_File_Interface.Progress.show(); return options; } else { return false; } } /* * closes items exported indicator */ function _exportDone(obj, worked) { Scholar_File_Interface.Progress.close(); _restoreUnresponsive(); } /* * Creates Scholar.Translate instance and shows file picker for file import */ function importFile() { var translation = new Scholar.Translate("import"); var translators = translation.getTranslators(); const nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(nsIFilePicker); fp.init(window, Scholar.getString("fileInterface.import"), nsIFilePicker.modeOpen); fp.appendFilters(nsIFilePicker.filterAll); for(var i in translators) { fp.appendFilter(translators[i].label, "*."+translators[i].target); } var rv = fp.show(); if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) { translation.setLocation(fp.file); // get translators again, bc now we can check against the file translators = translation.getTranslators(); if(translators.length) { // create a new collection to take in imported items var date = new Date(); _importCollection = Scholar.Collections.add(Scholar.getString("fileInterface.imported")+" "+date.toLocaleString()); // import items translation.setTranslator(translators[0]); translation.setHandler("collectionDone", _importCollectionDone); translation.setHandler("done", _importDone); _disableUnresponsive(); // disable notifier Scholar.Notifier.disable(); // show progress indicator Scholar_File_Interface.Progress.show( Scholar.getString("fileInterface.itemsImported"), function() { translation.translate(); }); } else { window.alert(Scholar.getString("fileInterface.fileFormatUnsupported")); } } } /* * Saves collections after they've been imported. Input item is of the type * outputted by Scholar.Collection.toArray(); only receives top-level * collections */ function _importCollectionDone(obj, collection) { Scholar.Notifier.enable(); Scholar.Notifier.trigger("add", "collection", collection.getID()); collection.changeParent(_importCollection.getID()); Scholar.Notifier.disable(); } /* * closes items imported indicator */ function _importDone(obj) { // add items to import collection for each(var itemID in obj.newItems) { _importCollection.addItem(itemID); } // run notify Scholar.Notifier.enable(); if(obj.newItems.length) { Scholar.Notifier.trigger("add", "item", obj.newItems); Scholar.Notifier.trigger("modify", "collection", _importCollection.getID()); } Scholar_File_Interface.Progress.close(); _restoreUnresponsive(); if(!worked) { window.alert(Scholar.getString("fileInterface.importError")); } } /* * 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 from a collection or saved search */ function bibliographyFromCollection() { var collection = ScholarPane.getSelectedCollection(); if (collection) { _doBibliographyOptions(collection.getName(), Scholar.getItems(collection.getID())); return; } var searchRef = ScholarPane.getSelectedSavedSearch(); if (searchRef) { var search = new Scholar.Search(); search.load(searchRef['id']); _doBibliographyOptions(search.getName(), Scholar.Items.get(search.search())); return; } throw ("No collection or saved search currently selected"); } /* * Creates a bibliography from a items */ function bibliographyFromItems() { var items = ScholarPane.getSelectedItems(); if(!items || !items.length) throw("no items currently selected"); _doBibliographyOptions(Scholar.getString("fileInterface.untitledBibliography"), items); } /* * Shows bibliography options and creates a bibliography */ function _doBibliographyOptions(name, items) { var io = new Object(); var newDialog = window.openDialog("chrome://scholar/content/bibliography.xul", "_blank","chrome,modal,centerscreen", io); // determine output format var format = "HTML"; if(io.output == "save-as-rtf") { format = "RTF"; } // generate bibliography var bibliography = Scholar.Cite.getBibliography(io.style, items, format); if(io.output == "print") { // printable bibliography, using a hidden browser var browser = Scholar.Browser.createHiddenBrowser(window); browser.contentDocument.write(bibliography); // this is kinda nasty, but we have to temporarily modify the user's // settings to eliminate the header and footer. the other way to do // this would be to attempt to print with an embedded browser, but // it's not even clear how to attempt to create one var prefService = Components.classes["@mozilla.org/preferences-service;1"]. getService(Components.interfaces.nsIPrefBranch); var prefsToClear = ["print.print_headerleft", "print.print_headercenter", "print.print_headerright", "print.print_footerleft", "print.print_footercenter", "print.print_footerright"]; var oldPrefs = new Array(); for(var i in prefsToClear) { oldPrefs[i] = prefService.getCharPref(prefsToClear[i]); prefService.setCharPref(prefsToClear[i], ""); } // print browser.contentWindow.print(); // set the prefs back for(var i in prefsToClear) { prefService.setCharPref(prefsToClear[i], oldPrefs[i]); } Scholar.Browser.deleteHiddenBrowser(browser); bibliographyStream.close(); } else if(io.output == "save-as-html") { var fStream = _saveBibliography(name, "HTML"); if(fStream !== false) { var html = ""; html +='\n'; html +='\n'; html +='
\n'; html +='\n'; html +='