/**
 * A Cell subclass which renders a checkbox in each column cell which toggles the truthiness
 * of the associated data field on click.
 *
 * This class should not be directly instantiated.  Instances are created automatically
 * when using a {@link Ext.grid.column.Check Check Column}.
 */
Ext.define('Ext.grid.cell.Check', {
    extend: 'Ext.grid.cell.Base',
    xtype: 'checkcell',
 
    config: {
        /**
         * @cfg {Boolean} disabled
         * Whether or not this component is disabled
         */
        disabled: null
    },
 
    innerTemplate: [{
        reference: 'checkboxElement',
        tabIndex: -1,
        cls: Ext.baseCSSPrefix + 'checkbox-el ' + Ext.baseCSSPrefix + 'font-icon'
    }],
 
    classCls: Ext.baseCSSPrefix + 'checkcell',
 
    disabledCls: Ext.baseCSSPrefix + 'disabled',
    checkedCls: Ext.baseCSSPrefix + 'checked',
 
    constructor: function(config) {
        this.callParent([config]);
 
        this.checkboxElement.on('tap', 'onTap', this);
    },
 
    applyValue: function(value) {
        return !!value;
    },
 
    updateValue: function(value, oldValue) {
        var me = this,
            column = me.getColumn();
 
        me.el.toggleCls(me.checkedCls, !!value);
 
        // Keep column header state up to date.
        if (value) {
            column.updateHeaderState();
        }
        else {
            column.setHeaderStatus(value);
        }
    },
 
    updateColumn: function(column, oldColumn) {
        this.callParent([ column, oldColumn ]);
 
        if (column) {
            this.setDisabled(column.getDisabled());
        }
    },
 
    applyDisabled: function(disabled) {
        return Boolean(disabled);
    },
 
    updateDisabled: function(disabled) {
        this.element.toggleCls(this.disabledCls, disabled);
    },
 
    /**
     * Disables this CheckCell
     */
    disable: function() {
        this.setDisabled(true);
    },
 
    /**
     * Enables this CheckCell
     */
    enable: function() {
        this.setDisabled(false);
    },
 
    onTap: function(e) {
        var me = this,
            record = me.getRecord(),
            column = me.getColumn(),
            recordIndex = column.up('grid').getStore().indexOf(record),
            checked;
 
        if (record) {
            checked = !column.isRecordChecked(record);
 
            if (me.getDisabled()) {
                return;
            }
 
            if (
                column.fireEvent('beforecheckchange',
                                 me,
                                 recordIndex,
                                 checked,
                                 record,
                                 e) !== false
            ) {
                if (me.getColumn().getStopSelection()) {
                    e.stopSelection = true;
                }
 
                if (record) {
                    column.setRecordChecked(record, checked, e);
                }
 
                if (column.hasListeners.checkchange) {
                    column.fireEvent('checkchange', me, recordIndex, checked, record, e);
                }
            }
        }
    }
});