////////////////////////////////////////////////////////////////////////////////
//
//  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.formats
{
	/**
	 *  Defines values for setting the <code>leadingModel</code> property
	 *  of the <code>TextLayoutFormat</code> class, composed of valid combinations of leading basis and leading direction.
	 *  Leading basis describes which baselines determine the leading (or <code>lineHeight</code>) of lines in a paragraph.
	 *  Leading direction specifies whether the <code>lineHeight</code> property refers to the distance of a line's 
	 *  baseline from that of the line before it or the line after it. 
	 *  <p>
	 *  <img src="../../../images/textLayout_baselines.jpg" alt="baselines" border="0"/>
	 *  <img src="../../../images/textLayout_LD1.jpg" alt="leadingDirection_1" border="0"/>
	 *  <img src="../../../images/textLayout_LD2.jpg" alt="leadingDirection_2" border="0"/>
	 *  <img src="../../../images/textLayout_LD3.jpg" alt="leadingDirection_3" border="0"/>
	 *  </p>
	 *  @playerversion Flash 10
	 *  @playerversion AIR 1.5
	 *  @langversion 3.0 
	 * 
	 *  @see TextLayoutFormat#leadingModel
	 *  @see TextLayoutFormat#lineHeight
	 *  @see flash.text.TextField
	 *  @see flash.text.engine.TextLine 
	 */
	 
	public final class LeadingModel
	{
		/** Specifies that leading basis is ROMAN and leading direction is UP. 
		 * In other words, <code>lineHeight</code> refers to the distance of a line's Roman baseline from the 
		 * previous line's Roman baseline.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	  	 * @langversion 3.0 
	 	 */
	 	 
		public static const ROMAN_UP:String = "romanUp";
		
		/** Specifies that leading basis is IDEOGRAPHIC_TOP and leading direction is UP. 
		 *  In other words, <code>lineHeight</code> refers to the distance of a line's ideographic top 
		 *  baseline from the previous line's ideographic top baseline.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
	 	 */
	 	 
		public static const IDEOGRAPHIC_TOP_UP:String = "ideographicTopUp";
		
		/** Specifies that leading basis is IDEOGRAPHIC_CENTER and leading direction is UP. 
		 * In other words, <code>lineHeight</code> refers to the distance of a line's ideographic center 
		 * baseline from the previous line's ideographic center baseline.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
		 * @langversion 3.0 
		 */
		 
		public static const IDEOGRAPHIC_CENTER_UP:String = "ideographicCenterUp";
		
		/** Specifies that leading basis is IDEOGRAPHIC_TOP and leading direction is DOWN.
		 * In other words, <code>lineHeight</code> refers to the distance of a line's ideographic top baseline 
		 * from the next line's ideographic top baseline.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
	 	 */
	 	 
		public static const IDEOGRAPHIC_TOP_DOWN:String = "ideographicTopDown";
		
		/** Specifies that leading basis is IDEOGRAPHIC_CENTER and leading direction is down.
		 *  In other words, <code>lineHeight</code> refers to the distance of a line's ideographic center 
		 *  baseline from the next line's ideographic center baseline.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
	 	 */
	 	 
		public static const IDEOGRAPHIC_CENTER_DOWN:String = "ideographicCenterDown";
		
		/** Specifies that leading basis is ASCENT/DESCENT and leading direction is UP. 
		 *  In other words, <code>lineHeight</code> refers to the distance of a line's ascent baseline from the 
		 *  previous line's descent baseline.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	  	 * @langversion 3.0 
	 	 */
	 	 
		public static const ASCENT_DESCENT_UP:String = "ascentDescentUp";
		
		/** Specifies that leading model is chosen automatically based on the paragraph's <code>locale</code> property.  
		 * For Japanese and Chinese, it is IDEOGRAPHIC_TOP_DOWN and for all others it is ROMAN_UP.
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
	 	 * 
	 	 * #IDEOGRAPHIC_TOP_DOWN
	 	 * #ROMAN_UP
	 	 */
	 	 
		public static const AUTO:String = "auto";
		
		/** Specifies a leading model that approximates the line spacing behavior of <code>TextField</code>.
		 * It is similar to <code>ASCENT_DESCENT_UP</code> in that <code>lineHeight</code> refers to the 
		 * distance of a line's ascent baseline from the previous line's descent baseline. However, baseline 
		 * positions approximate those determined by <code>TextField</code>, rather than using metrics 
		 * offered by <code>TextLine</code>.  
		 *
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
		 */
		public static const APPROXIMATE_TEXT_FIELD:String = "approximateTextField";
		
		/**  Specifies a leading model based on the CSS inline formatting model, which involves stacking <i>line boxes</i> contiguously.
		 * A <i>line box</i> is defined as the bounding box around <i>inline boxes</i> for all leaf elements on the text line, after they have been aligned
		 * using <code>baselineShift</code>, <code>dominantBaseline</code>, <code>alignmentBaseline</code> etc. For a span, the <i>inline box</i> 
		 * is obtained by applying leading equally above and below the text content such that its height equals <code>lineHeight</code>.
		 * For an inline graphic, <code>lineHeight</code> is ignored; the <i>inline box</i> is derived from its specified dimensions and padding values.
		 * Also, <code>firstBaselineOffset</code> is ignored with this leading model.
		 * 
         * <p>For more information, see <a href='http://blogs.adobe.com/tlf/2010/11/box-leading-model.html'>Box leading model</a>.</p>
         * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0 
		 */
		public static const BOX:String = "box";
		
	}
}
