<?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 the anchor button on a Spark DropDownList component.  

@see spark.components.DropDownList        
@see spark.skins.spark.DropDownListSkin

@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
			 xmlns:fb="http://ns.adobe.com/flashbuilder/2009" minWidth="19" minHeight="23">
	
	<fx:Metadata>
		<![CDATA[ 
		/** 
		* @copy spark.skins.spark.ApplicationSkin#hostComponent
		*/
		[HostComponent("spark.components.Button")]
		]]>
	</fx:Metadata> 
	
	<fx:Script fb:purpose="styling">
		<![CDATA[
			import flatspark.utils.AwesomeUtils;
			import flatspark.utils.ColorUtils;
			
			/* Define the skin elements that should not be colorized. 
			For dropDownList buttons, the graphics are colorized but the arrow is not. */
			static private const exclusions:Array = [];
			
			/**
			 * @private
			 */  
			override public function get colorizeExclusions():Array {return exclusions;}
			
			/* Define the symbol fill items that should be colored by the "symbolColor" style. */
			static private const symbols:Array = [];
			
			/**
			 * @private
			 */
			override public function get symbolItems():Array {return symbols};
			
			/**
			 * @private
			 */
			override protected function initializationComplete():void
			{
				useChromeColor = true;
				super.initializationComplete();
			}
			
			/**
			 *  @private
			 */
			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
			{				
				fill.radiusX = cornerRadius;
				
				super.updateDisplayList(unscaledWidth, unscaledHeight);
			}
			
			private var cornerRadius:Number = 4;
			
		]]>
	</fx:Script>
	
	<!-- states -->
	<s:states>
		<s:State name="up" />
		<s:State name="over" />
		<s:State name="down" />
		<s:State name="disabled" />
	</s:states>
	
	<!-- layer 1: fill -->
	<!--- @private -->
	<s:Rect id="fill" left="0" right="0" top="0" bottom="0">
		<s:fill>
			<s:SolidColor color="{ColorUtils.Turquoise}" />
		</s:fill>
	</s:Rect>
	
	<!--- The arrow graphic displayed in the anchor button. -->
	<s:Label right="17" top="6" fontFamily="FontAwesome" fontSize="19" color="#FFFFFF" text="{AwesomeUtils.fa_caret_down}" includeIn="up, down, over, disabled"
			 itemCreationPolicy="immediate" verticalAlign="middle" verticalCenter="0" />
</s:SparkSkin>
