/** * Adds custom behavior for left/right keyboard navigation for use with a tree. * Depends on the view having an expand and collapse method which accepts a * record. * * @private */ Ext.define('Ext.selection.TreeModel', { extend: 'Ext.selection.RowModel', alias: 'selection.treemodel', // typically selection models prune records from the selection // model when they are removed, because the TreeView constantly // adds/removes records as they are expanded/collapsed pruneRemoved: false, onKeyRight: function(e, t) { var focused = this.getLastFocused(), view = this.view; if (focused) { // tree node is already expanded, go down instead // this handles both the case where we navigate to firstChild and if // there are no children to the nextSibling if (focused.isExpanded()) { this.onKeyDown(e, t); // if its not a leaf node, expand it } else if (!focused.isLeaf()) { view.expand(focused); } } }, onKeyLeft: function(e, t) { var focused = this.getLastFocused(), view = this.view, viewSm = view.getSelectionModel(), parentNode, parentRecord; if (focused) { parentNode = focused.parentNode; // if focused node is already expanded, collapse it if (focused.isExpanded()) { view.collapse(focused); // has a parentNode and its not root // TODO: this needs to cover the case where the root isVisible } else if (parentNode && !parentNode.isRoot()) { // Select a range of records when doing multiple selection. if (e.shiftKey) { viewSm.selectRange(parentNode, focused, e.ctrlKey, 'up'); viewSm.setLastFocused(parentNode); // just move focus, not selection } else if (e.ctrlKey) { viewSm.setLastFocused(parentNode); // select it } else { viewSm.select(parentNode); } } } }, onKeyPress: function(e, t) { var key = e.getKey(), selected, checked; if (key === e.SPACE || key === e.ENTER) { e.stopEvent(); selected = this.getLastSelected(); if (selected) { this.view.onCheckChange(selected); } } else { this.callParent(arguments); } } });