| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-util-TextMetrics'>/**</span> * Provides precise pixel measurements for blocks of text so that you can determine exactly how high and * wide, in pixels, a given block of text will be. Note that when measuring text, it should be plain text and * should not contain any HTML, otherwise it may not be measured correctly. * * The measurement works by copying the relevant CSS styles that can affect the font related display,  * then checking the size of an element that is auto-sized. Note that if the text is multi-lined, you must  * provide a **fixed width** when doing the measurement. * * If multiple measurements are being done on the same element, you create a new instance to initialize  * to avoid the overhead of copying the styles to the element repeatedly. */Ext.define('Ext.util.TextMetrics', {    statics: {        shared: null,<span id='Ext-util-TextMetrics-static-method-measure'>        /**</span>         * Measures the size of the specified text         * @param {String/HTMLElement} el The element, dom node or id from which to copy existing CSS styles         * that can affect the size of the rendered text         * @param {String} text The text to measure         * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width         * in order to accurately measure the text height         * @return {Object} An object containing the text's size `{width: (width), height: (height)}`         * @static         */        measure: function(el, text, fixedWidth){            var me = this,                shared = me.shared;                        if(!shared){                shared = me.shared = new me(el, fixedWidth);            }            shared.bind(el);            shared.setFixedWidth(fixedWidth || 'auto');            return shared.getSize(text);        },        <span id='Ext-util-TextMetrics-static-method-destroy'>        /**</span>         * Destroy the TextMetrics instance created by {@link #measure}.         * @static         */        destroy: function(){            var me = this;            Ext.destroy(me.shared);            me.shared = null;        }    },    <span id='Ext-util-TextMetrics-method-constructor'>    /**</span>     * Creates new TextMetrics.     * @param {String/HTMLElement/Ext.Element} bindTo The element or its ID to bind to.     * @param {Number} [fixedWidth] A fixed width to apply to the measuring element.     */    constructor: function(bindTo, fixedWidth){        var measure = this.measure = Ext.getBody().createChild({            cls: Ext.baseCSSPrefix + 'textmetrics'        });        this.el = Ext.get(bindTo);                measure.position('absolute');        measure.setLeftTop(-1000, -1000);        measure.hide();        if (fixedWidth) {           measure.setWidth(fixedWidth);        }    },    <span id='Ext-util-TextMetrics-method-getSize'>    /**</span>     * Returns the size of the specified text based on the internal element's style and width properties     * @param {String} text The text to measure     * @return {Object} An object containing the text's size `{width: (width), height: (height)}`     */    getSize: function(text){        var measure = this.measure,            size;                measure.update(text);        size = measure.getSize();        measure.update('');        return size;    },    <span id='Ext-util-TextMetrics-method-bind'>    /**</span>     * Binds this TextMetrics instance to a new element     * @param {String/HTMLElement/Ext.Element} el The element or its ID.     */    bind: function(el){        var me = this;                me.el = Ext.get(el);        me.measure.setStyle(            me.el.getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')        );    },    <span id='Ext-util-TextMetrics-method-setFixedWidth'>    /**</span>     * Sets a fixed width on the internal measurement element.  If the text will be multiline, you have     * to set a fixed width in order to accurately measure the text height.     * @param {Number} width The width to set on the element     */     setFixedWidth : function(width){         this.measure.setWidth(width);     },     <span id='Ext-util-TextMetrics-method-getWidth'>     /**</span>      * Returns the measured width of the specified text      * @param {String} text The text to measure      * @return {Number} width The width in pixels      */     getWidth : function(text){         this.measure.dom.style.width = 'auto';         return this.getSize(text).width;     },     <span id='Ext-util-TextMetrics-method-getHeight'>     /**</span>      * Returns the measured height of the specified text      * @param {String} text The text to measure      * @return {Number} height The height in pixels      */     getHeight : function(text){         return this.getSize(text).height;     },     <span id='Ext-util-TextMetrics-method-destroy'>     /**</span>      * Destroy this instance      */     destroy: function(){         var me = this;         me.measure.remove();         delete me.el;         delete me.measure;     }}, function(){    Ext.Element.addMethods({<span id='Ext-dom-Element-method-getTextWidth'>        /**</span>         * Returns the width in pixels of the passed text, or the width of the text in this Element.         * @param {String} text The text to measure. Defaults to the innerHTML of the element.         * @param {Number} [min] The minumum value to return.         * @param {Number} [max] The maximum value to return.         * @return {Number} The text width in pixels.         * @member Ext.dom.Element         */        getTextWidth : function(text, min, max){            return Ext.Number.constrain(Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width, min || 0, max || 1000000);        }    });});</pre></body></html>
 |