/**
 * This plugin allows users to change summaries on grid columns using:
 *
 * - a context menu on the summary row cell
 * - a header menu entry
 *
 * On each column of the grid you can define what summary functions are available
 * to the user by configuring {@link Ext.grid.column.Column#summaries}. They will
 * be displayed
 */
Ext.define('Ext.grid.plugin.Summaries', {
    extend: 'Ext.grid.plugin.BaseSummaries',
 
    alias: 'plugin.gridsummaries',
 
    /**
     *  `"both"` (the default) - The plugin is added to both grids
     *  `"top"` - The plugin is added to the containing Panel
     *  `"locked"` - The plugin is added to the locked (left) grid
     *  `"normal"` - The plugin is added to the normal (right) grid
     *
     * @private
     */
    lockableScope: 'top',
 
    gridListeners: {
        groupcontextmenu: 'onGroupContextMenu',
        groupsummarycontextmenu: 'onGroupSummaryContextMenu',
        summarycontextmenu: 'onSummaryContextMenu',
        collectheadermenuitems: 'onCollectMenuItems',
        showheadermenuitems: 'onShowHeaderMenu'
    },
 
    onGroupContextMenu: function(grid, params) {
        var pos = params.feature.groupSummaryPosition,
            group = params.group;
 
        if (pos === 'hide') {
            return;
        }
 
        if (pos === 'top' || (group && group.isCollapsed && pos === 'bottom') || params.isSummary) {
            this.showMenu(params);
        }
    },
 
    onGroupSummaryContextMenu: function(grid, params) {
        this.showMenu(params);
    },
 
    onSummaryContextMenu: function(grid, params) {
        this.showMenu(params);
    },
 
    canShowMenu: function(params) {
        var groupIndex = params.feature.groupingColumn && params.feature.groupingColumn.getIndex();
 
        return this.callParent([params]) && !(groupIndex >= 0 &&
            groupIndex >= params.column.getIndex());
    },
 
    onCollectMenuItems: function(grid, params) {
        params.items.push({
            text: this.summaryText,
            itemId: 'summaryMenuItem',
            iconCls: Ext.baseCSSPrefix + 'summaries-icon'
        });
    },
 
    onShowHeaderMenu: function(grid, params) {
        var menuItem = params.menu.down('#summaryMenuItem');
 
        if (!menuItem) {
            return;
        }
 
        menuItem.setVisible(!params.column.isGroupsColumn);
        menuItem.setMenu(this.getSummaryMenu(params.column));
    }
 
});