/**
 * This abstract base class is used by grid filters that have a single
 * {@link Ext.data.Store#cfg-filters store filter}.
 * @protected
 */
Ext.define('Ext.grid.filters.filter.SingleFilter', {
    extend: 'Ext.grid.filters.filter.Base',
 
    constructor: function (config) {
        var me = this,
            filter, value;
 
        me.callParent([config]);
 
        value = me.value;
 
        filter = me.getStoreFilter();
 
        if (filter) {
            // This filter was restored from stateful filters on the store so enforce it as active. 
            me.active = true;
        } else {
            // Once we've reached this block, we know that this grid filter doesn't have a stateful filter, so if our 
            // flag to begin saving future filter mutations is set we know that any configured filter must be nulled 
            // out or it will replace our stateful filter. 
            if (me.grid.stateful && me.getGridStore().saveStatefulFilters) {
                value = undefined;
            }
 
            // TODO: What do we mean by value === null ? 
            me.active = me.getActiveState(config, value);
 
            // Now we're acting on user configs so let's not futz with any assumed settings. 
            filter = me.createFilter({
                operator: me.operator,
                value: value
            });
 
            if (me.active) {
                me.addStoreFilter(filter);
            }
        }
 
        if (me.active) {
            me.setColumnActive(true);
        }
 
        me.filter = filter;
    },
 
    activate: function (showingMenu) {
        if (showingMenu) {
            this.activateMenu();
        } else {
            this.addStoreFilter(this.filter);
        }
    },
 
    deactivate: function () {
        this.removeStoreFilter(this.filter);
    },
 
    getValue: function (field) {
        return field.getValue();
    },
 
    onFilterRemove: function () {
        // Filters can be removed at any time, even before a column filter's menu has been created (i.e., 
        // store.clearFilter()). 
        if (!this.menu || this.active) {
            this.active = false;
        }
    }
});