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

        // 
        // 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);
	}
    
    /**
     *  @private
     *  Default verticalAlign="top"
     */
    override mx_internal function getTextTop(unscaledHeight:Number, paddingTop:Number, paddingBottom:Number):Number
    {
        return paddingTop;
    }
    
    /**

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

use namespace mx_internal;

