Selectmenu: improved button event handling, Home/End and Page Up/Page Down keys work now, THX to John

This commit is contained in:
Felix Nagel 2011-12-22 01:51:16 +01:00
parent 672218bfec
commit a5560f3037

View File

@ -287,16 +287,14 @@ $.widget( "ui.selectmenu", {
return li.appendTo( ul );
},
_move: function( key, event ) {
if ( !this.isOpen ) {
_move: function( event, direction, focusFirst ) {
// focus is needed otherwise this.active is not set correctly in Menu
if ( focusFirst ) {
this.menu.menu( "focus", event, this._getSelectedItem() );
}
this.menu.menu( key, event );
if ( !this.isOpen ) {
this.menu.menu( "select", event );
}
// without this.active set, first and last item are triggered
this.menu.menu( direction, event );
this.menu.menu( "select", event );
},
_getSelectedItem: function() {
@ -317,47 +315,55 @@ $.widget( "ui.selectmenu", {
event.preventDefault();
},
keydown: function( event ) {
var prevDef = true;
switch (event.keyCode) {
case $.ui.keyCode.TAB:
if ( this.isOpen ) {
this.close( event );
}
prevDef = false;
break;
case $.ui.keyCode.ENTER:
if ( this.isOpen ) {
this.menu.menu( "select", this._getSelectedItem() );
}
event.preventDefault();
break;
case $.ui.keyCode.SPACE:
event.preventDefault();
break;
case $.ui.keyCode.UP:
if ( event.altKey ) {
this._toggle( event );
} else {
this._move( "previous", event );
this._move( event, "previous", true );
}
event.preventDefault();
break;
case $.ui.keyCode.DOWN:
if ( event.altKey ) {
this._toggle( event );
} else {
this._move( "next", event );
this._move( event, "next", true );
}
event.preventDefault();
break;
case $.ui.keyCode.LEFT:
this._move( "previous", event );
event.preventDefault();
this._move( event, "previous", true );
break;
case $.ui.keyCode.RIGHT:
this._move( "next", event );
event.preventDefault();
this._move( event, "next", true );
break;
case $.ui.keyCode.HOME:
case $.ui.keyCode.PAGE_UP:
this._move( event, "next" );
break;
case $.ui.keyCode.END:
case $.ui.keyCode.PAGE_DOWN:
this._move( event, "previous" );
break;
default:
this.menu.trigger( event );
prevDef = false;
}
if ( prevDef ) {
event.preventDefault();
}
}
},