     //  Constructor
     //
     //--------------------------------------------------------------------------
-
+    
     public function TextAreaSkin()
     {
         super();

import spark.skins.mobile.supportClasses.TextSkinBase;
import spark.skins.mobile160.assets.TextInput_border;
import spark.skins.mobile240.assets.TextInput_border;

use namespace mx_internal;


        // 
        // You can set an explicit width and the height will adjust accordingly. The opposite
        // is not true: setting an explicit height will not adjust the width accordingly.
        
        measuredWidth = layoutMeasuredWidth;
        
        // now we need to measure textDisplay's height.  Unfortunately, this is tricky and 
        // is dependent on textDisplay's width
        
        // if we have an estimated width, use it here.  Otherwise, we'll keep it 
        // the same width as it was before
        if (!isNaN(estimatedWidth))
            textDisplay.width = estimatedWidth - paddingTop - paddingBottom;
        
        measuredHeight = Math.max(layoutMeasuredHeight, getElementPreferredHeight(textDisplay) + paddingTop + paddingBottom);
    }
    
    /**
     *  @private
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10.2
     *  @playerversion AIR 2.0
     *  @productversion Flex 4.5
     */
    override public function setEstimatedSize(estimatedWidth:Number = NaN, 
                                              estimatedHeight:Number = NaN,
                                              invalidateSizeAllowed:Boolean = true):void
    {
        var oldcw:Number = this.estimatedWidth;
        var oldch:Number = this.estimatedHeight;
        
        super.setEstimatedSize(estimatedWidth, estimatedHeight, invalidateSizeAllowed);
        
        var sameWidth:Boolean = isNaN(estimatedWidth) && isNaN(oldcw) || estimatedWidth == oldcw;
        var sameHeight:Boolean = isNaN(estimatedHeight) && isNaN(oldch) || estimatedHeight == oldch;
        if (!(sameHeight && sameWidth))
        {
            if (!isNaN(explicitWidth) &&
                !isNaN(explicitHeight))
                return;
            
            if (invalidateSizeAllowed)
                invalidateSize();
        }
    }
    
    /**
     *  @private
     *  We override the setLayoutBoundsSize to determine whether to perform
     *  text reflow. This is a convenient place, as the layout passes NaN
     *  for a dimension not constrained to the parent.
     */
    override public function setLayoutBoundsSize(width:Number,
                                                 height:Number,
                                                 postLayoutTransform:Boolean = true):void
    {
        var newEstimates:Boolean = false;
        var cw:Number = estimatedWidth;
        var ch:Number = estimatedHeight;
        var oldcw:Number = cw;
        var oldch:Number = ch;
        // we got lied to, probably the constraints weren't accurate or
        // couldn't be computed
        if (!isNaN(width))
        {
            if (isNaN(estimatedWidth) || width != estimatedWidth)
            {
                cw = width;
                newEstimates = true;
            }
        }
        // we got lied to, probably the constraints weren't accurate or
        // couldn't be computed
        if (!isNaN(height))
        {
            if (isNaN(estimatedHeight) || height != estimatedHeight)
            {
                ch = height;
                newEstimates = true;
            }
        }
        if (newEstimates)
        {
            setEstimatedSize(cw, ch);
            
            // re-measure with the new estimated size
            UIComponentGlobals.layoutManager.validateClient(this, true);
            
            // set estimated size back to what it was
            setEstimatedSize(oldcw, oldch, false);
        }
        
        super.setLayoutBoundsSize(width, height, postLayoutTransform);
    }
    
    /**
