From 410e090ecd321d6edf19d0943c11d2e4d1a2ea77 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Tue, 15 Aug 2006 23:03:11 +0000 Subject: [PATCH] closes #104, speed up multiple item adds --- .../content/scholar/fileInterface.js | 32 +++++++++++------ .../content/scholar/ingester/browser.js | 12 +++++-- .../content/scholar/xpcom/translate.js | 35 ++++++++++++++++++- 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/chrome/chromeFiles/content/scholar/fileInterface.js b/chrome/chromeFiles/content/scholar/fileInterface.js index 44832ae2f..d6b60530c 100644 --- a/chrome/chromeFiles/content/scholar/fileInterface.js +++ b/chrome/chromeFiles/content/scholar/fileInterface.js @@ -1,5 +1,5 @@ var Scholar_File_Interface = new function() { - var _unresponsiveScriptPreference, _importCollection; + var _unresponsiveScriptPreference, _importCollection, _notifyItem, _notifyCollection; this.exportFile = exportFile; this.exportProject = exportProject; @@ -12,6 +12,8 @@ var Scholar_File_Interface = new function() { * Creates Scholar.Translate instance and shows file picker for file export */ function exportFile(items) { + Scholar.debug(items); + var translation = new Scholar.Translate("export"); var translators = translation.getTranslators(); @@ -111,10 +113,13 @@ var Scholar_File_Interface = new function() { // import items translation.setTranslator(translators[0]); - translation.setHandler("itemDone", _importItemDone); 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"), @@ -125,27 +130,34 @@ var Scholar_File_Interface = new function() { } } - /* - * Saves items after they've been imported. We could have a nice little - * "items imported" indicator, too. - */ - function _importItemDone(obj, item) { - _importCollection.addItem(item.getID()); - } - /* * 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(); } diff --git a/chrome/chromeFiles/content/scholar/ingester/browser.js b/chrome/chromeFiles/content/scholar/ingester/browser.js index 38f06a7d0..e6b849f79 100644 --- a/chrome/chromeFiles/content/scholar/ingester/browser.js +++ b/chrome/chromeFiles/content/scholar/ingester/browser.js @@ -82,7 +82,7 @@ Scholar_Ingester_Interface.scrapeThisPage = function(saveLocation) { translate.setTranslator(data.translators[0]); translate.setHandler("select", Scholar_Ingester_Interface._selectItems); translate.setHandler("itemDone", function(obj, item) { Scholar_Ingester_Interface._itemDone(obj, item, saveLocation) }); - translate.setHandler("done", Scholar_Ingester_Interface._finishScraping); + translate.setHandler("done", function(obj, item) { Scholar_Ingester_Interface._finishScraping(obj, item, saveLocation) }); translate.translate(); } } @@ -278,7 +278,9 @@ Scholar_Ingester_Interface._itemDone = function(obj, item, collection) { // add item to collection, if one was specified if(collection) { + Scholar.Notifier.disable(); collection.addItem(item.getID()); + Scholar.Notifier.enable(); } } @@ -301,11 +303,17 @@ Scholar_Ingester_Interface._selectItems = function(obj, itemList) { /* * Callback to be executed when scraping is complete */ -Scholar_Ingester_Interface._finishScraping = function(obj, returnValue) { +Scholar_Ingester_Interface._finishScraping = function(obj, returnValue, collection) { if(!returnValue) { Scholar_Ingester_Interface.Progress.changeHeadline(Scholar.getString("ingester.scrapeError")); Scholar_Ingester_Interface.Progress.addDescription(Scholar.getString("ingester.scrapeErrorDescription")); } + + if(collection) { + // notify about modified items + Scholar.Notifier.trigger("modify", "collection", collection.getID()); + } + Scholar_Ingester_Interface.Progress.fade(); } diff --git a/chrome/chromeFiles/content/scholar/xpcom/translate.js b/chrome/chromeFiles/content/scholar/xpcom/translate.js index ece197da6..02cfbaa42 100644 --- a/chrome/chromeFiles/content/scholar/xpcom/translate.js +++ b/chrome/chromeFiles/content/scholar/xpcom/translate.js @@ -45,6 +45,8 @@ * string - the string content to be used as a file. * saveItem - whether new items should be saved to the database. defaults to * true; set using second argument of constructor. + * newItems - items created when translate() was called + * newCollections - collections created when translate() was called * * PRIVATE PROPERTIES: * @@ -367,6 +369,8 @@ Scholar.Translate.prototype._loadTranslator = function() { * does the actual translation */ Scholar.Translate.prototype.translate = function() { + this.newItems = new Array(); + this.newCollections = new Array(); this._IDMap = new Array(); this._complete = false; @@ -504,6 +508,10 @@ Scholar.Translate.prototype._generateSandbox = function() { translation._loadTranslator(); // use internal io translation._initializeInternalIO(); + // when a new item is added, we should be notified + translation.newItems = me.newItems; + translation.newCollections = me.newCollections; + return translation._sandbox; } else { // create a safe translator object, so that scrapers can't get @@ -738,6 +746,17 @@ Scholar.Translate.prototype._translationComplete = function(returnValue) { // close open streams this._closeStreams(); + if(Scholar.Notifier.isEnabled()) { + // notify itemTreeView about updates + if(this.newItems.length) { + Scholar.Notifier.trigger("add", "item", this.newItems); + } + // notify collectionTreeView about updates + if(this.newCollections.length) { + Scholar.Notifier.trigger("add", "collection", this.newCollections); + } + } + // call handlers this._runHandler("done", returnValue); } @@ -792,6 +811,11 @@ Scholar.Translate.prototype._itemDone = function(item) { return; } + var notifierStatus = Scholar.Notifier.isEnabled(); + if(notifierStatus) { + Scholar.Notifier.disable(); + } + // Get typeID, defaulting to "website" var type = (item.itemType ? item.itemType : "website"); @@ -878,6 +902,7 @@ Scholar.Translate.prototype._itemDone = function(item) { if(item.itemID) { this._IDMap[item.itemID] = myID; } + this.newItems.push(myID); // handle see also if(item.seeAlso) { @@ -890,6 +915,10 @@ Scholar.Translate.prototype._itemDone = function(item) { delete item; + // only re-enable if notifier was enabled at the beginning of scraping + if(notifierStatus) { + Scholar.Notifier.enable(); + } this._runHandler("itemDone", newItem); } @@ -908,11 +937,14 @@ Scholar.Translate.prototype._collectionDone = function(collection) { */ Scholar.Translate.prototype._processCollection = function(collection, parentID) { var newCollection = Scholar.Collections.add(collection.name, parentID); + var myID = newCollection.getID(); + + this.newCollections.push(myID); for each(child in collection.children) { if(child.type == "collection") { // do recursive processing of collections - this._processCollection(child, newCollection.getID()); + this._processCollection(child, myID); } else { // add mapped items to collection if(this._IDMap[child.id]) { @@ -1150,6 +1182,7 @@ Scholar.Translate.prototype._exportConfigureIO = function() { Scholar.Translate.prototype._exportGetItem = function() { if(this._itemsLeft.length != 0) { var returnItem = this._itemsLeft.shift(); + Scholar.debug("getting info on "+returnItem.getID()); this._runHandler("itemDone", returnItem); return returnItem.toArray(); }