104 lines
3.0 KiB
JavaScript
104 lines
3.0 KiB
JavaScript
define("dojox/treemap/Keyboard", ["dojo/_base/array", "dojo/_base/lang", "dojo/_base/event", "dojo/_base/declare", "dojo/on", "dojo/keys", "dojo/dom-attr",
|
|
"./_utils", "dijit/_FocusMixin"],
|
|
function(arr, lang, event, declare, on, keys, domAttr, utils, _FocusMixin){
|
|
|
|
return declare("dojox.treemap.Keyboard", _FocusMixin, {
|
|
// summary:
|
|
// Specializes TreeMap to support keyboard navigation and accessibility.
|
|
|
|
// tabIndex: String
|
|
// Order fields are traversed when user hits the tab key
|
|
tabIndex: "0",
|
|
_setTabIndexAttr: "domNode",
|
|
|
|
constructor: function(){
|
|
},
|
|
|
|
postCreate: function(){
|
|
this.inherited(arguments);
|
|
this._keyDownHandle = on(this.domNode, "keydown", lang.hitch(this, this._onKeyDown));
|
|
this._mouseDownHandle = on(this.domNode, "mousedown", lang.hitch(this, this._onMouseDown));
|
|
},
|
|
|
|
destroy: function(){
|
|
this.inherited(arguments);
|
|
this._keyDownHandle.remove();
|
|
this._mouseDownHandle.remove();
|
|
},
|
|
|
|
createRenderer: function(item, level, kind){
|
|
var renderer = this.inherited(arguments);
|
|
// on Firefox we need a tabindex on sub divs to let the keyboard event be dispatched
|
|
// put -1 so that it is not tablable
|
|
domAttr.set(renderer, "tabindex", "-1");
|
|
return renderer;
|
|
},
|
|
|
|
_onMouseDown: function(e){
|
|
this.domNode.focus();
|
|
},
|
|
|
|
_onKeyDown: function(e){
|
|
var selected = this.get("selectedItem");
|
|
if(!selected){
|
|
// nothing selected selected we can't navigate
|
|
return;
|
|
}
|
|
var renderer = this.itemToRenderer[this.getIdentity(selected)];
|
|
var parent = renderer.parentItem;
|
|
var children, childrenI, selectedI;
|
|
// we also need items to be sorted out
|
|
if(e.keyCode != keys.UP_ARROW && e.keyCode != keys.NUMPAD_MINUS &&
|
|
e.keyCode != keys.NUMPAD_PLUS){
|
|
children = (e.keyCode == keys.DOWN_ARROW)?selected.children:parent.children;
|
|
if(children){
|
|
childrenI = utils.initElements(children, lang.hitch(this,
|
|
this._computeAreaForItem)).elements;
|
|
selectedI = childrenI[arr.indexOf(children, selected)];
|
|
childrenI.sort(function(a, b){
|
|
return b.size - a.size;
|
|
});
|
|
}else{
|
|
return;
|
|
}
|
|
}
|
|
var newSelected;
|
|
switch(e.keyCode){
|
|
case keys.LEFT_ARROW:
|
|
newSelected = children[childrenI[Math.max(0, arr.indexOf(childrenI, selectedI)-1)].index];
|
|
break;
|
|
case keys.RIGHT_ARROW:
|
|
newSelected = children[childrenI[Math.min(childrenI.length-1, arr.indexOf(childrenI, selectedI)+1)].index];
|
|
break;
|
|
case keys.DOWN_ARROW:
|
|
newSelected = children[childrenI[0].index];
|
|
break;
|
|
case keys.UP_ARROW:
|
|
newSelected = parent;
|
|
break;
|
|
// TODO
|
|
//case "+":
|
|
case keys.NUMPAD_PLUS:
|
|
if(!this._isLeaf(selected) && this.drillDown){
|
|
this.drillDown(renderer);
|
|
event.stop(e);
|
|
}
|
|
break;
|
|
// TODO
|
|
//case "-":
|
|
case keys.NUMPAD_MINUS:
|
|
if(!this._isLeaf(selected) && this.drillUp){
|
|
this.drillUp(renderer);
|
|
event.stop(e);
|
|
}
|
|
break;
|
|
}
|
|
if(newSelected){
|
|
if(!this._isRoot(newSelected)){
|
|
this.set("selectedItem", newSelected);
|
|
event.stop(e);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}); |