diff options
Diffstat (limited to 'js/dojo-1.7.2/dojox/geo/charting/KeyboardInteractionSupport.js')
| -rw-r--r-- | js/dojo-1.7.2/dojox/geo/charting/KeyboardInteractionSupport.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/geo/charting/KeyboardInteractionSupport.js b/js/dojo-1.7.2/dojox/geo/charting/KeyboardInteractionSupport.js new file mode 100644 index 0000000..ef3e887 --- /dev/null +++ b/js/dojo-1.7.2/dojox/geo/charting/KeyboardInteractionSupport.js @@ -0,0 +1,145 @@ +//>>built +define("dojox/geo/charting/KeyboardInteractionSupport", ["dojo/_base/lang","dojo/_base/declare","dojo/_base/event","dojo/_base/connect", + "dojo/_base/html","dojo/dom","dojox/lang/functional","dojo/keys"], + function(lang, declare, event, connect, html, dom, functional, keys) { + +return declare("dojox.geo.charting.KeyboardInteractionSupport", null, { + // summary: + // class to handle keyboard interactions on a dojox.geo.charting.Map widget + // + // The sections on the leading edge should receive the focus in response to a TAB event. + // Then use cursor keys to the peer sections. The cursor event should go the adjacent section + // in that direction. With the focus, the section zooms in upon SPACE. The map should zoom out + // on ESC. Finally, while it has the focus, the map should lose the focus on TAB. + // tags: + // private + _map: null, + _zoomEnabled: false, + + constructor: function(map, options){ + // summary: + // Constructs a new _KeyboardInteractionSupport instance + // map: dojox.geo.charting.Map + // the Map widget this class provides touch navigation for. + this._map = map; + if(options){ + this._zoomEnabled = options.enableZoom; + } + }, + connect: function(){ + // summary: + // connects this keyboard support class to the Map component + var container = dom.byId(this._map.container); + // tab accessing enable + html.attr(container, { + tabindex: 0, + role: "presentation", + "aria-label": "map" + }); + // install listeners + this._keydownListener = connect.connect(container, "keydown", this, "keydownHandler"); + this._onFocusListener = connect.connect(container, "focus", this, "onFocus"); + this._onBlurListener = connect.connect(container, "blur", this, "onBlur"); + }, + disconnect: function(){ + // summary: + // disconnects any installed listeners + connect.disconnect(this._keydownListener); + this._keydownListener = null; + connect.disconnect(this._onFocusListener); + this._onFocusListener = null; + connect.disconnect(this._onBlurListener); + this._onBlurListener = null + }, + keydownHandler: function(e){ + switch(e.keyCode){ + case keys.LEFT_ARROW: + this._directTo(-1,-1,1,-1); + break; + case keys.RIGHT_ARROW: + this._directTo(-1,-1,-1,1); + break; + case keys.UP_ARROW: + this._directTo(1,-1,-1,-1); + break; + case keys.DOWN_ARROW: + this._directTo(-1,1,-1,-1); + break; + case keys.SPACE: + if(this._map.selectedFeature && !this._map.selectedFeature._isZoomIn && this._zoomEnabled){ + this._map.selectedFeature._zoomIn(); + } + break; + case keys.ESCAPE: + if(this._map.selectedFeature && this._map.selectedFeature._isZoomIn && this._zoomEnabled){ + this._map.selectedFeature._zoomOut(); + } + break; + default: + return; + } + event.stop(e); + }, + onFocus: function(e){ + // select the leading region at the map center + if(this._map.selectedFeature || this._map.focused){return;} + this._map.focused = true; + var leadingRegion, + needClick = false; + if(this._map.lastSelectedFeature){ + leadingRegion = this._map.lastSelectedFeature; + }else{ + var mapCenter = this._map.getMapCenter(), + minDistance = Infinity; + // find the region most closing to the map center + functional.forIn(this._map.mapObj.features, function(feature){ + var distance = Math.sqrt(Math.pow(feature._center[0] - mapCenter.x, 2) + Math.pow(feature._center[1] - mapCenter.y, 2)); + if(distance < minDistance){ + minDistance = distance; + leadingRegion = feature; + } + }); + needClick = true; + } + if(leadingRegion){ + if(needClick) { + leadingRegion._onclickHandler(null); + }else{ + } + this._map.mapObj.marker.show(leadingRegion.id); + } + }, + onBlur: function(){ + this._map.lastSelectedFeature = this._map.selectedFeature; + }, + _directTo: function(up,down,left,right){ + var currentSelected = this._map.selectedFeature, + centerX = currentSelected._center[0], + centerY = currentSelected._center[1], + minMargin = Infinity, + nextSelected = null; + functional.forIn(this._map.mapObj.features, function(feature){ + var paddingX = Math.abs(centerX - feature._center[0]), + paddingY = Math.abs(centerY - feature._center[1]), + paddingSum = paddingX + paddingY; + if((up - down) * (centerY - feature._center[1]) > 0){ + if(paddingX < paddingY && minMargin > paddingSum){ + minMargin = paddingSum; + nextSelected = feature; + } + } + if((left - right) * (centerX - feature._center[0]) > 0){ + if(paddingX > paddingY && minMargin > paddingSum){ + minMargin = paddingSum; + nextSelected = feature; + } + } + }); + if(nextSelected){ + this._map.mapObj.marker.hide(); + nextSelected._onclickHandler(null); + this._map.mapObj.marker.show(nextSelected.id); + } + } +}); +});
\ No newline at end of file |
