Introduces abstract superclass of all keyboard navigatable objects.

This commit is contained in:
zorkow 2015-08-21 05:34:13 +01:00
parent 85c1801fba
commit 70da9faa90

View File

@ -205,11 +205,55 @@
KEY = MathJax.Extension.MathEvents.Event.KEY; KEY = MathJax.Extension.MathEvents.Event.KEY;
}); });
/*************************************************************/
/*
* Abstract class of all keyboard navigatable objects.
*/
var NAV = MathJax.Object.Subclass({
/*
* Moving in the list of items.
*/
Keydown: function(event, menu) {
switch (event.keyCode) {
case KEY.ESCAPE:
this.Remove(event, menu);
break;
case KEY.RIGHT:
this.Right(event, menu);
break;
case KEY.LEFT:
this.Left(event, menu);
break;
case KEY.UP:
this.Up(event, menu);
break;
case KEY.DOWN:
this.Down(event, menu);
break;
case KEY.RETURN:
case KEY.SPACE:
this.Space(event, menu);
break;
default:
break;
}
return FALSE(event);
},
Escape: function(event, menu) { },
Right: function(event, menu) { },
Left: function(event, menu) { },
Up: function(event, menu) { },
Down: function(event, menu) { },
Space: function(event, menu) { }
}, {});
/*************************************************************/ /*************************************************************/
/* /*
* The main menu class * The main menu class
*/ */
var MENU = MathJax.Menu = MathJax.Object.Subclass({ var MENU = MathJax.Menu = NAV.Subclass({
version: VERSION, version: VERSION,
items: [], items: [],
posted: false, posted: false,
@ -342,38 +386,6 @@
return null; return null;
}, },
/*
* Moving in the list of items.
*/
Keydown: function(event, menu) {
if (!this.posted) {
return FALSE(event);
}
switch (event.keyCode) {
case KEY.ESCAPE:
this.Remove(event, menu);
break;
case KEY.RIGHT:
this.Right(event, menu);
break;
case KEY.LEFT:
this.Left(event, menu);
break;
case KEY.UP:
this.Up(event, menu);
break;
case KEY.DOWN:
this.Down(event, menu);
break;
case KEY.RETURN:
case KEY.SPACE:
this.Space(event, menu);
break;
default:
break;
}
return FALSE(event);
},
Right: function(event, menu) { Right: function(event, menu) {
MENU.Right(event, menu); MENU.Right(event, menu);
}, },
@ -385,10 +397,10 @@
item.Activate(item.GetNode()); item.Activate(item.GetNode());
}, },
Down: function(event, menu) { Down: function(event, menu) {
console.log('In menu');
var item = this.items[0]; var item = this.items[0];
item.Activate(item.GetNode()); item.Activate(item.GetNode());
}, }
Space: function(event, menu) { }
},{ },{
config: CONFIG, config: CONFIG,
@ -410,6 +422,7 @@
return MENU.Event(event,this.menu||this.parentNode,(this.menu?"Touchend":"Remove")); return MENU.Event(event,this.menu||this.parentNode,(this.menu?"Touchend":"Remove"));
}, },
Event: function (event,menu,type,force) { Event: function (event,menu,type,force) {
console.log(type);
if (MENU.skipMouseover && type === "Mouseover" && !force) {return FALSE(event)} if (MENU.skipMouseover && type === "Mouseover" && !force) {return FALSE(event)}
if (MENU.skipUp) { if (MENU.skipUp) {
if (type.match(/Mouseup|Touchend/)) {delete MENU.skipUp; return FALSE(event)} if (type.match(/Mouseup|Touchend/)) {delete MENU.skipUp; return FALSE(event)}
@ -418,6 +431,8 @@
} }
if (!event) {event = window.event} if (!event) {event = window.event}
var item = menu.menuItem; var item = menu.menuItem;
console.log(item);
console.log(item[type]);
if (item && item[type]) {return item[type](event,menu)} if (item && item[type]) {return item[type](event,menu)}
return null; return null;
}, },
@ -460,7 +475,6 @@
} }
}, },
/*************************************************************/ /*************************************************************/
/* /*
* Keyboard navigation of menu. * Keyboard navigation of menu.
@ -537,7 +551,7 @@
MENU.Move(event, menu, function(x) {return x - 1;}); MENU.Move(event, menu, function(x) {return x - 1;});
}, },
//TODO: Helper. To move //TODO: Move to utility class.
// Computes a mod n. // Computes a mod n.
Mod: function(a, n) { Mod: function(a, n) {
return ((a % n) + n) % n; return ((a % n) + n) % n;
@ -548,11 +562,13 @@
}); });
MathJax.Menu.NAV = NAV;
/*************************************************************/ /*************************************************************/
/* /*
* Abstract class of menu items. * Abstract class of menu items.
*/ */
var ITEM = MENU.ITEM = MathJax.Object.Subclass({ var ITEM = MENU.ITEM = NAV.Subclass({
name: "", // The menu item's label as [id,label] pair. name: "", // The menu item's label as [id,label] pair.
node: null, // The HTML node of the item. node: null, // The HTML node of the item.
@ -676,32 +692,6 @@
} }
return def; return def;
}, },
Keydown: function(event, item) {
switch (event.keyCode) {
case KEY.ESCAPE:
this.Remove(event, item);
break;
case KEY.UP:
this.Up(event, item);
break;
case KEY.DOWN:
this.Down(event, item);
break;
case KEY.RIGHT:
this.Right(event, item);
break;
case KEY.LEFT:
this.Left(event, item);
break;
case KEY.SPACE:
case KEY.RETURN:
this.Space(event, item);
break;
default:
break;
}
return FALSE(event);
},
Move: function(event, item, move) { Move: function(event, item, move) {
var items = this.menu.menuItem.items; var items = this.menu.menuItem.items;
var len = items.length; var len = items.length;
@ -720,6 +710,7 @@
this.Move(event, item, function(x) { return x - 1; }); this.Move(event, item, function(x) { return x - 1; });
}, },
Down: function(event, item) { Down: function(event, item) {
console.log('?????');
this.Move(event, item, function(x) { return x + 1; }); this.Move(event, item, function(x) { return x + 1; });
}, },
Right: function(event, item) { Right: function(event, item) {