    /**
     * @private
     * Private Container class used by the {@link Ext.grid.RowEditor} to hold its buttons.
     */
    Ext.define('Ext.grid.RowEditorButtons', {
        extend: 'Ext.container.Container',
        alias: 'widget.roweditorbuttons',

        frame: true,
        shrinkWrap: true,
        position: 'bottom',

        constructor: function(config) {
            var me = this,
                rowEditor = config.rowEditor,
                cssPrefix = Ext.baseCSSPrefix,
                plugin = rowEditor.editingPlugin;

            config = Ext.apply({
                baseCls: cssPrefix + 'grid-row-editor-buttons',
                defaults: {
                    xtype: 'button',
                    ui: rowEditor.buttonUI,
                    scope: plugin,
                    flex: 1,
                    minWidth: Ext.panel.Panel.prototype.minButtonWidth
                },
                items: [{
                    cls: cssPrefix + 'row-editor-update-button',
                    itemId: 'update',
                    handler: plugin.completeEdit,
                    text: rowEditor.saveBtnText,
                    disabled: rowEditor.updateButtonDisabled
                }, {
                    cls: cssPrefix + 'row-editor-cancel-button',
                    handler: plugin.cancelEdit,
                    text: rowEditor.cancelBtnText
                }]
            }, config);

            me.callParent([config]);

            me.addClsWithUI(me.position);
        },

        setButtonPosition: function(position) {
            var me = this;

            me.removeClsWithUI(me.position);
            me.position = position;
            me.addClsWithUI(position);
        },

        getFramingInfoCls: function(){
            return this.baseCls + '-' + this.ui + '-' + this.position;
        },

        getFrameInfo: function() {
            var frameInfo = this.callParent();

            // Trick Renderable into rendering the top framing elements, even though they
            // are not needed in the default "bottom" position.  This allows us to flip the
            // buttons into "top" position without re-rendering.
            frameInfo.top = true;

            return frameInfo;
        }
    });