commit 8e8bc1507142fdb3e2952e73c41924d28ad0678f
parent 30a0bbcca2094cb79fd7084d5e8b94ffe52b0512
Author: Dan Stillman <dstillman@zotero.org>
Date: Tue, 2 Jul 2013 16:48:53 -0400
Closes #291, Default to last-used item type when creating item via
keyboard
Diffstat:
2 files changed, 83 insertions(+), 15 deletions(-)
diff --git a/chrome/content/zotero/bindings/itembox.xml b/chrome/content/zotero/bindings/itembox.xml
@@ -51,6 +51,7 @@
<field name="clickHandler"/>
<field name="blurHandler"/>
+ <field name="eventHandlers">[]</field>
<field name="_initialVisibleCreators">10</field>
<field name="_displayAllCreators"/>
@@ -1103,6 +1104,11 @@
this.refresh();
}
+ if (this.eventHandlers['itemtypechange'] && this.eventHandlers['itemtypechange'].length) {
+ var self = this;
+ this.eventHandlers['itemtypechange'].forEach(function (f) f.bind(self)());
+ }
+
return true;
}
@@ -2290,6 +2296,43 @@
</method>
+ <!--
+ Available handlers:
+
+ - 'itemtypechange'
+
+ Note: 'this' in the function will be bound to the item box.
+ -->
+ <method name="addHandler">
+ <parameter name="eventName"/>
+ <parameter name="func"/>
+ <body>
+ <![CDATA[
+ if (!this.eventHandlers[eventName]) {
+ this.eventHandlers[eventName] = [];
+ }
+ this.eventHandlers[eventName].push(func);
+ ]]>
+ </body>
+ </method>
+
+ <method name="removeHandler">
+ <parameter name="eventName"/>
+ <parameter name="func"/>
+ <body>
+ <![CDATA[
+ if (!this.eventHandlers[eventName]) {
+ return;
+ }
+ var pos = this.eventHandlers[eventName].indexOf(func);
+ if (pos != -1) {
+ this.eventHandlers[eventName].splice(pos, 1);
+ }
+ ]]>
+ </body>
+ </method>
+
+
<method name="_id">
<parameter name="id"/>
<body>
diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js
@@ -647,8 +647,28 @@ var ZoteroPane = new function()
document.getElementById('zotero-tb-search').select();
break;
case 'newItem':
- ZoteroPane_Local.newItem(2); // book
- var menu = document.getElementById('zotero-editpane-item-box').itemTypeMenu;
+ // Default to most recent item type from here or the
+ // New Type menu
+ var mru = Zotero.Prefs.get('newItemTypeMRU');
+ // Or fall back to 'book'
+ var typeID = mru ? mru.split(',')[0] : 2;
+ ZoteroPane_Local.newItem(typeID);
+ let itemBox = document.getElementById('zotero-editpane-item-box');
+ var menu = itemBox.itemTypeMenu;
+ var self = this;
+ var handleTypeChange = function () {
+ self.addItemTypeToNewItemTypeMRU(this.itemTypeMenu.value);
+ itemBox.removeHandler('itemtypechange', handleTypeChange);
+ };
+ // Only update the MRU when the menu is opened for the
+ // keyboard shortcut, not on subsequent opens
+ var removeTypeChangeHandler = function () {
+ itemBox.removeHandler('itemtypechange', handleTypeChange);
+ itemBox.itemTypeMenu.firstChild.removeEventListener('popuphiding', removeTypeChangeHandler);
+ };
+ itemBox.addHandler('itemtypechange', handleTypeChange);
+ itemBox.itemTypeMenu.firstChild.addEventListener('popuphiding', removeTypeChangeHandler);
+
menu.focus();
document.getElementById('zotero-editpane-item-box').itemTypeMenu.menupopup.openPopup(menu, "before_start", 0, 0);
break;
@@ -750,25 +770,30 @@ var ZoteroPane = new function()
// Update most-recently-used list for New Item menu
if (manual) {
- var mru = Zotero.Prefs.get('newItemTypeMRU');
- if (mru) {
- var mru = mru.split(',');
- var pos = mru.indexOf(typeID + '');
- if (pos != -1) {
- mru.splice(pos, 1);
- }
- mru.unshift(typeID);
- }
- else {
- var mru = [typeID + ''];
- }
- Zotero.Prefs.set('newItemTypeMRU', mru.slice(0, 5).join(','));
+ this.addItemTypeToNewItemTypeMRU(typeID);
}
return Zotero.Items.get(itemID);
}
+ this.addItemTypeToNewItemTypeMRU = function (itemTypeID) {
+ var mru = Zotero.Prefs.get('newItemTypeMRU');
+ if (mru) {
+ var mru = mru.split(',');
+ var pos = mru.indexOf(itemTypeID + '');
+ if (pos != -1) {
+ mru.splice(pos, 1);
+ }
+ mru.unshift(itemTypeID);
+ }
+ else {
+ var mru = [itemTypeID + ''];
+ }
+ Zotero.Prefs.set('newItemTypeMRU', mru.slice(0, 5).join(','));
+ }
+
+
function newCollection(parent)
{
if (!Zotero.stateCheck()) {