Addresses #401, Add keyboard shortcuts

Improves tabbing between UI panes, including into metadata fields

Still some quirks and things that don't work but should (e.g. ctrl-tab to cycle through tabs in metadata pane and ability to add new creators via the keyboard), but better
This commit is contained in:
Dan Stillman 2006-12-09 02:46:25 +00:00
parent 1395432f87
commit fe92dd2cf0
6 changed files with 39 additions and 14 deletions

View File

@ -72,6 +72,7 @@ var ZoteroItemPane = new function()
this.removeAttachment = removeAttachment; this.removeAttachment = removeAttachment;
this.addAttachmentFromDialog = addAttachmentFromDialog; this.addAttachmentFromDialog = addAttachmentFromDialog;
this.addAttachmentFromPage = addAttachmentFromPage; this.addAttachmentFromPage = addAttachmentFromPage;
this.focusFirstField = focusFirstField;
function onLoad() function onLoad()
@ -637,8 +638,8 @@ var ZoteroItemPane = new function()
lastName.setAttribute('flex', '1'); lastName.setAttribute('flex', '1');
// Remove firstname field from tabindex // Remove firstname field from tabindex
var tab = parseInt(firstName.getAttribute('tabindex')); var tab = parseInt(firstName.getAttribute('ztabindex'));
firstName.setAttribute('tabindex', -1); firstName.setAttribute('ztabindex', -1);
if (_tabIndexMaxCreators==tab) if (_tabIndexMaxCreators==tab)
{ {
_tabIndexMaxCreators--; _tabIndexMaxCreators--;
@ -672,8 +673,8 @@ var ZoteroItemPane = new function()
lastName.setAttribute('flex', '0'); lastName.setAttribute('flex', '0');
// Add firstname field to tabindex // Add firstname field to tabindex
var tab = parseInt(lastName.getAttribute('tabindex')); var tab = parseInt(lastName.getAttribute('ztabindex'));
firstName.setAttribute('tabindex', tab + 1); firstName.setAttribute('ztabindex', tab + 1);
if (_tabIndexMaxCreators==tab) if (_tabIndexMaxCreators==tab)
{ {
_tabIndexMaxCreators++; _tabIndexMaxCreators++;
@ -748,7 +749,7 @@ var ZoteroItemPane = new function()
if (!noedit){ if (!noedit){
valueElement.setAttribute('flex', 1); valueElement.setAttribute('flex', 1);
valueElement.setAttribute('tabindex', tabindex); valueElement.setAttribute('ztabindex', tabindex);
valueElement.setAttribute('onclick', 'ZoteroItemPane.showEditor(this)'); valueElement.setAttribute('onclick', 'ZoteroItemPane.showEditor(this)');
valueElement.className = 'zotero-clicky'; valueElement.className = 'zotero-clicky';
} }
@ -836,7 +837,7 @@ var ZoteroItemPane = new function()
//Zotero.debug('Showing editor'); //Zotero.debug('Showing editor');
var fieldName = elem.getAttribute('fieldname'); var fieldName = elem.getAttribute('fieldname');
var tabindex = elem.getAttribute('tabindex'); var tabindex = elem.getAttribute('ztabindex');
var [field, creatorIndex, creatorField] = fieldName.split('-'); var [field, creatorIndex, creatorField] = fieldName.split('-');
if (field == 'creator') if (field == 'creator')
@ -867,7 +868,7 @@ var ZoteroItemPane = new function()
var t = document.createElement("textbox"); var t = document.createElement("textbox");
t.setAttribute('value',value); t.setAttribute('value',value);
t.setAttribute('fieldname', fieldName); t.setAttribute('fieldname', fieldName);
t.setAttribute('tabindex', tabindex); t.setAttribute('ztabindex', tabindex);
t.setAttribute('flex','1'); t.setAttribute('flex','1');
if (creatorField=='lastName') if (creatorField=='lastName')
@ -1028,7 +1029,7 @@ var ZoteroItemPane = new function()
return; return;
} }
var fieldName = textbox.getAttribute('fieldname'); var fieldName = textbox.getAttribute('fieldname');
var tabindex = textbox.getAttribute('tabindex'); var tabindex = textbox.getAttribute('ztabindex');
var value = t.value; var value = t.value;
@ -1351,6 +1352,15 @@ var ZoteroItemPane = new function()
} }
function focusFirstField(mode) {
switch (mode) {
case 'info':
_focusNextField('info', _dynamicFields, 0, false);
break;
}
}
/* /*
* Advance the field focus forward or backward * Advance the field focus forward or backward
* *
@ -1358,8 +1368,6 @@ var ZoteroItemPane = new function()
* which doesn't work well with the weird label/textbox stuff we're doing. * which doesn't work well with the weird label/textbox stuff we're doing.
* (The textbox being tabbed away from is deleted before the blur() * (The textbox being tabbed away from is deleted before the blur()
* completes, so it doesn't know where it's supposed to go next.) * completes, so it doesn't know where it's supposed to go next.)
*
* Use of the 'tabindex' attribute is arbitrary.
*/ */
function _focusNextField(mode, box, tabindex, back){ function _focusNextField(mode, box, tabindex, back){
tabindex = parseInt(tabindex); tabindex = parseInt(tabindex);
@ -1371,6 +1379,7 @@ var ZoteroItemPane = new function()
{ {
case 1: case 1:
//Zotero.debug('At beginning'); //Zotero.debug('At beginning');
document.getElementById('zotero-editpane-type-menu').focus();
return false; return false;
case _tabIndexMinCreators: case _tabIndexMinCreators:
@ -1438,7 +1447,7 @@ var ZoteroItemPane = new function()
switch (mode) switch (mode)
{ {
case 'info': case 'info':
var next = box.getElementsByAttribute('tabindex', nextIndex); var next = box.getElementsByAttribute('ztabindex', nextIndex);
if (!next[0]) if (!next[0])
{ {
//Zotero.debug("Next field not found"); //Zotero.debug("Next field not found");
@ -1449,7 +1458,7 @@ var ZoteroItemPane = new function()
// Tags pane // Tags pane
case 'tags': case 'tags':
var next = document.getAnonymousNodes(box)[0]. var next = document.getAnonymousNodes(box)[0].
getElementsByAttribute('tabindex', nextIndex); getElementsByAttribute('ztabindex', nextIndex);
if (!next[0]){ if (!next[0]){
next[0] = box.addDynamicRow(); next[0] = box.addDynamicRow();
} }

View File

@ -44,7 +44,8 @@
<button id="zotero-tb-openurl" label="&zotero.toolbar.openURL.label;" tooltiptext="&zotero.toolbar.openURL.tooltip;" flex="1" oncommand="ZoteroItemPane.onOpenURLClick();"/> <button id="zotero-tb-openurl" label="&zotero.toolbar.openURL.label;" tooltiptext="&zotero.toolbar.openURL.tooltip;" flex="1" oncommand="ZoteroItemPane.onOpenURLClick();"/>
</hbox> </hbox>
<hbox align="center"> <hbox align="center">
<menulist id="zotero-editpane-type-menu" oncommand="ZoteroItemPane.changeTypeTo(this.value)" flex="1"> <menulist id="zotero-editpane-type-menu" oncommand="ZoteroItemPane.changeTypeTo(this.value)" flex="1"
onkeypress="if (event.keyCode == event.DOM_VK_TAB){ if (!event.shiftKey) { ZoteroItemPane.focusFirstField('info'); event.preventDefault(); } }">
<menupopup/> <menupopup/>
</menulist> </menulist>
</hbox> </hbox>

View File

@ -153,7 +153,8 @@
<toolbarbutton id="zotero-tb-note-add" tooltiptext="&zotero.toolbar.note.standalone;" oncommand="ZoteroPane.newNote(event.shiftKey);"/> <toolbarbutton id="zotero-tb-note-add" tooltiptext="&zotero.toolbar.note.standalone;" oncommand="ZoteroPane.newNote(event.shiftKey);"/>
<spacer flex="1"/> <spacer flex="1"/>
<label value="&zotero.toolbar.search.label;" control="zotero-tb-search"/> <label value="&zotero.toolbar.search.label;" control="zotero-tb-search"/>
<textbox id="zotero-tb-search" type="timed" timeout="250" command="cmd_zotero_search" dir="reverse" onkeypress="if(event.keyCode == event.DOM_VK_ESCAPE) { this.value = ''; this.doCommand('cmd_zotero_search'); return false; } return true;"> <textbox id="zotero-tb-search" type="timed" timeout="250" command="cmd_zotero_search" dir="reverse"
onkeypress="if (event.keyCode == event.DOM_VK_ESCAPE) { this.value = ''; this.doCommand('cmd_zotero_search'); }">
<toolbarbutton id="zotero-tb-search-cancel" oncommand="this.parentNode.value='';" hidden="true"/> <toolbarbutton id="zotero-tb-search-cancel" oncommand="this.parentNode.value='';" hidden="true"/>
</textbox> </textbox>
</toolbar> </toolbar>
@ -161,6 +162,7 @@
id="zotero-items-tree" context="zotero-itemmenu" id="zotero-items-tree" context="zotero-itemmenu"
ondblclick="ZoteroPane.onDoubleClick(event, this);" ondblclick="ZoteroPane.onDoubleClick(event, this);"
enableColumnDrag="true" enableColumnDrag="true"
onfocus="if (!ZoteroPane.getItemsView().selection.count) { ZoteroPane.getItemsView().selection.select(0); }"
onkeypress="if (event.keyCode == event.DOM_VK_BACK_SPACE || event.keyCode == event.DOM_VK_DELETE){ ZoteroPane.deleteSelectedItem(); event.preventDefault(); }" onkeypress="if (event.keyCode == event.DOM_VK_BACK_SPACE || event.keyCode == event.DOM_VK_DELETE){ ZoteroPane.deleteSelectedItem(); event.preventDefault(); }"
onselect="ZoteroPane.itemSelected();" onselect="ZoteroPane.itemSelected();"
ondraggesture="if (event.target.localName == 'treechildren') nsDragAndDrop.startDrag(event,ZoteroPane.getItemsView());" ondraggesture="if (event.target.localName == 'treechildren') nsDragAndDrop.startDrag(event,ZoteroPane.getItemsView());"

View File

@ -4,6 +4,12 @@
/* Tag selector */ /* Tag selector */
/* Don't focus filter textbox if pane isn't open */
zoterotagselector[collapsed=true] tags-search
{
-moz-user-focus: ignore;
}
groupbox groupbox
{ {
overflow: auto; overflow: auto;
@ -21,6 +27,7 @@ label
{ {
margin-right: 5px; margin-right: 5px;
padding: 2px 4px; padding: 2px 4px;
-moz-user-focus: ignore;
} }
label[selected=true] label[selected=true]

View File

@ -30,6 +30,11 @@
font-weight: bold; font-weight: bold;
} }
#zotero-editpane-dynamic-fields row label
{
-moz-user-focus: ignore;
}
/* creator type menu */ /* creator type menu */
#zotero-editpane-dynamic-fields row > toolbarbutton #zotero-editpane-dynamic-fields row > toolbarbutton
{ {

View File

@ -59,6 +59,7 @@ tagsbox row
seealsobox seealsobox
{ {
-moz-binding: url('chrome://zotero/content/bindings/relatedbox.xml#seealso-box'); -moz-binding: url('chrome://zotero/content/bindings/relatedbox.xml#seealso-box');
-moz-user-focus: ignore;
} }
zoterosearch zoterosearch