<?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.

-->


<!--

Scroller unconditionally sets its skin's layout to private layout
implementation that handles the scroll policies.  Scroller skins can
only provide replacement scrollbars.  The skin's layout and
constraints or dimensions set on skin parts will not be honored.  To
gain more control over the layout of a viewport and its scrollbars,
instead of using Scroller, add them to a Group and use the ScrollBar component's
viewport property to link them together.

-->

<!--- The default skin class for the Spark Scroller that is used by the SpinnerList component. 

@see spark.components.SpinnerList
@see spark.components.Scroller

@langversion 3.0
@playerversion AIR 3
@productversion Flex 4.6
-->
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
	
	<fx:Metadata>
		<![CDATA[ 
		/** 
		* @copy spark.skins.spark.ApplicationSkin#hostComponent
		* 
		*  @langversion 3.0
		*  @playerversion AIR 3
		*  @productversion Flex 4.6
		*/
		[HostComponent("spark.components.Scroller")]
		]]>
	</fx:Metadata> 
	
	<fx:Script>
		<![CDATA[    
			/**
			 *  @private
			 */
			override public function beginHighlightBitmapCapture() : Boolean
			{
				var needUpdate:Boolean = super.beginHighlightBitmapCapture();
				
				// Draw an opaque rect that fill our entire skin. Our background
				// is transparent, but we don't want focus/error skins to
				// poke through.  This is safe to do since we don't have any 
				// graphic elements as direct children.
				graphics.beginFill(0);
				graphics.drawRect(0, 0, width, height);
				graphics.endFill();
				
				return needUpdate;
			}
			
			/**
			 *  @private
			 */
			override public function endHighlightBitmapCapture() : Boolean
			{
				var needUpdate:Boolean = super.endHighlightBitmapCapture();
				
				// Clear the rect we drew in beginBitmapCapture();
				graphics.clear();
				
				return needUpdate;
			}
		]]>
	</fx:Script>
	
</s:SparkSkin>

