<?xml version="1.0" encoding="utf-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->


<!--- The default skin class for Spark TextArea component.  

@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
			 xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabledStates="0.5" blendMode="normal">
	
	<fx:Metadata>
		<![CDATA[ 
		/** 
		* @copy spark.skins.spark.ApplicationSkin#hostComponent
		*/
		[HostComponent("spark.components.TextArea")]
		]]>
	</fx:Metadata> 
	
	<fx:Script fb:purpose="styling">
		private var lineBreakChanged:Boolean;
		private var paddingChanged:Boolean;
		private var verticalAlignChanged:Boolean;
		

		
		/**
		 *  @private
		 */
		override protected function commitProperties():void
		{
			super.commitProperties();
			
			if (lineBreakChanged)
			{
				updateStringStyle("lineBreak");
				lineBreakChanged = false;
			}
			if (paddingChanged)
			{
				updatePadding();
				paddingChanged = false;
			}
			if (verticalAlignChanged)
			{
				updateStringStyle("verticalAlign");
				verticalAlignChanged = false;
			}
		}
		

		
		/**
		 *  @private
		 */
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			if (getStyle("borderVisible") == true)
			{
				border.visible = true;
				shadow.visible = true;
				background.left = background.top = background.right = background.bottom = 1;
				textDisplay.left = textDisplay.top = textDisplay.right = textDisplay.bottom = 1;
			}
			else
			{
				border.visible = false;
				shadow.visible = false;
				background.left = background.top = background.right = background.bottom = 0;
				textDisplay.left = textDisplay.top = textDisplay.right = textDisplay.bottom = 0;
			}
			
			borderStroke.color = getStyle("borderColor");
			borderStroke.alpha = getStyle("borderAlpha");
			
			super.updateDisplayList(unscaledWidth, unscaledHeight);
		}
		
		/**
		 *  @private
		 */
		private function updatePadding():void
		{
			if (!textDisplay)
				return;
			
			// Push padding styles into the textDisplay
			var padding:Number;
			
			padding = getStyle("paddingLeft");
			if (textDisplay.getStyle("paddingLeft") != padding)
				textDisplay.setStyle("paddingLeft", padding);
			
			padding = getStyle("paddingTop");
			if (textDisplay.getStyle("paddingTop") != padding)
				textDisplay.setStyle("paddingTop", padding);
			
			padding = getStyle("paddingRight");
			if (textDisplay.getStyle("paddingRight") != padding)
				textDisplay.setStyle("paddingRight", padding);
			
			padding = getStyle("paddingBottom");
			if (textDisplay.getStyle("paddingBottom") != padding)
				textDisplay.setStyle("paddingBottom", padding);
		}
		
		/**
		 *  @private
		 */
		private function updateStringStyle(styleName:String):void
		{
			if (!textDisplay)
				return;
			
			// Push style into the textDisplay
			var style:String;
			
			style = getStyle(styleName);
			if (textDisplay.getStyle(styleName) != style)
				textDisplay.setStyle(styleName, style);
		}
		
		/**
		 *  @private
		 */
		override public function styleChanged(styleProp:String):void
		{
			var allStyles:Boolean = !styleProp || styleProp == "styleName";
			
			super.styleChanged(styleProp);
			
			if (allStyles || styleProp.indexOf("lineBreak") == 0)
			{
				lineBreakChanged = true;
				invalidateProperties();
			}
			if (allStyles || styleProp.indexOf("padding") == 0)
			{
				paddingChanged = true;
				invalidateProperties();
			}
			if (allStyles || styleProp.indexOf("verticalAlign") == 0)
			{
				verticalAlignChanged = true;
				invalidateProperties();
			}
		}
	</fx:Script>
	
	<fx:Script>
		<![CDATA[
			/** 
			 * @private 
			 */     
			private static const focusExclusions:Array = ["textDisplay"];
			
			/**
			 *  @private
			 */
			override public function get focusSkinExclusions():Array { return focusExclusions;};
		]]>
	</fx:Script>
	
    <s:states>
        <s:State name="normal"/>
        <s:State name="disabled" stateGroups="disabledStates"/>
        <s:State name="normalWithPrompt"/>
        <s:State name="disabledWithPrompt" stateGroups="disabledStates"/>
    </s:states>
	
	<!-- border --> 
	<!--- @private -->
	<s:Rect id="border" left="0" right="0" top="0" bottom="0">
		<s:stroke>
			<s:SolidColorStroke id="borderStroke" weight="1" color="0x82826b"/>            
		</s:stroke>
	</s:Rect>
	
	<!-- fill -->
	<!--- Defines the appearance of the TextArea component's background. -->
	<s:Rect id="background" left="1" right="1" top="1" bottom="1">
		<s:fill>
			<!--- @private Defines the background fill color. -->
			<s:SolidColor id="bgFill" color="0xf3f4de" />
		</s:fill>
	</s:Rect>
	
	<!-- shadow -->
	<!--- @private -->
	<s:Rect id="shadow" left="1" top="1" right="1" height="1">
		<s:fill>
			<s:SolidColor color="0x000000" alpha="0.12" />
		</s:fill>
	</s:Rect>
	
	<!--- Defines the scroller used to scroll the TextArea. -->
	<s:Scroller id="scroller" left="0" top="0" right="0" bottom="0" minViewportInset="1" measuredSizeIncludesScrollBars="false">
		<!--- @copy spark.components.supportClasses.SkinnableTextBase#textDisplay -->
		<s:RichEditableText id="textDisplay"
							heightInLines="10"
							widthInChars="15" />
	</s:Scroller>
	
</s:Skin>
