www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit ba2a16531b0992ab94eca635cd9871ed75c23c85
parent 110bf42e5fc690bc089b547f6f09eeb287b3bc79
Author: Dan Stillman <dstillman@zotero.org>
Date:   Thu, 19 Feb 2015 17:36:00 -0500

Add "Show Item in Library" button to note-too-long window

TODO: other too-long errors

Diffstat:
Mchrome/content/zotero/xpcom/collectionTreeView.js | 48++++++++++++++++++++++++++++++++++++++++++++++++
Mchrome/content/zotero/xpcom/itemTreeView.js | 6++++++
Mchrome/content/zotero/xpcom/sync.js | 36++++++++++++++++++++++++++++++++++++
Mchrome/content/zotero/zoteroPane.js | 18++++++++++++++++--
Mchrome/locale/en-US/zotero/zotero.properties | 1+
5 files changed, 107 insertions(+), 2 deletions(-)

diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -749,6 +749,54 @@ Zotero.CollectionTreeView.prototype.selectLibrary = function (libraryID) { } +Zotero.CollectionTreeView.prototype.selectTrash = function (libraryID) { + if (Zotero.suppressUIUpdates) { + Zotero.debug("UI updates suppressed -- not changing library selection"); + return false; + } + + // Check if trash is already selected + if (this.selection.currentIndex != -1) { + let itemGroup = this._getItemAtRow(this.selection.currentIndex); + if (itemGroup.isTrash() && itemGroup.ref.libraryID == libraryID) { + this._treebox.ensureRowIsVisible(this.selection.currentIndex); + return true; + } + } + + // If in My Library and it's collapsed, open it + if (!libraryID && !this.isContainerOpen(0)) { + this.toggleOpenState(0); + } + + // Find library trash + for (let i = 0; i < this.rowCount; i++) { + let itemGroup = this._getItemAtRow(i); + + // If group header is closed, open it + if (itemGroup.isHeader() && itemGroup.ref.id == 'group-libraries-header' + && !this.isContainerOpen(i)) { + this.toggleOpenState(i); + continue; + } + + if (itemGroup.isLibrary(true) && itemGroup.ref.libraryID == libraryID + && !this.isContainerOpen(i)) { + this.toggleOpenState(i); + continue; + } + + if (itemGroup.isTrash() && itemGroup.ref.libraryID == libraryID) { + this._treebox.ensureRowIsVisible(i); + this.selection.select(i); + return true; + } + } + + return false; +} + + /** * Select the last-viewed source */ diff --git a/chrome/content/zotero/xpcom/itemTreeView.js b/chrome/content/zotero/xpcom/itemTreeView.js @@ -1764,6 +1764,12 @@ Zotero.ItemTreeView.prototype.selectItem = function(id, expand, noRecurse) // Get the row of the parent, if there is one var parentRow = null; var item = Zotero.Items.get(id); + + // Can't select a deleted item if we're not in the trash + if (item.deleted && !this.itemGroup.isTrash()) { + return false; + } + var parent = item.getSource(); if (parent && this._itemRowMap[parent] != undefined) { parentRow = this._itemRowMap[parent]; diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js @@ -2132,6 +2132,42 @@ Zotero.Sync.Server = new function () { }, 1); break; + case 'NOTE_TOO_LONG': + if (!Zotero.Sync.Runner.background) { + let libraryKey = xmlhttp.responseXML.firstChild.getElementsByTagName('item'); + if (libraryKey.length) { + let [libraryID, key] = libraryKey[0].textContent.split('/'); + if (Zotero.Libraries.getType(libraryID) == 'user') { + libraryID = null; + } + let item = Zotero.Items.getByLibraryAndKey(libraryID, key); + if (item) { + let msg = xmlhttp.responseXML.firstChild.getElementsByTagName('error')[0].textContent; + let e = new Zotero.Error( + msg, + 0, + { + dialogText: msg, + dialogButtonText: Zotero.getString('pane.items.showItemInLibrary'), + dialogButtonCallback: function () { + var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var win = wm.getMostRecentWindow("navigator:browser"); + win.ZoteroPane.selectItem(item.id); + } + } + ); + _error(e); + } + else { + let msg = "Long note " + libraryKey[0].textContent + " not found!"; + Zotero.debug(msg, 1); + Components.utils.reportError(msg); + } + } + } + break; + case 'TAG_TOO_LONG': if (!Zotero.Sync.Runner.background) { var tag = xmlhttp.responseXML.firstChild.getElementsByTagName('tag'); diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js @@ -1411,6 +1411,14 @@ var ZoteroPane = new function() for (var i=0, len=itemsView.selection.getRangeCount(); i<len; i++) { itemsView.selection.getRangeAt(i, start, end); for (var j=start.value; j<=end.value; j++) { + let itemRow = itemsView._getItemAtRow(j); + + // DEBUG: Not sure how this is possible, but it was happening while switching + // to an item in the trash in a collapsed library from another library + if (!itemRow) { + Zotero.debug("Item row " + j + " not found in _nonDeletedItemsSelected()", 2); + continue; + } if (!itemsView._getItemAtRow(j).ref.deleted) { return true; } @@ -1961,8 +1969,14 @@ var ZoteroPane = new function() var selected = this.itemsView.selectItem(itemID, expand); if (!selected) { - Zotero.debug("Item was not selected; switching to library"); - this.collectionsView.selectLibrary(item.libraryID); + if (item.deleted) { + Zotero.debug("Item is deleted; switching to trash"); + this.collectionsView.selectTrash(item.libraryID); + } + else { + Zotero.debug("Item was not selected; switching to library"); + this.collectionsView.selectLibrary(item.libraryID); + } this.itemsView.selectItem(itemID, expand); } diff --git a/chrome/locale/en-US/zotero/zotero.properties b/chrome/locale/en-US/zotero/zotero.properties @@ -221,6 +221,7 @@ pane.items.menu.createParent = Create Parent Item pane.items.menu.createParent.multiple = Create Parent Items pane.items.menu.renameAttachments = Rename File from Parent Metadata pane.items.menu.renameAttachments.multiple = Rename Files from Parent Metadata +pane.items.showItemInLibrary = Show Item in Library pane.items.letter.oneParticipant = Letter to %S pane.items.letter.twoParticipants = Letter to %S and %S