Ext.DataViewSelectionModel = Ext.extend(Ext.AbstractStoreSelectionModel, { deselectOnContainerClick: true, bindComponent: function(view) { this.view = view; this.bind(view.getStore()); var eventListeners = { refresh: this.refresh, scope: this, el: { scope: this } }; eventListeners.el[view.triggerEvent] = this.onItemClick; eventListeners.el[view.triggerCtEvent] = this.onContainerClick; view.on(eventListeners); }, onItemClick: function(e) { var view = this.view, node = view.findTargetByEvent(e); if (node) { this.selectWithEvent(view.getRecord(node), e); } else { return false; } }, onContainerClick: function() { if (this.deselectOnContainerClick) { this.deselectAll(); } }, // Allow the DataView to update the ui onSelectChange: function(record, isSelected, suppressEvent) { var view = this.view; if (isSelected) { view.onItemSelect(record); if (!suppressEvent) { this.fireEvent('select', this, record); } } else { view.onItemDeselect(record); if (!suppressEvent) { this.fireEvent('deselect', this, record); } } } });