/*
 *
 *  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.
 *
 */

/*
    This style sheet configures many -- but not all -- MX components
    to use the new Flash Text Engine (FTE) and Text Layout Framework (TLF)
    to display and edit text, rather than using the older TextField class.

    If you are using the command-line MXML compiler, you should apply
    this style sheet as one of the themes for your application:

        mxmlc -theme+=frameworks/projects/spark/MXFTEText.css MyApp.mxml

    FTE and TLF provide text rendering and editing
    with high-quality international typography and layout.
    They support displaying left-to-right (ltr) text such as French,
    right-to-left (rtl) text such as Arabic, and bidirectional text
    such as a French phrase inside of an Arabic sentence.
    FTE and TLF are used for all text rendering in Spark components.

    By using this style sheet, your MX and Spark components can use
	the same embedded font; otherwise, you have to embed a font twice,
	once with embedAsCFF="true" for Spark components using FTE/TLF
	and once with embedAsCFF="false" for MX components using TextField.

    Note: The <mx:TextInput>, <mx:TextArea>, and <mx:RichTextEditor>
	components are not supported by this style sheet, because the
	FTETextField class does not support all the functionality
	that TextField supports.
	You should use the <s:TextInput>, <s:TextArea>, and <s:RichEditableText>
	components instead if you require FTE/TLF text.

    You should not modify this file.
*/

@namespace charts "mx.charts.chartClasses.*";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace mxair "mx.core.windowClasses.*";
@namespace olap "mx.controls.olapDataGridClasses.*";
@namespace s "library://ns.adobe.com/flex/spark";

mx|AlertForm
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|Button
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|CalendarLayout
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|ColorPicker
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
	textInputClass: ClassReference("mx.controls.MXFTETextInput");
}

mx|ComboBox
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
	textInputClass: ClassReference("mx.controls.MXFTETextInput");
}

mx|DataGrid
{
	defaultDataGridItemEditor: ClassReference("mx.controls.MXFTETextInput");
	defaultDataGridItemRenderer: ClassReference("mx.controls.dataGridClasses.FTEDataGridItemRenderer");
}

mx|DateChooser
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|DateField
{
	textInputClass: ClassReference("mx.controls.MXFTETextInput");
}

s|FTEDataGridItemRenderer
{
	paddingLeft: 5 /* to match DataGridItemRenderer in the MX defaults.css */
}

mx|Label
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|List
{
    textInputClass: ClassReference("mx.controls.MXFTETextInput");
}

mx|ListItemRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|MenuBarItem
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|MenuItemRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

s|MXFTETextInput
{
	skinClass: ClassReference("spark.skins.spark.TextInputSkin");
}

mx|NumericStepper
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
	textInputClass: ClassReference("mx.controls.MXFTETextInput");
}

mx|Panel
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|ProgressBar
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|SwatchPanel
{
	textInputClass: ClassReference("mx.controls.MXFTETextInput");
}

mx|TileListItemRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|TreeItemRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|ToolTip
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|AdvancedDataGrid
{
	defaultDataGridItemEditor: ClassReference("mx.controls.MXFTETextInput");
	defaultDataGridItemRenderer: ClassReference("mx.controls.advancedDataGridClasses.FTEAdvancedDataGridItemRenderer");
}

mx|AdvancedDataGridGroupItemRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|AdvancedDataGridHeaderRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|AdvancedDataGridSortItemRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mxair|StatusBar
{
    textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mxair|TitleBar
{
    textFieldClass: ClassReference("mx.core.UIFTETextField");
}

charts|ChartLabel
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

charts|DataTip
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

charts|DualStyleObject
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

charts|Series
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

mx|LegendItem
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

olap|OLAPDataGridGroupRenderer
{
	textFieldClass: ClassReference("mx.core.UIFTETextField");
}

s|FTEAdvancedDataGridItemRenderer
{
	paddingLeft: 5 /* to match AdvancedDataGridItemRenderer in the MX defaults.css */
}

