commit f38f5e9c7ceb4c0a66f2933398d363ceb31cd75a
parent 14862edb2ccbf74812386533f7dddad72b0ecd47
Author: Dan Stillman <dstillman@zotero.org>
Date: Sat, 11 Apr 2009 07:54:17 +0000
The previous items list nsITreeView object wasn't being destroyed when changing collections. This could cause slow expand/collapse operations (since it was trying to expand each item in each collection you'd viewed since starting Zotero the number of times you'd viewed the collection) and was also causing a potentially large memory leak.
Diffstat:
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/chrome/content/zotero/overlay.js b/chrome/content/zotero/overlay.js
@@ -838,6 +838,11 @@ var ZoteroPane = new function()
if (this.itemsView)
{
this.itemsView.unregister();
+ document.getElementById('zotero-items-tree').removeEventListener(
+ 'keypress', this.itemsView.wrappedJSObject.listener, false
+ );
+ this.itemsView.wrappedJSObject.listener = null;
+ document.getElementById('zotero-items-tree').view = this.itemsView = null;
}
document.getElementById('zotero-tb-search').value = "";
diff --git a/chrome/content/zotero/xpcom/itemTreeView.js b/chrome/content/zotero/xpcom/itemTreeView.js
@@ -112,7 +112,7 @@ Zotero.ItemTreeView.prototype.setTree = function(treebox)
var expandAllRows = obj.expandAllRows;
var collapseAllRows = obj.collapseAllRows;
var tree = obj._treebox.treeBody.parentNode;
- tree.addEventListener('keypress', function(event) {
+ var listener = function(event) {
var key = String.fromCharCode(event.which);
if (key == '+' && !(event.ctrlKey || event.altKey || event.metaKey)) {
@@ -124,7 +124,11 @@ Zotero.ItemTreeView.prototype.setTree = function(treebox)
obj.collapseAllRows(treebox);
return;
}
- }, false);
+ };
+ // Store listener so we can call removeEventListener()
+ // in overlay.js::onCollectionSelected()
+ obj.listener = listener;
+ tree.addEventListener('keypress', listener, false);
obj.sort();
obj.expandMatchParents();
@@ -774,6 +778,10 @@ Zotero.ItemTreeView.prototype.toggleOpenState = function(row, skipItemMapRefresh
}
}
+ if (!count) {
+ return;
+ }
+
this._dataItems[row].isOpen = !this._dataItems[row].isOpen;
this._treebox.rowCountChanged(row+1, count); //tell treebox to repaint these
this._treebox.invalidateRow(row);