diff --git a/core/toolbox.js b/core/toolbox.js index 16738a6e8..421a1af8e 100644 --- a/core/toolbox.js +++ b/core/toolbox.js @@ -536,6 +536,7 @@ Blockly.Toolbox.TreeControl.prototype.setSelectedItem = function(node) { Blockly.Toolbox.TreeNode = function(toolbox, html, opt_config, opt_domHelper) { goog.ui.tree.TreeNode.call(this, html, opt_config, opt_domHelper); if (toolbox) { + this.horizontalLayout_ = toolbox.horizontalLayout_; var resize = function() { // Even though the div hasn't changed size, the visible workspace // surface of the workspace has, so we may need to reposition everything. @@ -587,6 +588,28 @@ Blockly.Toolbox.TreeNode.prototype.onDoubleClick_ = function(e) { // NOP. }; +/** + * Remap event.keyCode in horizontalLayout so that arrow + * keys work properly and call original onKeyDown handler. + * @param {!goog.events.BrowserEvent} e The browser event. + * @return {boolean} The handled value. + * @override + * @private + */ +Blockly.Toolbox.TreeNode.prototype.onKeyDown = function(e) { + if (this.horizontalLayout_) { + var map = {}; + map[goog.events.KeyCodes.RIGHT] = goog.events.KeyCodes.DOWN; + map[goog.events.KeyCodes.LEFT] = goog.events.KeyCodes.UP; + map[goog.events.KeyCodes.UP] = goog.events.KeyCodes.LEFT; + map[goog.events.KeyCodes.DOWN] = goog.events.KeyCodes.RIGHT; + + var newKeyCode = map[e.keyCode]; + e.keyCode = newKeyCode || e.keyCode; + } + return Blockly.Toolbox.TreeNode.superClass_.onKeyDown.call(this, e); +}; + /** * A blank separator node in the tree. * @param {Object=} config The configuration for the tree. See