/** * @private * @class Ext.layout.component.field.Text * @extends Ext.layout.component.field.Field * Layout class for {@link Ext.form.field.Text} fields. Handles sizing the input field. */ Ext.define('Ext.layout.component.field.Text', { extend: 'Ext.layout.component.field.Field', alias: 'layout.textfield', requires: ['Ext.util.TextMetrics'], type: 'textfield', /** * Allow layout to proceed if the {@link Ext.form.field.Text#grow} config is enabled and the value has * changed since the last layout. */ beforeLayout: function(width, height) { var me = this, owner = me.owner, lastValue = this.lastValue, value = owner.getRawValue(); this.lastValue = value; return me.callParent(arguments) || (owner.grow && value !== lastValue); }, /** * Size the field body contents given the total dimensions of the bodyEl, taking into account the optional * {@link Ext.form.field.Text#grow} configurations. * @param {Number} width The bodyEl width * @param {Number} height The bodyEl height */ sizeBodyContents: function(width, height) { var size = this.adjustForGrow(width, height); this.setElementSize(this.owner.inputEl, size[0], size[1]); }, /** * Given the target bodyEl dimensions, adjust them if necessary to return the correct final * size based on the text field's {@link Ext.form.field.Text#grow grow config}. * @param {Number} width The bodyEl width * @param {Number} height The bodyEl height * @return {Number[]} [inputElWidth, inputElHeight] */ adjustForGrow: function(width, height) { var me = this, owner = me.owner, inputEl, value, calcWidth, result = [width, height]; if (owner.grow) { inputEl = owner.inputEl; // Find the width that contains the whole text value value = (inputEl.dom.value || (owner.hasFocus ? '' : owner.emptyText) || '') + owner.growAppend; calcWidth = inputEl.getTextWidth(value) + inputEl.getBorderWidth("lr") + inputEl.getPadding("lr"); // Constrain result[0] = Ext.Number.constrain(calcWidth, owner.growMin, Math.max(owner.growMin, Math.min(owner.growMax, Ext.isNumber(width) ? width : Infinity))); } return result; } });