3 This file is part of Ext JS 4
5 Copyright (c) 2011 Sencha Inc
7 Contact: http://www.sencha.com/contact
9 GNU General Public License Usage
10 This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
12 If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
16 * @class Ext.selection.DataViewModel
19 Ext.define('Ext.selection.DataViewModel', {
20 extend: 'Ext.selection.Model',
22 requires: ['Ext.util.KeyNav'],
24 deselectOnContainerClick: true,
27 * @cfg {Boolean} enableKeyNav
29 * Turns on/off keyboard navigation within the DataView.
33 constructor: function(cfg){
36 * @event beforedeselect
37 * Fired before a record is deselected. If any listener returns false, the
38 * deselection is cancelled.
39 * @param {Ext.selection.DataViewModel} this
40 * @param {Ext.data.Model} record The deselected record
46 * Fired before a record is selected. If any listener returns false, the
47 * selection is cancelled.
48 * @param {Ext.selection.DataViewModel} this
49 * @param {Ext.data.Model} record The selected record
55 * Fired after a record is deselected
56 * @param {Ext.selection.DataViewModel} this
57 * @param {Ext.data.Model} record The deselected record
63 * Fired after a record is selected
64 * @param {Ext.selection.DataViewModel} this
65 * @param {Ext.data.Model} record The selected record
69 this.callParent(arguments);
72 bindComponent: function(view) {
80 me.bind(view.getStore());
82 view.on(view.triggerEvent, me.onItemClick, me);
83 view.on(view.triggerCtEvent, me.onContainerClick, me);
85 view.on(eventListeners);
87 if (me.enableKeyNav) {
92 onItemClick: function(view, record, item, index, e) {
93 this.selectWithEvent(record, e);
96 onContainerClick: function() {
97 if (this.deselectOnContainerClick) {
102 initKeyNav: function(view) {
105 if (!view.rendered) {
106 view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true});
113 me.keyNav = Ext.create('Ext.util.KeyNav', view.el, {
114 down: Ext.pass(me.onNavKey, [1], me),
115 right: Ext.pass(me.onNavKey, [1], me),
116 left: Ext.pass(me.onNavKey, [-1], me),
117 up: Ext.pass(me.onNavKey, [-1], me),
122 onNavKey: function(step) {
126 selected = me.getSelection()[0],
127 numRecords = me.view.store.getCount(),
131 idx = view.indexOf(view.getNode(selected)) + step;
137 idx = numRecords - 1;
138 } else if (idx >= numRecords) {
145 // Allow the DataView to update the ui
146 onSelectChange: function(record, isSelected, suppressEvent, commitFn) {
149 eventName = isSelected ? 'select' : 'deselect';
151 if ((suppressEvent || me.fireEvent('before' + eventName, me, record)) !== false &&
152 commitFn() !== false) {
155 view.onItemSelect(record);
157 view.onItemDeselect(record);
160 if (!suppressEvent) {
161 me.fireEvent(eventName, me, record);
167 Ext.destroy(this.keyNav);