////////////////////////////////////////////////////////////////////////////////
//
//  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 flashx.textLayout.container
{
	import flashx.textLayout.property.EnumStringProperty;
	import flashx.textLayout.tlf_internal;

	use namespace tlf_internal;

	/**
	 *  The ScrollPolicy class is an enumeration class that defines values for setting the <code>horizontalScrollPolicy</code> and 
	 *  <code>verticalScrollPolicy</code> properties of the ContainerController class, which defines a text flow 
	 *  container. 
	 *
	 *  @see ContainerController#horizontalScrollPolicy
	 *  @see ContainerController#verticalScrollPolicy
	 * @playerversion Flash 10
	 * @playerversion AIR 1.5
	 * @langversion 3.0
	 */
	public final class ScrollPolicy
	{
		/** 
		 * Specifies that scrolling is to occur if the content exceeds the container's dimension. The runtime calculates 
		 * the number of lines that overflow the container and the user can navigate to them with cursor keys, by drag selecting,
		 * or by rotating the mouse wheel. You can also cause scrolling to occur by setting the corresponding position value, 
		 * either <code>ContainerController.horizontalScrollPosition</code> or <code>ContainerController.verticalScrollPosition</code>. Also, the runtime can automatically 
		 * scroll the contents of the container during editing.
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
	 	 * @langversion 3.0
	 	 */
	 	 
		public static const AUTO:String = "auto";
		
		/** 
		 * Causes the runtime to not display overflow lines, which means that the user cannot navigate to them. 
		 * In this case, setting the corresponding <code>ContainerController.horizontalScrollPosition</code> and 
		 * <code>ContainerController.verticalScrollPosition</code> properties have no effect. 
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
	 	 * @langversion 3.0
	 	 */
	 	 
		public static const OFF:String = "off";
		
		/** 
		 * Specifies that scrolling is available to access content that exceeds the container's dimension. The runtime calculates the 
		 * number of lines that overflow the container and allows the user to scroll them into view with the cursor keys, by drag selecting, 
		 * or by rotating the mouse wheel. You can also scroll by setting the corresponding position value, either 
		 * <code>ContainerController.horizontalScrollPosition</code> or <code>ContainerController.verticalScrollPosition</code>. Also, the runtime can automatically scroll the contents 
		 * of the container during editing.
		 *
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
	 	 * @langversion 3.0
	 	 */
	 	 
		public static const ON:String = "on";		
		
		/** Shared definition of the scrollPolicy property. @private */
		static tlf_internal const scrollPolicyPropertyDefinition:EnumStringProperty = new EnumStringProperty("scrollPolicy", ScrollPolicy.AUTO, false, null, 
			ScrollPolicy.AUTO, ScrollPolicy.OFF, ScrollPolicy.ON);	
	}
}