/**
 * @class Ext.grid.feature.Feature
 * @extends Ext.util.Observable
 *
 * A feature is a type of plugin that is specific to the {@link Ext.grid.Panel}. It provides several
 * hooks that allows the developer to inject additional functionality at certain points throughout the
 * grid creation cycle. This class provides the base template methods that are available to the developer,
 * it should be extended.
 *
 * There are several built in features that extend this class, for example:
 *
 *  - {@link Ext.grid.feature.Grouping} - Shows grid rows in groups as specified by the {@link Ext.data.Store}
 *  - {@link Ext.grid.feature.RowBody} - Adds a body section for each grid row that can contain markup.
 *  - {@link Ext.grid.feature.Summary} - Adds a summary row at the bottom of the grid with aggregate totals for a column.
 *
 * ## Using Features
 * A feature is added to the grid by specifying it an array of features in the configuration:
 *
 *     var groupingFeature = Ext.create('Ext.grid.feature.Grouping');
 *     Ext.create('Ext.grid.Panel', {
 *         // other options
 *         features: [groupingFeature]
 *     });
 *
 * @abstract
 */

Ext.define('Ext.grid.feature.Feature', {
    extend
: 'Ext.util.Observable',
   
alias: 'feature.feature',
   
    isFeature
: true,
    disabled
: false,
   
    /**
     * @property {Boolean}
     * Most features will expose additional events, some may not and will
     * need to change this to false.
     */

    hasFeatureEvent
: true,
   
    /**
     * @property {String}
     * Prefix to use when firing events on the view.
     * For example a prefix of group would expose "groupclick", "groupcontextmenu", "groupdblclick".
     */

    eventPrefix
: null,
   
    /**
     * @property {String}
     * Selector used to determine when to fire the event with the eventPrefix.
     */

    eventSelector
: null,
   
    /**
     * @property {Ext.view.Table}
     * Reference to the TableView.
     */

    view
: null,
   
    /**
     * @property {Ext.grid.Panel}
     * Reference to the grid panel
     */

    grid
: null,
   
    /**
     * Most features will not modify the data returned to the view.
     * This is limited to one feature that manipulates the data per grid view.
     */

    collectData
: false,
       
    getFeatureTpl
: function() {
       
return '';
   
},
   
    /**
     * Abstract method to be overriden when a feature should add additional
     * arguments to its event signature. By default the event will fire:
     * - view - The underlying Ext.view.Table
     * - featureTarget - The matched element by the defined {@link eventSelector}
     *
     * The method must also return the eventName as the first index of the array
     * to be passed to fireEvent.
     */

    getFireEventArgs
: function(eventName, view, featureTarget) {
       
return [eventName, view, featureTarget];
   
},
   
    /**
     * Approriate place to attach events to the view, selectionmodel, headerCt, etc
     */

    attachEvents
: function() {
       
   
},
   
    getFragmentTpl
: function() {
       
return;
   
},
   
    /**
     * Allows a feature to mutate the metaRowTpl.
     * The array received as a single argument can be manipulated to add things
     * on the end/begining of a particular row.
     */

    mutateMetaRowTpl
: function(metaRowTplArray) {
       
   
},
   
    /**
     * Allows a feature to inject member methods into the metaRowTpl. This is
     * important for embedding functionality which will become part of the proper
     * row tpl.
     */

    getMetaRowTplFragments
: function() {
       
return {};
   
},

    getTableFragments
: function() {
       
return {};
   
},
   
    /**
     * Provide additional data to the prepareData call within the grid view.
     * @param {Object} data The data for this particular record.
     * @param {Number} idx The row index for this record.
     * @param {Ext.data.Model} record The record instance
     * @param {Object} orig The original result from the prepareData call to massage.
     */

    getAdditionalData
: function(data, idx, record, orig) {
       
return {};
   
},
   
    /**
     * Enable a feature
     */

    enable
: function() {
       
this.disabled = false;
   
},
   
    /**
     * Disable a feature
     */

    disable
: function() {
       
this.disabled = true;
   
}
   
});