<?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 Spark DropDownList component. 
The skin for the anchor button for a DropDownList component 
is defined by the DropDownListButtonSkin class.  

<p>In a custom skin class that uses transitions, set the 
<code>itemDestructionPolicy</code> property to <code>never</code>
for the PopUpAnchor defined by the popUp property.</p>      

@see spark.components.DropDownList        
@see spark.skins.spark.DropDownListButtonSkin

@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"  height="41"
			 xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled=".5" initialize="initializeHandler(event)"> 
	
	<!-- host component -->
	<fx:Metadata>
		<![CDATA[ 
		/** 
		* @copy spark.skins.spark.ApplicationSkin#hostComponent
		*/
		[HostComponent("spark.components.DropDownList")]
		]]>
	</fx:Metadata> 
	
	<fx:Script fb:purpose="styling">
		<![CDATA[            
			import mx.events.FlexEvent;
			
			import flatspark.itemRenderers.DefaultItemRenderer;
			import flatspark.utils.ColorUtils;
			
			/* Define the content fill items that should be colored by the "contentBackgroundColor" style. */
			static private const contentFill:Array = [];
			
			/**
			 * @private
			 */
			override public function get contentItems():Array { return contentFill; }
			
			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
			{		
				//background.bottomRightRadiusX = background.topRightRadiusX = cornerRadius;

				
				super.updateDisplayList(unscaledWidth, unscaledHeight);
			}
			
			private var cornerRadius:Number = 4;
			
			protected function initializeHandler(event:FlexEvent):void
			{
				// TODO Auto-generated method stub
				hostComponent.useHandCursor=true;
				hostComponent.buttonMode=true;
			}
			
		]]>
	</fx:Script>
	
	<s:states>
		<s:State name="normal" />
		<s:State name="open" />
		<s:State name="disabled" />
	</s:states>
	
	<!--- 
	The PopUpAnchor control that opens the drop-down list. 
	
	<p>In a custom skin class that uses transitions, set the 
	<code>itemDestructionPolicy</code> property to <code>never</code>.</p>
	-->
	<s:PopUpAnchor id="popUp"  displayPopUp.normal="false" displayPopUp.open="true" includeIn="open"
				   left="0" right="0" top="{hostComponent.height+4}" bottom="0" itemDestructionPolicy="auto"
				   popUpPosition="below" popUpWidthMatchesAnchorWidth="true">
		
		<!--- 
		This includes borders, background colors, scrollers, and filters.
		@copy spark.components.supportClasses.DropDownListBase#dropDown
		-->
		<s:Group id="dropDown">
			
			<s:Path top="2" right="20" data="M 0 10 L 10 0 L 20 10 Z">
				<s:fill>
					<s:SolidColor color="{ColorUtils.WetAsphalt}" alpha="1"/>
				</s:fill>
			</s:Path>
			
			<!-- fill -->
			<!--- Defines the appearance of drop-down list's background fill. -->
			<s:Rect id="background" left="0" right="0" top="10" bottom="0" radiusX="4" >
				<s:fill>
					<s:SolidColor id="bgFill" color="{ColorUtils.WetAsphalt}" />
				</s:fill>
			</s:Rect>
			
			<!--- @private -->
			<s:Scroller id="scroller" left="4" top="14" right="4" bottom="4" hasFocusableChildren="false" minViewportInset="1" skinClass="flatspark.skins.ScrollerSkin">
				<!--- @copy spark.components.SkinnableDataContainer#dataGroup-->
				<s:DataGroup id="dataGroup" itemRenderer="flatspark.itemRenderers.DefaultItemRenderer">
					<s:layout>
						<s:VerticalLayout gap="0" horizontalAlign="contentJustify" requestedMinRowCount="1" requestedMaxRowCount="6"/>
					</s:layout>
				</s:DataGroup> 
			</s:Scroller>
		</s:Group>
	</s:PopUpAnchor>
	
	<!---  The default skin is DropDownListButtonSkin. 
	@copy spark.components.supportClasses.DropDownListBase#openButton
	@see spark.skins.spark.DropDownListButtonSkin -->
	<s:Button id="openButton" width="29" left="0" right="0" top="0" bottom="0" focusEnabled="false" tabEnabled="false"
			  skinClass="flatspark.skins.DropDownListButtonSkin" />  
	
	<!--- @copy spark.components.DropDownList#labelDisplay -->

	<s:Label id="labelDisplay" verticalAlign="middle" maxDisplayedLines="1"  backgroundColor="{ColorUtils.Turquoise}"
			 mouseEnabled="false" mouseChildren="false" fontFamily="Lato" fontWeight="normal" color="0xFFFFFF" 
			 left="10" right="37" top="8" bottom="8" fontSize="15" verticalCenter="0"></s:Label> 
</s:SparkSkin>
