/**
 * This plugin ensures that its associated grid or tree always has a selection record. The
 * only exception is, of course, when there are no records in the store.
 * @since 6.0.2
 */
Ext.define('Ext.ux.grid.plugin.AutoSelector', {
    extend: 'Ext.plugin.Abstract',
 
    alias: 'plugin.gridautoselector',
 
    config: {
        store: null
    },
 
    init: function(grid) {
        var me = this;
 
        //<debug>
        if (!grid.isXType('tablepanel')) {
            Ext.raise('The gridautoselector plugin is designed only for grids and trees');
        }
        //</debug>
 
        me.grid = grid;
 
        me.watchGrid();
 
        grid.on({
            reconfigure: me.watchGrid,
            scope: me
        });
    },
 
    destroy: function() {
        this.setStore(null);
        this.grid = null;
 
        this.callParent();
    },
 
    ensureSelection: function() {
        var grid = this.grid,
            store = grid.getStore(),
            selection;
 
        if (store.getCount()) {
            selection = grid.getSelection();
 
            if (!selection || !selection.length) {
                grid.getSelectionModel().select(0);
            }
        }
    },
 
    watchGrid: function() {
        this.setStore(this.grid.getStore());
        this.ensureSelection();
    },
 
    updateStore: function(store) {
        var me = this;
 
        Ext.destroy(me.storeListeners);
 
        me.storeListeners = store && store.on({
            // We could go from 0 records to 1+ records... now we can select one!
            add: me.ensureSelection,
            // We might remove the selected record...
            remove: me.ensureSelection,
 
            destroyable: true,
            scope: me
        });
    }
});