Closes #291, Default to last-used item type when creating item via

keyboard
This commit is contained in:
Dan Stillman 2013-07-02 16:48:53 -04:00
parent 30a0bbcca2
commit 8e8bc15071
2 changed files with 83 additions and 15 deletions

View File

@ -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>

View File

@ -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()) {