/**
 * @private
 * A set of overrides required by the presence of the BufferedRenderer plugin.
 * 
 * These overrides of Ext.view.Table take into account the affect of a buffered renderer and
 * divert execution from the default course where necessary.
 */
Ext.define('Ext.grid.plugin.BufferedRendererTableView', {
    override: 'Ext.view.Table',

    // Listener function for the Store's add event
    onAdd: function(store, records, index) {
        var bufferedRenderer = this.bufferedRenderer,
            rows = this.all;

        // The newly added records will put us over the buffered view size, so we cannot just add as normal.
        if (bufferedRenderer && (rows.getCount() + records.length) > bufferedRenderer.viewSize) {

            // Index puts the new row(s) in the visible area, then we have to refresh the view
            if (index < rows.startIndex + bufferedRenderer.viewSize && (index + records.length) > rows.startIndex) {
                this.onDataRefresh();
            }
            // New rows outside of visible area, just ensure that the scroll range is updated
            else {
                bufferedRenderer.stretchView(this, bufferedRenderer.getScrollHeight());
            }
        }
        // No BufferedRenderer present
        // or
        // View has not yet reached the viewSize: we can add as normal.
        else {
            this.callParent([store, records, index]);
        }
    },

    // Listener function for the Store's bulkremove event
    onRemove: function(store, records, indices) {

        // If there's a BufferedRenderer, the view must refresh to keep the view correct
        if (this.bufferedRenderer) {
            this.onDataRefresh();
        }
        // No BufferedRenderer present
        // or
        // View has not yet reached the viewSize: we can add as normal.
        else {
            this.callParent([store, records, indices]);
        }
    }
});