////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
package skins
{
	import flash.display.GradientType;
	import flash.display.Graphics;
	
	import mx.core.DPIClassification;
	import mx.core.mx_internal;
	
	import spark.components.IconPlacement;
	import spark.skins.mobile.assets.ViewMenuItem_down;
	import spark.skins.mobile.assets.ViewMenuItem_showsCaret;
	import spark.skins.mobile.assets.ViewMenuItem_up;
	import spark.skins.mobile.supportClasses.ButtonSkinBase;
	import spark.skins.mobile320.assets.ViewMenuItem_down;
	import spark.skins.mobile320.assets.ViewMenuItem_showsCaret;
	import spark.skins.mobile320.assets.ViewMenuItem_up;
	import spark.skins.mobile.ButtonSkin;
	
	use namespace mx_internal;
	
	/**
	 *  Default skin for ViewMenuItem. Supports a label, icon and iconPlacement and draws a background.   
	 * 
	 *  @langversion 3.0
	 *  @playerversion Flash 10
	 *  @playerversion AIR 2.5 
	 *  @productversion Flex 4.5
	 */ 
	public class MyVMItemSkin extends ButtonSkin
	{
		/**
		 *  Constructor.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 2.5
		 *  @productversion Flex 4.5
		 */
		public function MyVMItemSkin()
		{
			super();
			
			switch (applicationDPI)
			{
				case DPIClassification.DPI_320:
				{
					
					upBorderSkin = spark.skins.mobile320.assets.ViewMenuItem_up;
					downBorderSkin = spark.skins.mobile320.assets.ViewMenuItem_down;
					showsCaretBorderSkin = spark.skins.mobile320.assets.ViewMenuItem_showsCaret;
					
					layoutGap = 12;
					layoutPaddingLeft = 12;
					layoutPaddingRight = 12;
					layoutPaddingTop = 12;
					layoutPaddingBottom = 12;
					layoutBorderSize = 2;   
					
					
					break;
				}
				case DPIClassification.DPI_240:
				{   
					upBorderSkin = spark.skins.mobile.assets.ViewMenuItem_up;
					downBorderSkin = spark.skins.mobile.assets.ViewMenuItem_down;
					showsCaretBorderSkin = spark.skins.mobile.assets.ViewMenuItem_showsCaret;
					
					layoutGap = 8;
					layoutPaddingLeft = 8;
					layoutPaddingRight = 8;
					layoutPaddingTop = 8;
					layoutPaddingBottom = 8;
					layoutBorderSize = 1;
					
					break;
					
				}
				default:
				{
					upBorderSkin = spark.skins.mobile.assets.ViewMenuItem_up;
					downBorderSkin = spark.skins.mobile.assets.ViewMenuItem_down;
					showsCaretBorderSkin = spark.skins.mobile.assets.ViewMenuItem_showsCaret; 
					
					layoutGap = 6;
					layoutPaddingLeft = 6;
					layoutPaddingRight = 6;
					layoutPaddingTop = 6;
					layoutPaddingBottom = 6;
					layoutBorderSize = 1;
				}
			}
			
		}
		
		/**
		 *  Class to use for the border in the showsCaret state.
		 * 
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 2.5 
		 *  @productversion Flex 4.5
		 *       
		 *  @default Button_down
		 */ 
		protected var showsCaretBorderSkin:Class;
		
		/**
		 *  @private
		 */
		override protected function getBorderClassForCurrentState():Class
		{
			var borderClass:Class = super.getBorderClassForCurrentState();
			
			if (currentState == "showsCaret")
				borderClass = showsCaretBorderSkin;  
			
			return borderClass;
		}
		
		/**
		 *  @private
		 */
		override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
		{
			var iconPlacement:String = getStyle("iconPlacement");
			useCenterAlignment = (iconPlacement == IconPlacement.LEFT)
				|| (iconPlacement == IconPlacement.RIGHT);
			
			super.layoutContents(unscaledWidth, unscaledHeight);
		}
		
		/**
		 *  @private
		 */
		override protected function drawBackground(unscaledWidth:Number, unscaledHeight:Number):void
		{
			// omit call to super.drawBackground(), drawRect instead
			
			if (currentState == "showsCaret" || currentState == "down")
			{
				graphics.beginFill(getStyle("focusColor"));
			}
			else
			{
				colorMatrix.createGradientBox(unscaledWidth, 
					unscaledHeight, 
					Math.PI / 2, 0, 0);
				var chromeColor:uint = getStyle("chromeColor");
				
				graphics.beginGradientFill(GradientType.LINEAR,
					[chromeColor, chromeColor],
					[0.0, 0.98],
					[0, 255],
					colorMatrix);
			}
			
			graphics.drawRect(0,0,unscaledWidth,unscaledHeight);
			graphics.endFill();
		}
	}
}