/**
 * Component layout for editors
 * @private
 */
Ext.define('Ext.layout.container.Editor', {
 
    /* Begin Definitions */
 
    alias: 'layout.editor',
 
    extend: 'Ext.layout.container.Container',
 
    /* End Definitions */
 
    autoSizeDefault: {
        width: 'field',
        height: 'field'    
    },
 
    sizePolicies: {
        // indexed by autoSize.width 
        $: {
            // indexed by autoSize.height 
            $: {
                readsWidth: 1,
                readsHeight: 1,
                setsWidth: 0,
                setsHeight: 0
            },
            boundEl: {
                readsWidth: 1,
                readsHeight: 0,
                setsWidth: 0,
                setsHeight: 1
            }
        },
 
        boundEl: {
            // indexed by autoSize.height 
            $: {
                readsWidth: 0,
                readsHeight: 1,
                setsWidth: 1,
                setsHeight: 0
            },
            boundEl: {
                readsWidth: 0,
                readsHeight: 0,
                setsWidth: 1,
                setsHeight: 1
            }
        }
    },
 
    getItemSizePolicy: function (item) {
        var me = this,
            autoSize = me.owner.autoSize,
            key = autoSize && autoSize.width,
            policy = me.sizePolicies;
 
        policy = policy[key] || policy.$;
 
        key = autoSize && autoSize.height;
        policy = policy[key] || policy.$;
 
        return policy;
    },
 
    calculate: function(ownerContext) {
        var me = this,
            owner = me.owner,
            autoSize = owner.autoSize,
            fieldWidth,
            fieldHeight;
            
        if (autoSize === true) {
            autoSize = me.autoSizeDefault;
        }
 
        // Calculate size of both Editor, and its owned Field 
        if (autoSize) {
            fieldWidth  = me.getDimension(owner, autoSize.width,  'getWidth',  owner.width);
            fieldHeight = me.getDimension(owner, autoSize.height, 'getHeight', owner.height);
        }
 
        // Set Field size 
        ownerContext.childItems[0].setSize(fieldWidth, fieldHeight);
 
        // Bypass validity checking. Container layouts should not usually set their owner's size. 
        ownerContext.setWidth(fieldWidth);
        ownerContext.setHeight(fieldHeight);
 
        // This is a Container layout, so publish content size 
        ownerContext.setContentSize(fieldWidth || owner.field.getWidth(),
                                    fieldHeight || owner.field.getHeight());
    },
 
    getDimension: function(owner, type, getMethod, ownerSize){
        switch (type) {
            // Size to boundEl's dimension 
            case 'boundEl':
                return owner.boundEl[getMethod]();
 
            // Auto size (shrink wrap the Field's size 
            case 'field':
                return undefined;
 
            // Size to the Editor's configured size 
            default:
                return ownerSize;
        }
    }
});