/**
 * @private
 */
Ext.define('Ext.util.sizemonitor.OverflowChange', {

    extend: 'Ext.util.sizemonitor.Abstract',

    constructor: function(config) {
        this.onExpand = Ext.Function.bind(this.onExpand, this);
        this.onShrink = Ext.Function.bind(this.onShrink, this);

        this.callSuper(arguments);
    },

    getElementConfig: function() {
        return {
            reference: 'detectorsContainer',
            classList: ['x-size-monitors', 'overflowchanged'],
            children: [
                {
                    reference: 'expandMonitor',
                    className: 'expand',
                    children: [{
                        reference: 'expandHelper'
                    }]
                },
                {
                    reference: 'shrinkMonitor',
                    className: 'shrink',
                    children: [{
                        reference: 'shrinkHelper'
                    }]
                }
            ]
        }
    },

    bindListeners: function(bind) {
        var method = bind ? 'addEventListener' : 'removeEventListener';

        this.expandMonitor[method]('overflowchanged', this.onExpand, true);
        this.shrinkMonitor[method]('overflowchanged', this.onShrink, true);
    },

    onExpand: function(e) {
        if (e.horizontalOverflow && e.verticalOverflow) {
            return;
        }

        Ext.TaskQueue.requestRead('refresh', this);
    },

    onShrink: function(e) {
        if (!e.horizontalOverflow && !e.verticalOverflow) {
            return;
        }

        Ext.TaskQueue.requestRead('refresh', this);
    },

    refreshMonitors: function() {
        var expandHelper = this.expandHelper,
            shrinkHelper = this.shrinkHelper,
            width = this.contentWidth,
            height = this.contentHeight;

        if (expandHelper && !expandHelper.isDestroyed) {
            expandHelper.style.width = (width + 1) + 'px';
            expandHelper.style.height = (height + 1) + 'px';
        }
        if (shrinkHelper && !shrinkHelper.isDestroyed) {
            shrinkHelper.style.width = width + 'px';
            shrinkHelper.style.height = height + 'px';
        }

        Ext.TaskQueue.requestRead('refresh', this);
    }
});