blob: 56dcdab190efabb25ab0f9d8e8845a13065f0cb6 [file] [log] [blame]
<?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.
-->
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-us" xml:lang="en-us">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="DC.Type" content="topic"/>
<meta name="DC.Title" content="Spark text controls"/>
<meta name="DC.Format" content="XHTML"/>
<meta name="DC.Identifier" content="WS02f7d8d4857b1677-165a04e1126951a2d98-8000_verapache"/>
<link rel="stylesheet" type="text/css" href="commonltr.css"/>
<title>Spark text controls</title>
</head>
<body id="WS02f7d8d4857b1677-165a04e1126951a2d98-8000_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-8000_verapache"><!-- --></a>
<h1 class="topictitle1">Spark text controls</h1>
<div>
<p>
Text controls
in a Flex application can display text,
let the user enter text, or do both. </p>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fff_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fff_verapache"><!-- --></a>
<h2 class="topictitle2">About the Spark text controls</h2>
<div>
<p>You use Flex text-based controls to display text and to
let users enter text into your application. </p>
<p>The following table lists the primary Flex text-based controls:</p>
<div class="tablenoborder"><table cellpadding="4" cellspacing="0" summary="" frame="border" border="1" rules="all">
<thead align="left">
<tr>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e58">
<p>Control</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e64">
<p>Component set</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e70">
<p>Superclass</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e76">
<p>Multi Line</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e82">
<p>Editable</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e89">
<p>textFlow/text/textDisplay</p>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e58 ">
<p>
<a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/Label.html" target="_blank">Label</a>
</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e64 ">
<p>Spark</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e70 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e76 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e82 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e89 ">
<p>text</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e58 ">
<p>
<a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/RichEditableText.html" target="_blank">RichEditableText</a>
</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e64 ">
<p>Spark</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e70 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e76 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e82 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e89 ">
<p>textFlow/text</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e58 ">
<p>
<a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/RichText.html" target="_blank">RichText</a>
</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e64 ">
<p>Spark</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e70 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e76 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e82 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e89 ">
<p>textFlow/text</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e58 ">
<p>
<a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/TextArea.html" target="_blank">TextArea</a>
</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e64 ">
<p>Spark</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e70 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e76 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e82 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e89 ">
<p>textFlow/text</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e58 ">
<p>
<a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/TextInput.html" target="_blank">TextInput</a>
</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e64 ">
<p>Spark</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e70 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e76 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e82 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e89 ">
<p>text/textDisplay (textFlow)</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b167739a25a5e12695211e42-8000_verapache"><a name="WS02f7d8d4857b167739a25a5e12695211e42-8000_verapache"><!-- --></a>
<h3 class="topictitle3">Comparing Spark and MX text controls</h3>
<div>
<p>This section describes the Spark text controls. For information
on the MX text controls, see <a href="flx_textcontrols_tc.html#WS2db454920e96a9e51e63e3d11c0bf69084-7d84_verapache">MX
text controls</a>.</p>
<p>How much control you have over the formatting of the text in
the control depends on the type of control. The MX controls support
a small set of formatting options with their style properties and
the <samp class="codeph">htmlText</samp> property. The Spark controls support
a richer set of formatting options because they are based on Flash
Text Engine (FTE) and Text Layout Framework (TLF). </p>
<p>Some MX controls can also use limited functionality of FTE and
TLF. For more information, see <a href="flx_fonts_ft.html#WSda78ed3a750d6b8f-26a13bbf123c441239d-8000_verapache">Using
FTE in MX controls</a>.</p>
<p>When building Flex 4 applications, you should use the Spark text
controls where possible. This is especially true if you plan on
using TLF or embedded fonts. In some cases, there are both MX and
Spark versions of the same text-based control. For example, there
are MX and Spark versions of the Label, TextArea, and TextInput
controls. The MX versions are in the mx.controls package.*. The
Spark versions are in the spark.components.* package.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b167739a25a5e12695211e42-7fff_verapache"><a name="WS02f7d8d4857b167739a25a5e12695211e42-7fff_verapache"><!-- --></a>
<h3 class="topictitle3">Spark text control feature overview</h3>
<div>
<p>The primary Spark controls for displaying text are Label,
RichText, and RichEditableText. The Label control has the least
amount of functionality, but is also the most lightweight. The RichEditableText
control has the most functionality, but also uses the most system
resources. </p>
<p>The following image shows the relationship among the Spark text
controls and FTE/TLE:</p>
<div class="figborder"><span class="figdesc">Relationship of the Spark text controls to FTE/TLF</span>
<img src="images/stc_text.png"/>
</div>
<p>The following table shows more information about these Spark
text primitives:</p>
<div class="p">
<div class="tablenoborder"><table cellpadding="4" cellspacing="0" summary="" frame="border" border="1" rules="rows">
<thead align="left">
<tr>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e407">
<p>Feature</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e413">
<p>Spark Label</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e419">
<p>RichText</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e425">
<p>RichEditableText</p>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Extends</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>UIComponent</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>UIComponent</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Uses</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>FTE</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>TLF</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>TLF</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Advanced typography</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Alpha</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Rotation</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Bi-directional text</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Default formatting with CSS
styles</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Multiple lines</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Multiple formats</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Multiple paragraphs</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Text object model</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Markup language</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Clickable HTML links</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Inline graphics</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>Y</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Hyperlinks</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Scrolling</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Selection</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e407 ">
<p>Editing</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e413 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e419 ">
<p>N</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e425 ">
<p>Y</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-3e3ce9f812699ed2335-8000_verapache"><a name="WS02f7d8d4857b1677-3e3ce9f812699ed2335-8000_verapache"><!-- --></a>
<h3 class="topictitle3">Styling text controls</h3>
<div>
<div class="p">The default styles for Spark text control are set in CSS.
The easiest way to customize your text controls is to use CSS to
change style properties. For example, you can adjust the font size
and color by using the fontSize and color style properties as the
following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimpleStyleExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
s|RichText {
color: #33CC66;
fontStyle: italic;
fontSize: 24;
}
&lt;/fx:Style&gt;
&lt;s:RichText id="myRET"&gt;
This is the text.
&lt;/s:RichText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>CSS lets you adjust the styles of all controls of a certain type
(using a type selector) or any controls that match a certain class
(using a class selector).</p>
<div class="p">Spark text controls have a much richer set of style properties
than standard CSS because they support TLF. These style properties
include paragraph spacing, line spacing, and margins. The following
example sets the line height and space after each paragraph:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/AnotherStyleExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
s|RichText {
fontSize: 18;
lineHeight:16;
paragraphSpaceAfter: 10;
}
&lt;/fx:Style&gt;
&lt;s:RichText id="myRET" width="200"&gt;
&lt;s:p&gt;This is my text. There are many others like it, but this one is mine.&lt;/s:p&gt;
&lt;s:p&gt;My text is my best friend.&lt;/s:p&gt;
&lt;s:p&gt;It is my life. I must master it as I must master my life.&lt;/s:p&gt;
&lt;s:p&gt;Without me, my text is useless.&lt;/s:p&gt;
&lt;/s:RichText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>With TLF, you can also manipulate the appearance of text within
the TextFlow at compile time or run-time. For more information,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ff2_verapache">Styling
TLF-based text controls</a>.</p>
<p>When styling the TextInput and TextArea controls, you should
keep in mind that the text is rendered by a RichEditableText subcomponent.
You access properties of this subcomponent with the <samp class="codeph">textDisplay</samp> property.
For more information, see <a href="flx_styles_st.html#WS2db454920e96a9e51e63e3d11c0bf69084-7ed9_verapache">Subcomponent
styles</a>.</p>
</div>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fde_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fde_verapache"><!-- --></a>
<h2 class="topictitle2">Label control</h2>
<div>
<p>The <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/Label.html" target="_blank">Label</a> control
displays noneditable text. It is the lightest weight of the text controls.
The Label control has the following characteristics:</p>
<ul>
<li>
<p>The user cannot change the text, but the application
can modify it. </p>
</li>
<li>
<p>You can control the alignment and sizing. </p>
</li>
<li>
<p>The control’s background is transparent, so the background
of the component’s container shows through.</p>
</li>
<li>
<p>The control has no borders, so the label appears as text
written directly on its background.</p>
</li>
<li>
<p>The control cannot take the focus.</p>
</li>
<li>
<p>The control can display multiple lines.</p>
</li>
<li>
<p>The control cannot be made selectable.</p>
</li>
</ul>
<p>For complete reference information, see the <em>
<a href="http://www.adobe.com/go/learn_flex4_apiref_en" target="_blank">ActionScript 3.0 Reference for the Adobe<sup>®</sup>
Flash<sup>®</sup> Platform</a>
</em>.</p>
<p>To create user-editable text fields, use the TextInput or TextArea
controls. For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fdb_verapache">TextInput
control</a> and <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fd3_verapache">TextArea
control</a>. </p>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fdd_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fdd_verapache"><!-- --></a>
<h3 class="topictitle3">Creating a Label control</h3>
<div>
<div class="p">
You
define a Label control in MXML by using the <samp class="codeph">&lt;s:Label&gt;</samp> tag,
as the following example shows. Specify an <samp class="codeph">id</samp> value
if you intend to refer to a component elsewhere in your MXML, either
in another tag or an ActionScript block. <pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkLabelControl.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
width="150" height="80"&gt;
&lt;s:Label text="Label1"/&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fdc_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fdc_verapache"><!-- --></a>
<h3 class="topictitle3">Sizing a Label control</h3>
<div>
<p>If you do not specify a width, the Label control automatically
resizes when you change the value of the <samp class="codeph">text</samp> property.</p>
<p>If you explicitly size a Label control so that it is not large
enough to accommodate its text, the text is truncated and terminated
by an ellipsis (...). The full text displays as a tooltip when you
move the mouse over the Label control. If you also set a tooltip
by using the <samp class="codeph">tooltip</samp> property, the tooltip is displayed
rather than the text.</p>
</div>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd3_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd3_verapache"><!-- --></a>
<h2 class="topictitle2">TextArea control</h2>
<div>
<p>
The <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/TextArea.html" target="_blank">TextArea</a> control
is a multiline, editable text field with a border and optional scroll
bars. The TextArea control supports the rich text rendering capabilities
of Flash Player and AIR. The TextArea control dispatches <samp class="codeph">change</samp> and <samp class="codeph">textInput</samp> events. </p>
<p>The TextArea control supports TLF. The text is rendered by a
RichEditableText subcomponent that is defined in the TextArea control’s
skin class.</p>
<p>For complete reference information, see the <em>
<a href="http://www.adobe.com/go/learn_flex4_apiref_en" target="_blank">ActionScript 3.0 Reference for the Adobe
Flash Platform</a>
</em>.</p>
<p>To create a single-line, editable text field, use the TextInput
control. For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fdb_verapache">TextInput
control</a>. To create noneditable text fields, use the Label
control. For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fde_verapache">Label
control</a>. </p>
<p>To change the disabled color for the TextArea control, you must
edit the TextAreaSkin class. </p>
<p>You can set a TextArea control’s <samp class="codeph">editable</samp> property
to <samp class="codeph">false</samp> to prevent editing of the text. You can
set a TextArea control’s <samp class="codeph">displayAsPassword</samp> property
to conceal input text by displaying characters as asterisks.</p>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd2_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd2_verapache"><!-- --></a>
<h3 class="topictitle3">Creating a TextArea control</h3>
<div>
<div class="p">
You
define a TextArea control in MXML by using the <samp class="codeph">&lt;s:TextArea&gt;</samp> tag,
as the following example shows: <pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkTextAreaControl.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:TextArea id="textConfirm"
width="300" height="100"
text="Please enter your thoughts here."/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>Using large amounts of text in the TLF-based TextArea control
can cause a degradation in performance. As a result, in some cases,
you should use the MX TextArea control. For more information, see <a href="flx_textcontrols_tc.html#WS2db454920e96a9e51e63e3d11c0bf69084-7d51_verapache">MX
TextArea control</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd1_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd1_verapache"><!-- --></a>
<h3 class="topictitle3">Sizing the TextArea control</h3>
<div>
<p>The TextArea control does not resize to fit the text that
it contains. </p>
<p>If the new text exceeds the capacity of a TextArea control and
the <samp class="codeph">horizontalScrollPolicy property</samp> is set to <samp class="codeph">true</samp> (the
default value), the control adds a scrollbar. </p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd0_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd0_verapache"><!-- --></a>
<h3 class="topictitle3">Using TLF with the TextArea control</h3>
<div>
<p>The TextArea control supports the advanced text formatting
and manipulation of TLF. You add TLF content to the TextArea control
by using either the <samp class="codeph">textFlow</samp> or <samp class="codeph">content</samp> properties. </p>
<div class="p">The following example adds a block of TLF-formatted text to the
TextArea control:<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- sparktextcontrols/TextAreaTLF.mxml --&gt;
&lt;s:Application name="RichEditableTextExample"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"&gt;
&lt;s:Panel title="TextArea TLF"
width="90%" height="90%"
horizontalCenter="0" verticalCenter="0"&gt;
&lt;s:TextArea id="ta1" textAlign="left" percentWidth="90"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p fontSize="24"&gt;TextArea with TLF block&lt;/s:p&gt;
&lt;s:p&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:p&gt;
&lt;s:p&gt;2) Cras posuere posuere sem, &lt;s:span fontWeight="bold"&gt;eu congue orci mattis quis&lt;/s:span&gt;.&lt;/s:p&gt;
&lt;s:p&gt;3) Curabitur &lt;s:span textDecoration="underline"&gt;pulvinar tellus&lt;/s:span&gt; venenatis ipsum tempus lobortis.&lt;s:br/&gt;
&lt;s:span color="0x6600CC"&gt;Vestibulum eros velit&lt;/s:span&gt;, bibendum at aliquet ut.
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:TextArea&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt; </pre>
</div>
<p>For more information about using TLF with Spark text controls,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ffe_verapache">Using
Text Layout Framework</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-7d190b8d126b3bd198b-8000_verapache"><a name="WS02f7d8d4857b1677-7d190b8d126b3bd198b-8000_verapache"><!-- --></a>
<h3 class="topictitle3">Styling the TextArea control</h3>
<div>
<p>The TextArea control uses a RichEditableText control as
a subcomponent to render the text. You can set the values of inheritable
style properties on the TextArea contorl, and those properties are
inherited by the RichEditableText subcomponent.</p>
<p>To access the RichEditableText control, you use the <samp class="codeph">textDisplay</samp> property.
You can access this property to set style properties that are noninheritable;
for example, the <samp class="codeph">columnCount</samp> and <samp class="codeph">columnGap</samp> properties. </p>
<p>There are some exceptions to noninheritable styles. For example,
the <samp class="codeph">verticalAlign</samp>, <samp class="codeph">lineBreak</samp>,
and <samp class="codeph">paddingBottom/Left/Right/Top</samp> style properties
are noninheritable. You can set these properties, which are defined
on the RichEditableText control, directly on the TextArea control
because the TextAreaSkin class passes them through to the subcomponent.</p>
<div class="p">The following example sets styles on the RichEditableText subcomponent
with the <samp class="codeph">textDisplay</samp> property, and also sets the
values of some noninheriting style properties that are not normally
accessible. You must cast the <samp class="codeph">textDisplay</samp> property
as a RichEditableText object before you can call methods such as <samp class="codeph">setStyle()</samp> on
it.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkTextAreaStyles.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="initApp()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
/*
Non-inheriting styles you must set on textDisplay:
columnCount
columnGap
columnWidth
Non-inheriting styles that you can set on TextArea because
they are passed to the subcomponent through the TextAreaSkin class:
lineBreak
paddingTop/Bottom/Left/Right
verticalAlign
*/
import spark.components.RichEditableText;
private function initApp():void {
RichEditableText(ta1.textDisplay).setStyle("columnCount", 3);
RichEditableText(ta1.textDisplay).setStyle("columnWidth", 100);
RichEditableText(ta1.textDisplay).setStyle("columnGap", 15);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextArea id="ta1" height="100" width="400" verticalAlign="bottom" paddingBottom="20"&gt;
This is a text area control. Because the text rendering is done by a RichEditableText subcontrol,
you have to use the textDisplay property to set the values of some non-inheriting styles.
Other non-inheriting styles are defined in the skin class and are passed through to the
subcomponent.
For inheriting styles, they are inherited by the RichEditableText subcontrol.
&lt;/s:TextArea&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fdb_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fdb_verapache"><!-- --></a>
<h2 class="topictitle2">TextInput control</h2>
<div>
<p>
The Spark <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/TextInput.html" target="_blank">TextInput</a> control
is a single-line text field that is optionally editable. This control
supports TLF. The text is rendered by a RichEditableText subcomponent
in its skin class.</p>
<p>For complete reference information, see the <em>
<a href="http://www.adobe.com/go/learn_flex4_apiref_en" target="_blank">ActionScript 3.0 Reference for the Adobe
Flash Platform</a>
</em>.</p>
<p>To create a multiline, editable text field, use a TextArea control.
For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fd3_verapache">TextArea
control</a>. To create noneditable text fields, use the Label
or RichText controls. For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fde_verapache">Label
control</a> and <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fca_verapache">RichText
control</a>.</p>
<p>The TextInput control does not include a label, but you can add
one by using a Label control or by nesting the TextInput control
in a FormItem container in a Form layout container. </p>
<div class="p">To change the disabled color for the Spark TextInput control,
you must edit the TextInputSkin class. The following example shows
the differences between the enabled and disabled versions of the
Spark and MX TextInput controls:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TextInputDisabledColors.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:VGroup&gt;
&lt;mx:TextInput enabled="false" text="disabled MX"/&gt;
&lt;mx:TextInput enabled="true" text="enabled MX"/&gt;
&lt;s:TextInput enabled="false" text="disabled Spark"/&gt;
&lt;s:TextInput enabled="true" text="enabled Spark"/&gt;
&lt;/s:VGroup&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can set a TextInput control’s <samp class="codeph">editable</samp> property
to <samp class="codeph">false</samp> to prevent users from editing the text.
You can set a TextInput control’s <samp class="codeph">displayAsPassword</samp> property
to conceal the input text by displaying characters as asterisks.</p>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fda_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fda_verapache"><!-- --></a>
<h3 class="topictitle3">Creating a TextInput control</h3>
<div>
<div class="p">
You
define a TextInput control in MXML by using the <samp class="codeph">&lt;s:TextInput&gt;</samp> tag,
as the following example shows. Specify an <samp class="codeph">id</samp> value
if you intend to refer to a control elsewhere in your MXML, either
in another tag or in an ActionScript block. <pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkTextInputControl.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:TextInput id="text1" width="100"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can use the <samp class="codeph">text</samp> property to specify a string
of raw text in the TextInput control.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd9_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd9_verapache"><!-- --></a>
<h3 class="topictitle3">Sizing a TextInput control</h3>
<div>
<p>If you do not specify a width, the TextInput control is
automatically sized when the application first completes loading.
The size of the TextInput control does not change in response to
user input or programmatic text input.</p>
<p>The TextInput control determines the value of its <samp class="codeph">measuredWidth</samp> property
by using a <samp class="codeph">widthInChars</samp> property rather than measuring
the text assigned to it, because the text frequently starts out
empty. This property is calculated based on the current font size
and style.</p>
<p>The value of its <samp class="codeph">measuredHeight</samp> property is
determined by the height of the current font. If you change the
font style or size, then the TextInput control resizes to accomodate
the new settings, even if there is no text in the control at the
time of the resizing.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd8_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd8_verapache"><!-- --></a>
<h3 class="topictitle3">Binding to a TextInput control</h3>
<div>
<div class="p">
In
some cases, you might want to bind a variable to the <samp class="codeph">text</samp> property
of a TextInput control so that the control represents a variable
value, as the following example shows: <pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkBoundTextInputControl.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;fx:Script&gt;&lt;![CDATA[
[Bindable]
public var myProp:String="This is the initial String myProp.";
]]&gt;&lt;/fx:Script&gt;
&lt;s:TextInput text="{myProp}"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>In this example, the TextInput control displays the value of
the <samp class="codeph">myProp</samp> variable. Remember that you must use
the <samp class="codeph">[Bindable]</samp> metadata tag if the variable changes
value and the control must track the changed values; also, the compiler generates
warnings if you do not use this metadata tag.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd7_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fd7_verapache"><!-- --></a>
<h3 class="topictitle3">Using TLF with the TextInput control</h3>
<div>
<p>You can use TLF with a TextInput control by accessing the <samp class="codeph">textDisplay</samp> property
and casting it as a RichEditableText object. This property points
to the underlying RichEditableText object that renders the text
in the TextInput control. The RichEditableText object is a subcomponent
that is defined in the TextInput control’s skin class.</p>
<div class="p">The following example defines a TextFlow as XML, and assigns
that to the TextInput control’s <samp class="codeph">textDisplay</samp>:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TextInputTLF.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;fx:Declarations&gt;
&lt;fx:XML id="myXML"&gt;
&lt;div&gt;
&lt;p&gt;Hello &lt;span fontWeight='bold'&gt;world&lt;/span&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/fx:XML&gt;
&lt;/fx:Declarations&gt;
&lt;fx:Script&gt;
import spark.utils.TextFlowUtil;
import spark.components.RichEditableText;
private function initApp():void {
RichEditableText(text1.textDisplay).textFlow = TextFlowUtil.importFromXML(myXML);
}
&lt;/fx:Script&gt;
&lt;s:TextInput id="text1" width="100"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>For more information about using TLF with Spark text controls,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ffe_verapache">Using
Text Layout Framework</a>.</p>
</div>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fca_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fca_verapache"><!-- --></a>
<h2 class="topictitle2">RichText control</h2>
<div>
<p>The <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/RichText.html" target="_blank">RichText</a> control
is a middleweight Spark text control. It can display richly-formatted
text, with multiple character and paragraph formats. However, it
is non-interactive: it does not support hyperlinks, scrolling, selection,
or editing. If you want a control that supports formatted text plus
scrolling, selection, and editing, you can use the RichEditableText
control.</p>
<p>For specifying the text, the RichText control supports the <samp class="codeph">textFlow</samp>, <samp class="codeph">text</samp>,
and <samp class="codeph">content</samp> properties. If you set the <samp class="codeph">text</samp> property,
the contents are read in as a String; tags such as <samp class="codeph">&lt;p&gt;</samp> and <samp class="codeph">&lt;img&gt;</samp> are
ignored. If you set the <samp class="codeph">textFlow</samp> or <samp class="codeph">content</samp> properties,
then the contents are parsed by TLF and stored as a TextFlow object.
Tags such as <samp class="codeph">&lt;p&gt;</samp> and <samp class="codeph">&lt;img&gt;</samp> are
mapped to instances of the ParagraphElement and InlineGraphicElement
classes.</p>
<div class="p">To create a RichText control, you use the <samp class="codeph">&lt;s:RichText&gt;</samp> tag
in MXML, as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/RichTextExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;!-- You can display simple text with the text property. --&gt;
&lt;s:RichText text="Hello World!"/&gt;
&lt;!-- Or the text child tag. --&gt;
&lt;s:RichText&gt;
&lt;s:text&gt;
Hello World!
&lt;/s:text&gt;
&lt;/s:RichText&gt;
&lt;!-- You can display formatted text with the default property. --&gt;
&lt;s:RichText&gt;
Hello &lt;s:span fontSize='16'&gt;BIG NEW&lt;/s:span&gt; World!
&lt;/s:RichText&gt;
&lt;!-- Or the TextFlow child tag. --&gt;
&lt;s:RichText&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
Hello &lt;s:span fontSize='16'&gt;BIG NEW&lt;/s:span&gt; World!
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The text in a RichText control can be horizontally and vertically
aligned but it cannot be scrolled. The contents of the control wraps
at the right edge of the control’s bounds. If the content extends
below the bottom, it is clipped. It is also clipped if you turn
off wrapping by setting the <samp class="codeph">lineBreak</samp> style property
to <samp class="codeph">explicit</samp> and add content that extends past the
right edge of the control.</p>
<p>The contents of a RichText control can be exported to XML using
the <samp class="codeph">export()</samp> method, which produces XML. </p>
<p>For more information about using TLF with Spark text controls,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ffe_verapache">Using
Text Layout Framework</a>.</p>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fc9_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fc9_verapache"><!-- --></a>
<h2 class="topictitle2">RichEditableText control</h2>
<div>
<p>The <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/RichEditableText.html" target="_blank">RichEditableText</a> is
similar to the RichText control in that it can display richly-formatted
text, with multiple character and paragraph formats. In addition,
the RichEditableText control is interactive: it supports hyperlinks,
scrolling, selection, and editing. </p>
<p>The RichEditableText class is similar to the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/TextArea.html" target="_blank">TextArea</a> control,
except that it does not have a border, scroll bars, or focus glow.</p>
<p>
<strong>Creating a RichEditableText control</strong>
</p>
<div class="p">To create a RichEditableText control in MXML, you use the <samp class="codeph">&lt;s:RichEditableText&gt;</samp> tag,
as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/RichEditableTextExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText height="100" width="200"&gt;
&lt;s:text&gt;
Hello World!
&lt;/s:text&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>For specifying the text, the RichEditableText control supports
the <samp class="codeph">textFlow</samp>, <samp class="codeph">text</samp>, and <samp class="codeph">content</samp> properties.
If you set the <samp class="codeph">text</samp> property, the contents are read
in as a String; tags such as <samp class="codeph">&lt;p&gt;</samp> and <samp class="codeph">&lt;img&gt;</samp> are
ignored. If you set the <samp class="codeph">textFlow</samp> or <samp class="codeph">content</samp> properties,
then the contents are parsed by TLF and stored in a TextFlow object.
Tags such as <samp class="codeph">&lt;p&gt;</samp> and <samp class="codeph">&lt;img&gt;</samp> are
mapped to instances of the ParagraphElement and InlineGraphicElement
classes.</p>
<p>
<strong>Inserting and appending text</strong>
</p>
<p>The RichEditableText control also supports the <samp class="codeph">insertText()</samp> and <samp class="codeph">appendText()</samp> methods.
These methods let you add text to the contents of the control as
if you had typed it. The <samp class="codeph">insertText()</samp> method either
replaces a selection (if there is one) or adds the new text at the
current insertion point. The <samp class="codeph">appendText()</samp> adds
the text to the end of the contents. New text added with these methods
is not parsed by the TLF parser; it is read in as a literal string. </p>
<p>The <samp class="codeph">insertText()</samp> method does not insert text
unless the RichEditableText control has focus. The <samp class="codeph">appendText()</samp> appends
text even if the RichEditableText control does not have the focus.
If the RichEditableText control gets focus by pressing the Tab key,
the <samp class="codeph">insertText()</samp> method inserts the text before
any existing text. If the control gets focus by clicking within
the control, the text is inserted at the insertion point.</p>
<div class="p">The following example lets you append or insert new text to the
RichEditableText control:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/AddTextExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
[Bindable]
private var newText:String = "&lt;p&gt;This is the new text.&lt;/p&gt;";
private function insertNewText():void {
myRET.insertText(newText);
}
private function appendNewText():void {
myRET.appendText(newText);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="myRET" height="100" width="200"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;This is paragraph 1.&lt;/s:p&gt;
&lt;s:p&gt;This is paragraph 2.&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;s:HGroup&gt;
&lt;s:Button label="Insert New Text" click="insertNewText()"/&gt;
&lt;s:Button label="Append New Text" click="appendNewText()"/&gt;
&lt;/s:HGroup&gt;
&lt;s:Label text="New text to add: '{newText}'"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The contents of a RichEditableText control can be exported to
XML using the <samp class="codeph">export()</samp> method, which produces XML. </p>
<p>
<strong>Making content selectable and editable</strong>
</p>
<p>You can make the content of the RichEditableText control selectable
by setting the <samp class="codeph">selectable</samp> property to <samp class="codeph">true</samp>.
You can make the content of the RichEditableText control editable
by setting the <samp class="codeph">editable</samp> property to <samp class="codeph">true</samp>.</p>
<div class="p">The following example makes the RichEditableText content both
selectable and editable:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/RETEditableAndSelectable.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText height="100" width="200"
editable="true"
selectable="true"&gt;
&lt;s:text&gt;
This text is editable and selectable!
&lt;/s:text&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can read the selection range with the read-only <samp class="codeph">selectionAnchorPosition</samp> and <samp class="codeph">selectionActivePosition</samp> properties.
You can set the selection with the <samp class="codeph">selectRange()</samp> method.
For examples of using the <samp class="codeph">selectRange()</samp> method,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fe4_verapache">Selecting
text</a>.</p>
<p>
<strong>Using the getFormatOfRange() and setFormatOfRange() methods</strong>
</p>
<p>To determine the text formatting on the selection, use the <samp class="codeph">getFormatOfRange()</samp> method.
This method returns a TextLayoutFormat object. This returns the
computed value of every property on the control, including defaults.</p>
<div class="p">You can set the format of the selection with the <samp class="codeph">setFormatOfRange()</samp> method.
In general, you should not use <samp class="codeph">getFormatOfRange()</samp> method
to get the TextLayoutFormat and then set properties on that. This
overwrites custom properties you might have already set on the text
control with the default values. The following example is not a
best practice, as it overwrites any custom properties:<pre class="codeblock">var tf:TextLayoutFormat = myTextControl.getFormatOfRange(null,0,0);
tf.fontSize = 16;
tf.fontWeight = FontWeight.BOLD;
myTextControl.setFormatOfRange(tf,0,0);</pre>
</div>
<div class="p">The following example uses the <samp class="codeph">setFormatOfRange()</samp> method
to apply properties without overwriting other custom properties
with the defaults:<pre class="codeblock">var tf:TextLayoutFormat = new TextLayoutFormat();
tf.fontSize = 16;
tf.fontWeight = FontWeight.BOLD;
myTextControl.setFormatOfRange(tf,0,0);</pre>
</div>
<p>
<strong>Clipping content</strong>
</p>
<div class="p">You can clip contents of the RichEditableText control and let
users scroll it by setting the <samp class="codeph">clipAndEnableScrolling</samp> property
to <samp class="codeph">true</samp>, as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/RETClipAndScroll.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText height="100" width="200" clipAndEnableScrolling="true"&gt;
&lt;s:text&gt;
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
&lt;/s:text&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>
<strong>Adding scrollbars </strong>
</p>
<div class="p">The RichEditableText control does not add scroll bars for you,
even when scrolling and clipping is enabled. To add scroll bars
to a RichEditableText control, you can wrap the RichEditableText
control in a <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/Scroller.html" target="_blank">Scroller</a> class,
as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/ScrollableRET.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:Scroller&gt;
&lt;s:RichEditableText height="100" width="200"
editable="true"
selectable="true"&gt;
&lt;s:text&gt;
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
This text scrolls vertically!
&lt;/s:text&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Scroller&gt;
&lt;s:Label text="To enable horizontal scrolling, set lineBreak to explicit:"/&gt;
&lt;s:Scroller&gt;
&lt;s:RichEditableText height="100" width="200"
editable="true"
selectable="true"
lineBreak="explicit"&gt;
&lt;s:text&gt;
This text scrolls horizontally! This text scrolls horizontally! This text scrolls horizontally!
This text scrolls horizontally! This text scrolls horizontally! This text scrolls horizontally!
&lt;/s:text&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Scroller&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The RichEditableText control supports programmatic scrolling
with its IViewport interface; it scrolls in response to the mousewheel;
and it automatically scrolls as you drag-select or type more text
than fits in the control’s bounds. The Scroller class lets you put
anything that implements the IViewport interface, such as the RichEditableText
control, in it to be scrolled.</p>
<p>
<strong>Selecting ranges</strong>
</p>
<div class="p">If you select a range of text that is not in the current viewport,
you can programmatically scroll to that range by using the <samp class="codeph">scrollToRange()</samp> method.
The following example selects the 10th line and then scrolls to
that line when you click the button:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SelectScrollableRET.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function scrollToLine():void {
myRET.selectRange(440, 471);
myRET.scrollToRange(440, 471);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:Scroller&gt;
&lt;s:RichEditableText id="myRET"
selectionHighlighting="always"
selectable="true"
height="100" width="200"&gt;
&lt;s:text&gt;
This text scrolls vertically1!
This text scrolls vertically2!
This text scrolls vertically3!
This text scrolls vertically4!
This text scrolls vertically5!
This text scrolls vertically6!
This text scrolls vertically7!
This text scrolls vertically8!
This text scrolls vertically9!
This text scrolls vertically10!
This text scrolls vertically11!
This text scrolls vertically12!
This text scrolls vertically13!
This text scrolls vertically14!
&lt;/s:text&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Scroller&gt;
&lt;s:Button label="Select and Scroll to Line 10" click="scrollToLine()"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>For more information about using TLF with Spark text controls,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ffe_verapache">Using
Text Layout Framework</a>.</p>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fec_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fec_verapache"><!-- --></a>
<h2 class="topictitle2">Adding content to text controls</h2>
<div>
<p>The Spark text-based controls let you set and get text
by using the following properties:</p>
<dl>
<dt class="dlterm">text</dt>
<dd>
<p>Plain text without formatting information. All text based
controls support this property. For information on using the <samp class="codeph">text</samp> property,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fea_verapache">Using
the text property </a>. </p>
</dd>
<dt class="dlterm">default</dt>
<dd>
<p>Setting the default property is the same as using the <samp class="codeph">textFlow</samp> property,
and is less verbose. Tags set in the default property are parsed
at compile time, just as any other MXML tag.</p>
</dd>
<dt class="dlterm">textFlow</dt>
<dd>
<p>A rich set of tags and TLF formatting. Most Spark text-based
controls support this property. You typically use this property
if you do not know the contents of the rich text at compile time.
For information on using the <samp class="codeph">textFlow</samp> property,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ffc_verapache">Creating
TextFlow objects</a>. </p>
</dd>
</dl>
<p>Typically, if your text does not contain any formatting, use
the <samp class="codeph">text</samp> property. If your text contains formatting,
use the <samp class="codeph">textFlow</samp> or default properties.</p>
<p>You can set formatted text by using the <samp class="codeph">textFlow</samp> or
default properties, and get it back as a plain text string by using
the <samp class="codeph">text</samp> property. </p>
<p>If you set more than one content-related property on a Spark
text control in ActionScript (such as <samp class="codeph">text</samp>
<em>and</em>
<samp class="codeph">textFlow</samp>),
the last one set wins. If you set more than one of these properties
as an attribute on an MXML tag, however, the winning setter cannot
be predicted. The compiler does not guarantee the order in which
MXML attributes get applied to a component.</p>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7feb_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7feb_verapache"><!-- --></a>
<h3 class="topictitle3">Using the default property</h3>
<div>
<p>You can use the default property (<samp class="codeph">content</samp>)
to add text to TLF-based text controls. These controls include the
RichText, RichEditableText, and TextArea controls. Text that is
added with the default property is parsed by the TLF and stored
as a TextFlow object.</p>
<p>The following example sets the default property:</p>
<pre class="codeblock">&lt;s:RichText id="myRT" width="450"&gt;
This is text.
&lt;/s:RichText&gt;</pre>
<p>If you are using TLF with your text controls, then you should
generally use the <samp class="codeph">textFlow</samp> property to set the
contents. The default property is set only, and it is less efficient
than the <samp class="codeph">textFlow</samp> property. If you set the contents
of a text control with the default property, you can then get it
with either the <samp class="codeph">textFlow</samp> property (gets a TextFlow
object) or the <samp class="codeph">text</samp> property (gets a plain text
String object). For more information about using the <samp class="codeph">textFlow</samp> property,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ffc_verapache">Creating TextFlow
objects</a>.</p>
<div class="p">Typically, you start the value of the <samp class="codeph">content</samp> property
with a paragraph tag. That tag then contains <samp class="codeph">&lt;span&gt;</samp> elements
or breaks or anchor tags. TLF renders text set by the default property
by putting it into a span, and that into a paragraph, and that into
a TextFlow, and then rendering the TextFlow. The resulting tree
uses the following structure:<pre class="codeblock">&lt;TextFlow&gt;
&lt;p&gt;
&lt;span&gt;
&lt;<em>contents</em> ... &gt;</pre>
</div>
<p>When using the default property to add text to a control, you
can use a subset of HTML in the content. This list matches the supported
tags of the <samp class="codeph">&lt;s:textFlow&gt;</samp> tag. For a list
of supported tags, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ff6_verapache">Markup
tags supported in TextFlow objects</a>.</p>
<p>The content of the default property is typed as Object because
you can set it to a String, a FlowElement, or an Array of Strings
and FlowElement objects. </p>
<div class="p">In the following example, the <samp class="codeph">&lt;span&gt;</samp> tag
is one FlowElement, and the character data “<samp class="codeph">World</samp>
is treated as if it were wrapped in a <samp class="codeph">&lt;String&gt;</samp> tag:<pre class="codeblock">&lt;s:RichText fontSize="12" xmlns="library://ns.adobe.com/flex/spark"&gt;
&lt;span fontWeight="bold"&gt;Hello&lt;/span&gt;World
&lt;/s:RichText&gt;</pre>
</div>
<div class="p">You can also set the content to a single FlowElement:<pre class="codeblock">&lt;s:RichText fontSize="12" xmlns="library://ns.adobe.com/flex/spark"&gt;
&lt;span fontWeight="bold"&gt;Hello World&lt;/span&gt;
&lt;/s:RichText&gt;</pre>
</div>
<div class="p">or to a single String:<pre class="codeblock">&lt;s:RichText fontSize="12" fontWeight="bold"&gt;Hello World&lt;/s:RichText&gt;</pre>
</div>
<p>Note that if you use a tag for the default property (such as <samp class="codeph">&lt;span&gt;</samp>),
you must specify the namespace in the opening tag of the text control.
Otherwise, the compiler will not recognize the tag in the text.</p>
<div class="p">Because there is only one format across all of the content, however,
it is more efficient to set the formatting on the RichText tag and
the content with the <samp class="codeph">text</samp> property, as the following
example shows:<pre class="codeblock">&lt;s:RichText fontSize="12" fontWeight="bold" text="Hello World"/&gt;</pre>
</div>
<p>There is no getter for the default property. Instead, you access
the host component’s <samp class="codeph">textFlow</samp> property to get the
parsed contents or the component’s <samp class="codeph">text</samp> property
to get a simple string.</p>
<p>You can add special characters such as ampersands and angle brackets
in the default property. To do this, use the same rules as described
in <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7fe9_verapache">Specifying
special characters in the text property</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fea_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fea_verapache"><!-- --></a>
<h3 class="topictitle3">Using the text property </h3>
<div>
<p>
You
can use the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/Label.html#text" target="_blank">text</a> property
to specify the text string that appears in a text control or to
get the text in the control as a plain text String. All text-based
Flex controls support a <samp class="codeph">text</samp> property. When you
set this property, any tags (such as HTML) in the text string appear
in the control as literal text. </p>
<p>The interpretation of \r, \n and \r\n as paragraph separators
is the only interpretation that occurs when setting the value of
the <samp class="codeph">text</samp> property.</p>
<div class="p">
You cannot specify
text formatting when you set the <samp class="codeph">text</samp> property,
but you can format the text in the control, as the following example
shows:<pre class="codeblock">&lt;s:RichText fontSize="12" fontWeight="bold" text="Hello World"/&gt;</pre>
</div>
<p>For Spark controls that support TLF, you can set the text and
then manipulate it with the TLF API. You can access nodes of the
text object model and format parts of the content. </p>
<p>The following code line uses a <samp class="codeph">text</samp> property
to specify Label text:</p>
<pre class="codeblock"> &lt;s:Label text="This is a simple text label"/&gt;</pre>
<div class="p">You can also use a <samp class="codeph">&lt;s:text&gt;</samp> child tag
to specify text, as the following example shows:<pre class="codeblock">&lt;s:Label&gt;
&lt;s:text&gt;
This is a simple text label.
&lt;/s:text&gt;
&lt;/s:Label&gt;</pre>
</div>
<p>The way you specify special characters, including quotation marks,
greater than and less than signs, and apostrophes, depends on whether
you use them in MXML tags or in ActionScript. It also depends on
whether you specify the text directly or wrap the text in a CDATA
section.</p>
<div class="note"><span class="notetitle">Note:</span> If you specify the value of the <samp class="codeph">text</samp> property
by using a string directly in MXML, Flex collapses white space characters.
If you specify the value of the <samp class="codeph">text</samp> property in ActionScript,
Flex does not collapse white space characters.</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe9_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe9_verapache"><!-- --></a>
<h4 class="topictitle4">Specifying special characters in
the text property</h4>
<div>
<p>The following rules specify how to include special characters
in the <samp class="codeph">text</samp> property of a text control MXML tag,
either in a property assignment, such as <samp class="codeph">text="the text"</samp>,
or in the body of a <samp class="codeph">&lt;s:text&gt;</samp> subtag.</p>
<dl>
<dt class="dlterm">In standard text</dt>
<dd>
<p>The following rules determine how you use special characters if
you do not use a CDATA section:</p>
<ul>
<li>
<p>To use the special
characters left angle bracket (&lt;), right angle bracket (&gt;),
and ampersand (&amp;), insert the XML character entity equivalents
of <samp class="codeph">&amp;lt;,</samp>
<samp class="codeph">&amp;gt;</samp>, and <samp class="codeph">&amp;amp;,</samp> respectively.
You can also use <samp class="codeph">&amp;quot;</samp> and <samp class="codeph">&amp;apos;</samp> for
double-quotation marks (") and single-quotation marks ('), and you
can use numeric character references, such as &amp;#165 for the
Yen mark (¥)<samp class="codeph">. </samp>Do not use any other named character
entities; Flex treats them as literal text.</p>
</li>
<li>
<p>You cannot use the character that encloses the property text
string inside the string. If you surround the string in double-quotation
marks ("), use the escape sequence <samp class="codeph">\"</samp> for any double-quotation
marks in the string. If you surround the string in single-quotation
marks (') use the escape sequence <samp class="codeph">\'</samp> for any single-quotation
marks in the string. You <em>can</em> use single-quotation marks inside
a string that is surrounded in double-quotation marks, and double-quotation marks
inside a string that is surrounded in single-quotation marks.</p>
</li>
<li>
<p>Flex text controls ignore escape characters such as \t or
\n in the <samp class="codeph">text</samp> property. They ignore or convert
to spaces, tabs and line breaks, depending on whether you are specifying
a property assignment or a <samp class="codeph">&lt;s:text&gt;</samp> subtag.
To include line breaks, put the text in a CDATA section.</p>
</li>
</ul>
<div class="p">The
following code example uses the <samp class="codeph">text</samp> property with
standard text:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkStandardText.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
height="400"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:Label width="400"
text="This string contains a less than, &amp;lt;,
greater than, &amp;gt;, ampersand, &amp;amp;, apostrophe, ', and
quotation mark &amp;quot;."/&gt;
&lt;s:Label width="400"
text='This string contains a less than, &amp;lt;,
greater than, &amp;gt;, ampersand, &amp;amp;, apostrophe, &amp;apos;, and
quotation mark, ".'/&gt;
&lt;s:Label width="400"&gt;
&lt;s:text&gt;
This string contains a less than, &amp;lt;, greater than,
&amp;gt;, ampersand, &amp;amp;, apostrophe, ', and quotation mark, ".
&lt;/s:text&gt;
&lt;/s:Label&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The resulting application
contains three almost identical text controls, each with the following
text. The first two controls, however, convert any tabs in the text
to spaces. The third one has leading and trailing newlines and converts
any tabs to newlines.</p>
<pre class="codeblock"> This string contains a less than, &lt;, greater than, &gt;, ampersand, &amp;,apostrophe, ', and quotation mark, ".</pre>
</dd>
<dt class="dlterm">In a CDATA section</dt>
<dd>
<p>If you wrap the text string in the <samp class="codeph">CDATA</samp> tag,
the following rules apply:</p>
<ul>
<li>
<p>You cannot use a CDATA
section in a property assignment statement in the text control opening
tag; you must define the property in a <samp class="codeph">&lt;s:text&gt;</samp> child tag.</p>
</li>
<li>
<p>Text inside the CDATA section appears as it is entered, including
white space characters. Use literal characters, such as " or &lt;
for special characters, and use standard return and tab characters.
Character entities, such as &amp;gt;, and backslash-style escape
characters, such as \n, appear as literal text.</p>
</li>
</ul>
<div class="p">The
following code example follows these CDATA section rules:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkTextCDATA.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
width="500"&gt;
&lt;s:Label width="100%"&gt;
&lt;s:text&gt;
&lt;![CDATA[
This string contains a less than, &lt;, greater than, &gt;,
ampersand, &amp;, apostrophe, ', return,
tab. and quotation mark, ".
]]&gt;
&lt;/s:text&gt;
&lt;/s:Label&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The displayed text appears
on three lines, as follows:</p>
<pre class="codeblock">  This string contains a less than, &lt;, greater than, &gt;,
 ampersand, &amp;, apostrophe, ', return,
 tab. and quotation mark, ". </pre>
</dd>
</dl>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe8_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe8_verapache"><!-- --></a>
<h4 class="topictitle4">Specifying special characters in
ActionScript</h4>
<div>
<p>
The following rules specify how to include
special characters in a text control when you specify the control’s <samp class="codeph">text</samp> property
value in ActionScript; for example, in an initialization function,
or when assigning a string value to a variable that you use to populate
the property:</p>
<ul>
<li>
<p>You cannot use the character that encloses the text string
inside the string. If you surround the string in double-quotation
marks ("), use the escape sequence \" for any double-quotation marks
in the string. If you surround the string in single-quotation marks
('), use the escape sequence \' for any single-quotation marks in
the string.</p>
</li>
<li>
<p>Use backslash escape characters for special characters, including
\t for the tab character, and \n or \r for a return/line feed character
combination. You can use the escape character \" for the double-quotation
mark and \' for the single-quotation mark.</p>
</li>
<li>
<p>In standard text, but not in CDATA sections, you can use
the special characters left angle bracket (&lt;), right angle bracket
(&gt;), and ampersand (&amp;), by inserting the XML character entity
equivalents of <samp class="codeph">&amp;lt;,</samp>
<samp class="codeph">&amp;gt;</samp>,
and <samp class="codeph">&amp;amp;</samp>, respectively. You can also use <samp class="codeph">&amp;quot;</samp> and <samp class="codeph">&amp;apos;</samp> for
double-quotation marks ("), and single-quotation marks ('), and
you can use numeric character references, such as <samp class="codeph">&amp;#165;</samp> for
the Yen mark (¥)<samp class="codeph">. </samp>Do not use any other named character entities;
Flex treats them as literal text.</p>
</li>
<li>
<p>In CDATA sections only, do not use character entities or
references, such as <samp class="codeph">&amp;lt;</samp> or &amp;#165; because
Flex treats them as literal text. Instead, use the actual character,
such as &lt;.</p>
</li>
</ul>
<div class="p">The following example uses an initialization function to set
the <samp class="codeph">text</samp> property to a string that contains these
characters: <pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkInitText.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
initialize="initText()"&gt;
&lt;fx:Script&gt;
public function initText():void {
//The following is on one line.
myText.text="This string contains a return, \n, tab, \t, and quotation mark, \". " +
"This string also contains less than, &amp;lt;, greater than, &amp;gt;, " +
"ampersand, &amp;amp;, and apostrophe, ', characters.";
}
&lt;/fx:Script&gt;
&lt;s:RichText width="450" id="myText" tabStops="100 200 300 400"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The following example uses an <samp class="codeph">&lt;fx:Script&gt;</samp> tag
with a variable in a CDATA section to set the <samp class="codeph">text</samp> property: <pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkVarText.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
[Bindable]
//The following is on one line.
public var myText:String ="This string contains a return, \n, tab, \t, and quotation mark, \". This string also contains less than, &lt;, greater than, &lt;, ampersand, &lt;;, and apostrophe, ', characters.";
]]&gt;
&lt;/fx:Script&gt;
&lt;s:RichText width="450" text="{myText}" tabStops="100 200 300 400"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The displayed text for each example appears on three lines. The
first line ends at the return specified by the \n character. The
remaining text wraps onto a third line because it is too long to
fit on a single line. (Note: When you specify a tab character, you
should be sure to create tab stops with the tabStops style property.
Otherwise, the tab will instead be rendered as a carriage return.
The RichText, RichEditableText, and Spark TextArea controls support
the tabStops property, but the Label control does not.)</p>
<pre class="codeblock"> This string contains a return,
 , tab,                    , and quotation mark, ". This string also contains less than, &lt;,
 greater than, &gt;, ampersand, &amp;, and apostrophe, ', characters.</pre>
</div>
</div>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe4_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe4_verapache"><!-- --></a>
<h2 class="topictitle2">Selecting text</h2>
<div>
<p>
The
editable text controls provide properties and methods to select
text regions and get the contents of the selections. </p>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe2_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe2_verapache"><!-- --></a>
<h3 class="topictitle3">Creating a selection</h3>
<div>
<div class="p">The following controls let you select text:<ul>
<li>
<p>RichEditableText</p>
</li>
<li>
<p>TextInput</p>
</li>
<li>
<p>TextArea</p>
</li>
<li>
<p>All controls that use these controls as a subcomponent</p>
</li>
</ul>
</div>
<p>The selectable text controls provide the <samp class="codeph">selectRange()</samp> method,
which selects a range of text. You specify the zero-based indexes
of the start character and the position immediately <em>after</em> the
last character you want to select.</p>
<div class="p">The following example shows how to select the first 10 characters
of various text controls:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SetSelectionTest.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function selectText():void {
sparkTextArea.selectRange(0, 10);
sparkTextInput.selectRange(0, 10);
sparkRET.selectRange(0, 10);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextArea id="sparkTextArea"
selectionHighlighting="always"
selectable="true"
text="Spark TextArea control."/&gt;
&lt;s:TextInput id="sparkTextInput"
selectionHighlighting="always"
selectable="true"
text="Spark TextInput control."/&gt;
&lt;s:RichEditableText id="sparkRET"
selectionHighlighting="always"
selectable="true"
text="Spark RichEditableText control."/&gt;
&lt;s:Button click="selectText()" label="Select Text"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>To determine when the selection is highlighted, you can use the <samp class="codeph">selectionHighlighting</samp> property.
Possible values are <samp class="codeph">always</samp>, <samp class="codeph">whenFocused</samp>,
and <samp class="codeph">whenActive</samp>.</p>
<div class="p">To select all text in a text control, use the <samp class="codeph">selectAll()</samp> method,
as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SelectAllExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function selectText(e:Event):void {
e.currentTarget.selectAll();
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextArea id="sparkTextArea"
text="Spark TextArea control." focusIn="selectText(event)"/&gt;
&lt;s:TextInput id="sparkTextInput" text="Spark TextInput control." focusIn="selectText(event)"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>TLF-based text controls have additional APIs that let you select
text in different ways. For example, you can programmatically select
a particular SpanElement object within a TextFlow, depending on
where the cursor is. To do this, you walk the text object model’s
tree of elements (or leaves) and compare the cursor’s position against
each leaf element’s character range.</p>
<div class="p">The following example selects only the SpanElement that is under
the mouse click:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkSelectionExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.elements.TextRange;
import flashx.textLayout.elements.*;
private function selectSomeText(e:Event):void {
/* Get the location of the cursor. This is the character position of the
cursor in the RichEditableText control after the user clicks on it. */
var activePos:int = richTxt1.selectionActivePosition;
/* Get the first SpanElement in the TextFlow. */
var leaf:SpanElement = new SpanElement();
leaf = SpanElement(richTxt1.textFlow.getFirstLeaf());
/* Get the start and end index values for the first SpanElement. */
var spanStart:int = leaf.getParagraph().parentRelativeStart;
var spanEnd:int = leaf.getParagraph().parentRelativeEnd;
/* For the first SpanElement, if the cursor position falls within the
SpanElement's character range, then select the entire SpanElement. */
if (activePos &gt;= spanStart &amp;&amp; activePos &lt;= spanEnd) {
selectSpan(spanStart, spanEnd);
return;
}
/* Perform the same operations for each leaf in the TextFlow. */
while(leaf = SpanElement(leaf.getNextLeaf())) {
spanStart = leaf.getParagraph().parentRelativeStart;
spanEnd = leaf.getParagraph().parentRelativeEnd;
if (activePos &gt;= spanStart &amp;&amp; activePos &lt;= spanEnd) {
selectSpan(spanStart, spanEnd);
return;
}
}
}
private function selectSpan(i1:int, i2:int):void {
richTxt1.selectRange(i1, i2);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:Panel&gt;
&lt;s:RichEditableText id="richTxt1" click="selectSomeText(event)" selectable="true" editable="true" textAlign="justify" percentWidth="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;&lt;s:span&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;2) Cras posuere posuere sem, eu congue orci mattis quis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;3) Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>Rather than iterating over all the leaf elements in the TextFlow
object, you can also use the TextFlow class’s <samp class="codeph">findLeaf()</samp> method.
This method lets you find an element based on a relative position.
For an example of using the <samp class="codeph">findLeaf()</samp> method,
see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ff5_verapache">Navigating
TextFlow objects</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe1_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fe1_verapache"><!-- --></a>
<h3 class="topictitle3">Getting a selection</h3>
<div>
<p>You get the anchor and active positions of the selected
text to get a text control’s current selection. You then get the
value of the characters between those positions.</p>
<p>To get the selected text in a text control, you use the <samp class="codeph">selectionAnchorPosition</samp> and <samp class="codeph">selectionActivePosition</samp> properties
of the text control. These properties define the position at the
start of the selection and at the end of the selection, respectively.
You use the <samp class="codeph">substring()</samp> method on the contents
of the control, and pass these positions to identify the range of
characters to return.</p>
<div class="p">The following example displays the selections of the RichEditableText
control when you click the button:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SparkTraceSelectionRanges.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import mx.core.IUITextField;
import flashx.textLayout.elements.TextRange;
private function initApp():void {
sparkRET.selectRange(0, 10);
}
private function getTextSelection():void {
var anchorPos:int = sparkRET.selectionAnchorPosition;
var activePos:int = sparkRET.selectionActivePosition;
myLabel.text = "Current Selection: \"" + sparkRET.text.substring(anchorPos, activePos) + "\"";
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="sparkRET"
selectionHighlighting="always"
selectable="true"
text="Spark RichEditableText control."/&gt;
&lt;s:Button click="getTextSelection()" label="Show Current Selection"/&gt;
&lt;s:Label id="myLabel"/&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
</div>
<div class="nested1" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffe_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffe_verapache"><!-- --></a>
<h2 class="topictitle2">Using Text Layout Framework</h2>
<div>
<p>The Text Layout Framework (TLF) is a class library built
on top of the Flash Text Engine (FTE). The FTE, available in Flash
Player 10 and Adobe AIR™ 1.5, adds advanced text capabilities to
Flash Player. FTE provides a set of low-level APIs for libraries
that leverage these capabilities. The FTE classes are in the flash.text.engine
package. In most cases, you will not use these classes directly.</p>
<p>The TLF classes are in the flashx.textLayout.* package. You are
likely to use the TLF classes when you apply styles with HTML markup
to text in text controls that support TLF. These controls include
the RichText and RichEditableText controls, as well as the Spark
TextArea control. </p>
<p>The primary difference between most Spark and MX text-based controls
is the control over the formatting. For Spark controls, the formatting
is provided by either FTE or TLF. This gives you a great deal of
control over the text formatting, including support for HTML tags,
columns, and bi-directional text. </p>
<p>TLF is not used by Flex text controls in mobile applications.
When you create a mobile application, the mobile theme is automatically
applied. As a result, text-based controls use the mobile skins,
which do not support TLF. You can still use some of the same text
controls, but be aware that TLF is not used when the mobile theme
is applied. </p>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffd_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffd_verapache"><!-- --></a>
<h3 class="topictitle3">Features of TLF</h3>
<div>
<p>Text Layout Framework (TLF) is a class library built on
top of FTE. It provides high level text functionality, including:</p>
<div class="p">
<ul>
<li>
<p>Bi-directional text, vertical text, and over 30 writing
systems, including Arabic, Hebrew, Chinese, Japanese, Korean, Thai,
Lao, and the major writing systems of India</p>
</li>
<li>
<p>Selecting, editing, and flowing text across multiple columns
and linked containers, as well as around inline images</p>
</li>
<li>
<p>Vertical text, Tate-Chu-Yoko (horizontal within vertical
text), and justifiers for East Asian typography</p>
</li>
<li>
<p>Rich typographical controls, including kerning, ligatures,
typographic case, digit case, digit width, and discretionary hyphens</p>
</li>
<li>
<p>Cut, copy, paste, undo, and standard keyboard and mouse controls
for editing</p>
</li>
<li>
<p>Rich developer APIs to manipulate text content, layout, and
markup and to create custom text components </p>
</li>
<li>
<p>Robust list support including custom markers and numbering
formats</p>
</li>
<li>
<p>Inline images and positioning rules</p>
</li>
</ul>
</div>
<p>When you add text to a control that uses TLF, the text is stored
as a hierarchical tree of objects. The root element of this tree
is the TextFlow class. Each node in the tree is an instance of a
class defined in the flashx.textLayout.elements package. This tree
is known as the text object model. The text object model is a subset
of the FXG specification.</p>
<p>In the text object model, concepts such as paragraphs, spans,
and hyperlinks are not represented as formats that affect the appearance
of character runs in a single, central text string. Instead they
are represented by runtime-accessible ActionScript objects, with
their own properties, methods, and events (in some cases). </p>
<div class="p">The following lists the objects you can have in a TextFlow object:<ul>
<li>
<p>Paragraphs (ParagraphElement)</p>
</li>
<li>
<p>Images (InlineGraphicElement)</p>
</li>
<li>
<p>Hyperlinks (LinkElement)</p>
</li>
<li>
<p>Spans (SpanElement)</p>
</li>
<li>
<p>TCY blocks (TCYElement)</p>
</li>
<li>
<p>Tabs (TabElement) and line breaks (BreakElement)</p>
</li>
<li>
<p>Lists (ListElement)</p>
</li>
</ul>
</div>
<p>If a Spark text control supports the <samp class="codeph">textFlow</samp> property,
then you can use TLF to format and programmatically interact with
the contents of that text control. If the control supports only
the <samp class="codeph">text</samp> property for its content, then you can
only use a simple string for the text. The text does not get parsed
into the text object model. If an MX control supports the <samp class="codeph">htmlText</samp> property,
then you can use a subset of HTML tags to format the text, but its
content is still a simple string that does not support the formal
text object model.</p>
<p>You use the <samp class="codeph">textFlow</samp> property when you set the
value of the text at run time. The content of the <samp class="codeph">textFlow</samp> property
is strongly typed as a TextFlow object rather than an Object.</p>
<p>You use the default property when you set the value of the property
at compile time. This property takes a generic Object and converts
it to a TextFlow. In general, you should avoid using the default
property when the <samp class="codeph">textFlow</samp> property is available. </p>
<p>The Spark versions of the TextArea and TextInput classes support
TLF, as do the RichText and RichEditableText controls. The Spark
Label control supports FTE. The default MX controls do not support
TLF. However, it is possible to use TLF with some MX controls. For
more informations, see <a href="flx_fonts_ft.html#WSda78ed3a750d6b8f-26a13bbf123c441239d-8000_verapache">Using
FTE in MX controls</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffc_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffc_verapache"><!-- --></a>
<h3 class="topictitle3">Creating TextFlow objects</h3>
<div>
<p>The text object model is the tree that is created when
you add content to a text-based control that supports TLF. This
tree is defined by the TextFlow class.</p>
<p>When creating a <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/TextFlow.html" target="_blank">TextFlow</a> object,
you can use the classes in the flashx.textLayout.elements.* package
to provide formatting and additional functionality. These classes
include <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/DivElement.html" target="_blank">DivElement</a>, <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/ParagraphElement.html" target="_blank">ParagraphElement</a>, <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/InlineGraphicElement.html" target="_blank">InlineGraphicElement</a>, <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/LinkElement.html" target="_blank">LinkElement</a>, <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/SpanElement.html" target="_blank">SpanElement</a>, <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/TabElement.html" target="_blank">TabElement</a>, <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/BreakElement.html" target="_blank">BreakElement</a>,
and <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/TCYElement.html" target="_blank">TCYElement</a>.</p>
<div class="p">You can create a TextFlow object in the following ways:<ul>
<li>
<p>Using the default property</p>
</li>
<li>
<p>Using the <samp class="codeph">&lt;s:textFlow&gt;</samp> child tag</p>
</li>
<li>
<p>Importing content with the TextFlowUtil class</p>
</li>
<li>
<p>Using ActionScript</p>
</li>
</ul>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffb_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffb_verapache"><!-- --></a>
<h4 class="topictitle4">Using the default property</h4>
<div>
<p>You can create a TextFlow object by adding content to a
text-based’s default property. When you do this, Flex creates a
TextFlow object that defines the text object model for you. For
more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7feb_verapache">Using
the default property</a>.</p>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffa_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ffa_verapache"><!-- --></a>
<h4 class="topictitle4">Creating a TextFlow object with
child tags</h4>
<div>
<p>You can also use the text control’s <samp class="codeph">&lt;s:textFlow&gt;</samp> child
tag to explicitly create a TextFlow object. This lets you structure
the contents of the text control by using the supported TLF tags
such as <samp class="codeph">&lt;p&gt;</samp>, <samp class="codeph">&lt;div&gt;</samp> and <samp class="codeph">&lt;span&gt;</samp>.</p>
<div class="p">When using the <samp class="codeph">&lt;s:textFlow&gt;</samp> child tag,
you must be sure to also include a <samp class="codeph">&lt;s:TextFlow&gt;</samp> tag
within that, so that the structure of the control’s uses the following
structure:<pre class="codeblock">&lt;s:<em>text_control</em>&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;.../&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:<em>text_control</em>&gt;</pre>
</div>
<div class="p">You should keep in mind that the default property can also create
a TextFlow object, so you could write the previous example as follows:<pre class="codeblock">&lt;s:<em>text_control</em>&gt;
&lt;.../&gt;
&lt;/s:<em>text_control</em>&gt;</pre>
</div>
<div class="p">The following example creates two text controls; one text control
defines a TextFlow object with the <samp class="codeph">&lt;s:textFlow&gt;</samp> child
tag, and the other with the default property.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/CreateTextFlowChildTags.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText id="richTxt1" textAlign="justify" percentWidth="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p fontSize="24"&gt;TextFlow Child Tag&lt;/s:p&gt;
&lt;s:p&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:p&gt;
&lt;s:p&gt;2) Cras posuere posuere sem, eu congue orci mattis quis.&lt;/s:p&gt;
&lt;s:p&gt;3) Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;s:RichEditableText id="richTxt2" textAlign="justify" percentWidth="100"&gt;
&lt;s:p fontSize="24"&gt;Default Property&lt;/s:p&gt;
&lt;s:p&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:p&gt;
&lt;s:p&gt;2) Cras posuere posuere sem, eu congue orci mattis quis.&lt;/s:p&gt;
&lt;s:p&gt;3) Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/s:p&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">It is also convenient to drop the prefix on the markup tags by
making the Spark library namespace the default namespace on the
text control’s tag, as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TextFlowNamespace.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText id="richTxt1" textAlign="justify" percentWidth="100" xmlns="library://ns.adobe.com/flex/spark"&gt;
&lt;textFlow&gt;
&lt;TextFlow&gt;
&lt;p fontSize="24"&gt;TextFlow Child Tag&lt;/p&gt;
&lt;p&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/p&gt;
&lt;p&gt;2) Cras posuere posuere sem, eu congue orci mattis quis.&lt;/p&gt;
&lt;p&gt;3) Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/p&gt;
&lt;/TextFlow&gt;
&lt;/textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff9_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff9_verapache"><!-- --></a>
<h4 class="topictitle4">Creating a TextFlow object with
the TextFlowUtil class</h4>
<div>
<div class="p">If you don’t know the rich text that you want to display
until run-time, you can import HTML or XML to a TextFlow object.
The <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/utils/TextFlowUtil.html" target="_blank">TextFlowUtil</a> class
has the following methods that let you add XML and strings as the
contents of a TextFlow object:<ul>
<li>
<p>
<samp class="codeph">importFromString()</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">importFromXML()</samp>
</p>
</li>
</ul>
</div>
<div class="p">The following example uses the <samp class="codeph">importFromString()</samp> method
to load a String object into the TextFlow:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TextFlowMarkup.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="doSomething()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;&lt;![CDATA[
import flashx.textLayout.elements.TextFlow;
import spark.utils.TextFlowUtil;
private function doSomething():void {
var markup:String = "&lt;p&gt;This is paragraph 1.&lt;/p&gt;&lt;p&gt;This is paragraph 2.&lt;/p&gt;";
var flow:TextFlow = TextFlowUtil.importFromString(markup);
myST.textFlow = flow;
}
]]&gt;&lt;/fx:Script&gt;
&lt;s:RichText id="myST" width="175"/&gt;
&lt;/s:Application&gt;</pre>
You can add also import XML by
using the TextFlowUtil class’s <samp class="codeph">importFromXML()</samp> method.
Any XML that uses valid TLF markup can be passed into a TextFlow.
This includes content returned by an HTTPService call, XML defined
in the application file itself, or XML defined in an external file. </div>
<div class="p">The following example uses an external file that defines a TextFlow
object for a text control: <pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- sparktextcontrols/ExternalXMLFile.mxml --&gt;
&lt;s:Application name="Spark_RichText_text_test"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import spark.utils.TextFlowUtil;
XML.ignoreWhitespace = false;
]]&gt;
&lt;/fx:Script&gt;
&lt;fx:Declarations&gt;
&lt;fx:XML id="textFlowAsXML" source="externalTextFlow1.xml" /&gt;
&lt;/fx:Declarations&gt;
&lt;s:RichText id="richTxt"
textFlow="{TextFlowUtil.importFromXML(textFlowAsXML)}"
horizontalCenter="0" verticalCenter="0" /&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The previous example uses the following file:<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- http://blog.flexexamples.com/2009/08/11/setting-text-in-a-spark-richtext-control-in-flex-4/ --&gt;
&lt;TextFlow xmlns="http://ns.adobe.com/textLayout/2008" whiteSpaceCollapse="preserve"&gt;
&lt;p&gt;&lt;span&gt;The quick brown &lt;/span&gt; &lt;span fontWeight="bold"&gt;fox jumps over&lt;/span&gt; &lt;span&gt; the lazy dogg.&lt;/span&gt;&lt;/p&gt;
&lt;/TextFlow&gt;</pre>
</div>
<p>If the first tag in an imported XML object is not a <samp class="codeph">&lt;s:TextFlow&gt;</samp> tag,
then the parser inserts one for you. If the first tag is a <samp class="codeph">&lt;s:TextFlow&gt;</samp> tag,
then you must also define the <samp class="codeph">"http://ns.adobe.com/textLayout/2008"</samp> namespace
in that tag. </p>
<p>The parser converts the TLF tags to TLF classes (such as SpanElement
or DivElement) in the new TextFlow object.</p>
<p>This example used with permission from <a href="http://blog.flexexamples.com" target="_blank">http://blog.flexexamples.com</a>.</p>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff8_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff8_verapache"><!-- --></a>
<h4 class="topictitle4">Creating a TextFlow object with
the TextConverter class</h4>
<div>
<p>You can use the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/conversion/TextConverter.html" target="_blank">TextConverter</a> class
to import content into a TextFlow. This is a little more advanced
than using the TextFlowUtil methods to create a TextFlow object.
Those methods act as wrappers around the TextConverter class. When you
import text with the TextConverter class’s <samp class="codeph">importToFlow()</samp> method, however,
you can specify the format of the text. This determines how the
content is stored. </p>
<div class="p">The following are the types of formats you can specify when using
the <samp class="codeph">importToFlow()</samp> method:<ul>
<li>
<p>HTML</p>
</li>
<li>
<p>Plain text</p>
</li>
<li>
<p>TLF</p>
</li>
</ul>
</div>
<p>If you specify the TLF format, then the imported text is used
to generate a text object model. If you specify plain text, then
the text is not interpreted, but instead stored as a simple text
string. If you specify HTML format, then the HTML tags in the text
are mapped to TLF classes (for example, <samp class="codeph">&lt;p&gt;</samp> is
mapped to a ParagraphElement object in the text object model).</p>
<div class="p">The following example imports an XML object into a TextFlow when
you click the Button control:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/AddingContentAsXML.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import spark.utils.TextFlowUtil;
import flashx.textLayout.elements.*;
import flashx.textLayout.conversion.*;
import mx.utils.*;
private var xml:XML = &lt;TextFlow xmlns='http://ns.adobe.com/textLayout/2008'&gt;&lt;p&gt;&lt;span&gt;This is a span&lt;/span&gt;&lt;/p&gt;&lt;/TextFlow&gt;;
private function addContent():void {
myRET.textFlow= TextConverter.importToFlow(xml, TextConverter.TEXT_LAYOUT_FORMAT);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="myRET" height="100" width="200"/&gt;
&lt;s:Button click="addContent()" label="Add Content"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The following example uses a variety of formats when importing
a String into the TextFlow with the <samp class="codeph">importToFlow()</samp> method:<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- sparksparktextcontrols/ImportToFlowExample.mxml --&gt;
&lt;s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.conversion.TextConverter;
XML.ignoreWhitespace = false;
]]&gt;
&lt;/fx:Script&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Declarations&gt;
&lt;!-- Define a String to use with HTML and plain text format. --&gt;
&lt;fx:String id="htmlTextAsHTML"&gt;&lt;![CDATA[&lt;p&gt;Hello &lt;b&gt;world!&lt;/b&gt;&lt;/p&gt;]]&gt;&lt;/fx:String&gt;
&lt;!-- Define an XML object to use with TLF format. --&gt;
&lt;fx:XML id="tfTextAsTextFlow"&gt;
&lt;TextFlow xmlns="http://ns.adobe.com/textLayout/2008"&gt;
&lt;p&gt;Hello &lt;span fontWeight="bold"&gt;world!&lt;/span&gt;&lt;/p&gt;
&lt;/TextFlow&gt;
&lt;/fx:XML&gt;
&lt;/fx:Declarations&gt;
&lt;s:RichText id="richTxt"
textFlow="{TextConverter.importToFlow(htmlTextAsHTML, TextConverter.TEXT_FIELD_HTML_FORMAT)}"
horizontalCenter="0" verticalCenter="0" /&gt;
&lt;s:RichText id="richTxt2"
textFlow="{TextConverter.importToFlow(htmlTextAsHTML, TextConverter.PLAIN_TEXT_FORMAT)}"
horizontalCenter="0" verticalCenter="0" /&gt;
&lt;s:RichText id="richTxt3"
textFlow="{TextConverter.importToFlow(tfTextAsTextFlow, TextConverter.TEXT_LAYOUT_FORMAT)}"
horizontalCenter="0" verticalCenter="0" /&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">When you use the <samp class="codeph">TEXT_LAYOUT_FORMAT</samp> type for
the TextConverter, the imported text must observe the following
rules:<ol>
<li>
<p>The first tag must be a <samp class="codeph">&lt;s:TextFlow&gt;</samp> tag.
The parser will not insert one for you as it does with the <samp class="codeph">TextFlowUtil.importFromXML()</samp> or <samp class="codeph">TextFlowUtil.importFromString()</samp> methods.</p>
</li>
<li>
<p>The first tag must specify a namespace for the imported text.
The namespace is <samp class="codeph">"http://ns.adobe.com/textLayout/2008"</samp>.</p>
</li>
<li>
<p>Subsequent tags must be supported by the TextFlow class.
For a list of supported tags, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ff6_verapache">Markup
tags supported in TextFlow objects</a>.</p>
</li>
</ol>
</div>
<p>The TextConverter class also lets you export a TextFlow object’s
content in a variety of formats. </p>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff7_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff7_verapache"><!-- --></a>
<h4 class="topictitle4">Creating a TextFlow object in ActionScript</h4>
<div>
<p>You can create TextFlow objects that are used by TLF-based
text controls in ActionScript. </p>
<div class="p">If you create a TextFlow object in ActionScript, the TextFlow
object requires that either the ParagraphElement or DivElement be
at the top level. The following example creates two ParagraphElement
objects and wraps them in SpanElement objects. It then adds these
objects as children of a TextFlow object, and adds them to a RichEditableText
control’s content:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimpleTextModelExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
import flashx.textLayout.elements.*;
private var textFlow:TextFlow = new TextFlow();
private var paragraph1:ParagraphElement = new ParagraphElement();
private var paragraph2:ParagraphElement = new ParagraphElement();
private var span1:SpanElement = new SpanElement();
private var span2:SpanElement = new SpanElement();
private function initApp():void {
span1.text = "This is paragraph one in myRET.";
span2.text = "This is paragraph two in myRET.";
paragraph1.addChild(span1);
paragraph2.addChild(span2);
textFlow.addChild(paragraph1);
textFlow.addChild(paragraph2);
myRET.textFlow = textFlow;
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="myRET" height="100" width="200"/&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff6_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff6_verapache"><!-- --></a>
<h3 class="topictitle3">Markup tags supported in TextFlow
objects</h3>
<div>
<p>The TLF parser converts supported markup elements to TLF
classes so that they can be used in the text object model. These
markup elements are similar to the HTML tags of the same names.
For example, if you specify a <samp class="codeph">&lt;p&gt;</samp> tag in
your text control’s content, then the parser converts it to a ParagraphElement
in the control’s TextFlow.</p>
<div class="p">The following table describes the supported elements of the text
object model:
<div class="tablenoborder"><table cellpadding="4" cellspacing="0" summary="" frame="border" border="1" rules="rows">
<thead align="left">
<tr>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e3312">
<p>Element</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e3318">
<p>Class</p>
</th>
<th class="cellrowborder" valign="top" width="NaN%" id="d891776e3324">
<p>Description</p>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>div</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>DivElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A division of text; can contain only div,
list, or p elements.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>p</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>ParagraphElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A paragraph; can contain any element except
div, list, or li.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>a</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>LinkElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A hypertext link, also known as an anchor;
can contain the tcy, span, img, tab, g, and br elements. This is
the only class in the text object model that supports Flex events.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>tcy</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>TCYElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A run of horizontal text, used in vertical
text such as Japanese; can contain the a, span, img, tab, g, or
br elements.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>span</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>SpanElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A run of text in a paragraph; cannot contain
other elements.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>img</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>InlineGraphicElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>An image in a paragraph element.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>tab</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>TabElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A tab character.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>br</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>BreakElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>A break character; text continues on the
next line, but does not start a new paragraph.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>list</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>ListElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>An ordered or unordered list. Can be simple
list or nested. You can customize the bullets. Can contain li elements
(ListItemElement) or other list elements.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>li</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>ListItemElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p>List items within a list element. Can be
ordered or unordered, nested or flat lists. You can customize the
markers as well as other settings of each list item.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3312 ">
<p>g</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3318 ">
<p>SubParagraphGroupElement</p>
</td>
<td class="cellrowborder" valign="top" width="NaN%" headers="d891776e3324 ">
<p> A group element. Used for grouping elements
in a paragraph. This lets you nest elements below the paragraph
level.</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff5_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff5_verapache"><!-- --></a>
<h3 class="topictitle3">Navigating TextFlow objects</h3>
<div>
<p>The TLF API provides methods and properties that let you
navigate the text object model after it is created. You can use
this API to perform actions on a individual leaves or the entire
tree.</p>
<div class="p">The following example iterates over the RichEditableText control’s
TextFlow and copies the contents of each SpanElement, one at a time,
into another RichEditableText control:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/IterateOverLeaves.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.elements.*;
private function copyContents():void {
/* Get the first leaf in the TextFlow. */
var leaf:SpanElement = new SpanElement();
leaf = SpanElement(richTxt1.textFlow.getFirstLeaf());
/* Write the contents of the first leaf to the second RET control. */
richTxt2.text = "LEAF:" + leaf.text + "\n";
/* Iterate over the remaining leaves and write their contents
to the second RET control. */
while(leaf = SpanElement(leaf.getNextLeaf())) {
richTxt2.text += "LEAF:" + leaf.text + "\n";
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:Panel&gt;
&lt;s:RichEditableText id="richTxt1" selectable="true" editable="true" textAlign="justify" percentWidth="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;&lt;s:span&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;2) Cras posuere posuere sem, eu congue orci mattis quis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;3) Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Panel&gt;
&lt;s:HGroup&gt;
&lt;s:Button label="Copy Contents" click="copyContents()"/&gt;
&lt;s:Button label="Clear" click="richTxt2.text=''"/&gt;
&lt;/s:HGroup&gt;
&lt;s:Panel&gt;
&lt;s:RichEditableText id="richTxt2" textAlign="justify" percentWidth="100"/&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The <samp class="codeph">TextFlow.findLeaf()</samp> method lets you specify
a character position and returns the entire flow element where that
character position occurs. The following example changes the color
of the entire SpanElement whenever the user clicks on any location
within that SpanElement’s paragraph:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/FindLeafExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.elements.TextRange;
import flashx.textLayout.elements.*;
private function selectEntireLeaf(e:Event):void {
/* Get the location of the cursor. This is the character position of the
cursor in the RichEditableText control after the user clicks on it. */
var activePos:int = richTxt1.selectionActivePosition;
/* Change the color of the entire leaf under the cursor position. */
var leaf:SpanElement = richTxt1.textFlow.findLeaf(activePos) as SpanElement;
leaf.color = 0x00FF33;
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:Panel&gt;
&lt;s:RichEditableText id="richTxt1" click="selectEntireLeaf(event)" selectable="true" editable="true" textAlign="justify" percentWidth="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;&lt;s:span&gt;1) Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;2) Cras posuere posuere sem, eu congue orci mattis quis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;3) Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">You can access the objects in a TextFlow by their object names
and set the values of properties such as <samp class="codeph">color</samp> or <samp class="codeph">direction</samp> on
them in ActionScript. The text in the controls update accordingly,
as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/ManipulateTextModelExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
import flashx.textLayout.elements.*;
private var textFlow:TextFlow = new TextFlow();
private var paragraph1:ParagraphElement = new ParagraphElement();
private var paragraph2:ParagraphElement = new ParagraphElement();
private var span1:SpanElement = new SpanElement();
private var span2:SpanElement = new SpanElement();
private function initApp():void {
span1.text = "This is paragraph one.";
span2.text = "This is paragraph two.";
paragraph1.addChild(span1);
paragraph2.addChild(span2);
textFlow.addChild(paragraph1);
textFlow.addChild(paragraph2);
myRET.textFlow = textFlow;
}
private function changeColors():void {
// Change color of first paragraph.
paragraph1.color = 0xFF00FF;
// Change color of second paragraph.
paragraph2.setStyle("color", 0x00FF00);
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="myRET" height="100" width="200"&gt;
&lt;/s:RichEditableText&gt;
&lt;s:Button label="Change Colors" click="changeColors()"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>This example shows that you can set styles by using either the <samp class="codeph">setStyle()</samp> method
or the property accessors. For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ff2_verapache">Styling
TLF-based text controls</a>.</p>
<div class="p">You can also access the objects in the text object model by using
their ids. You do this with the TextFlow class’s <samp class="codeph">getElementById()</samp> method.
This requires that you set the <samp class="codeph">id</samp> property of the
flow elements, as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/AccessTextFlowMethods.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
import flashx.textLayout.elements.*;
private var textFlow:TextFlow = new TextFlow();
private var paragraph1:ParagraphElement = new ParagraphElement();
private var paragraph2:ParagraphElement = new ParagraphElement();
private var span1:SpanElement = new SpanElement();
private var span2:SpanElement = new SpanElement();
private function initApp():void {
span1.id = "span1";
span2.id = "span2";
paragraph1.id = "paragraph1";
paragraph2.id = "paragraph2";
span1.text = "This is paragraph one.";
span2.text = "This is paragraph two.";
paragraph1.addChild(span1);
paragraph2.addChild(span2);
textFlow.addChild(paragraph1);
textFlow.addChild(paragraph2);
myRET.textFlow = textFlow;
}
private function changeColors():void {
// Set color of paragraph one.
textFlow.getElementByID("paragraph1").setStyle("color", 0xFF0000);
// Set color of paragraph two.
textFlow.getElementByID("paragraph2").setStyle("color", 0xFF0000);
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="myRET" height="100" width="200"&gt;
&lt;/s:RichEditableText&gt;
&lt;s:Button label="Change Colors" click="changeColors()"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>In the previous example, because the text flow elements are created
programmatically, their <samp class="codeph">id</samp> properties are also
set explicitly on the objects that represent the span and paragraph
elements. If you were creating the text flow with HTML markup, you
would specify the value of the <samp class="codeph">id</samp> property in the
HTML tag (for example, <samp class="codeph">&lt;span id="span1"&gt;</samp>).</p>
<p>Another way to “walk the tree” of a TextFlow object is to use
the methods of the ParagraphElement class. This class helps you
access low-level items such as atoms and words. For example, you
can use the <samp class="codeph">findNextWordBoundary()</samp> and <samp class="codeph">findPreviousWordBoundary()</samp> methods
to navigate the word boundaries in the flow element’s text.</p>
<div class="p">The following example uses methods of the ParagraphElement class
to count the words and determine the average length of them in the
TextFlow:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/FindWords.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.elements.*;
private function countWords():void {
var leaf:SpanElement = new SpanElement();
leaf = SpanElement(richTxt1.textFlow.getFirstLeaf());
var p:ParagraphElement = new ParagraphElement();
p = leaf.getParagraph();
doSomething(p);
while (leaf = SpanElement(leaf.getNextLeaf())) {
p = leaf.getParagraph();
doSomething(p);
}
wcLabel.text += "# Words: " + wordCount;
lenLabel.text += "Avg length of each word: " + lenTotal/wordCount + " chars";
}
private var wordCount:int = 0;
private var lenTotal:int = 0;
private function doSomething(p:ParagraphElement):void {
var wordBoundary:int = 0;
var prevBoundary:int = 0;
// If these are equal, then there are no more words.
while (wordBoundary != p.findNextWordBoundary(wordBoundary)) {
if (p.findNextWordBoundary(wordBoundary) - wordBoundary &gt; 1) {
wordCount += 1;
}
prevBoundary = wordBoundary;
wordBoundary = p.findNextWordBoundary(wordBoundary);
// If the value is greater than 1, then it's a word, otherwise it's a space.
if (wordBoundary - prevBoundary &gt; 1) {
var s:String = p.getText().substring(prevBoundary, wordBoundary);
lenTotal += s.length;
}
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:Panel&gt;
&lt;s:RichEditableText id="richTxt1" selectable="true" editable="true" textAlign="justify" percentWidth="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;&lt;s:span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;Cras posuere posuere sem, eu congue orci mattis quis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;s:p&gt;&lt;s:span&gt;Curabitur pulvinar tellus venenatis ipsum tempus lobortis.&lt;/s:span&gt;&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Panel&gt;
&lt;s:VGroup&gt;
&lt;s:Button label="Count" click="countWords()"/&gt;
&lt;s:Label id="wcLabel"/&gt;
&lt;s:Label id="lenLabel"/&gt;
&lt;/s:VGroup&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff4_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff4_verapache"><!-- --></a>
<h3 class="topictitle3">Adding images with TLF</h3>
<div>
<p>TLF supports embedding images in text controls by using
the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/InlineGraphicElement.html" target="_blank">InlineGraphicElement</a> class.
To add an image to the text object model, use the <samp class="codeph">&lt;img&gt;</samp> tag
in a <samp class="codeph">&lt;s:textFlow&gt;</samp> tag or the default property,
or create an instance of the InlineGraphicElement class.</p>
<p>The InlineGraphicElement class can point to an image file, such
as a GIF, JPG, or PNG file. </p>
<p>You specify the location of the image by using the <samp class="codeph">source</samp> property.
The location can be relative to the deployed location of the application
(for example, “images/butterfly.gif”) or it can be a full path to
the image (for example, “http://yourserver.com/images/butterfly.gif”).</p>
<div class="p">The following example loads a simple image from a local location:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimpleInlineGraphic.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="doSomething()"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.elements.*;
import flashx.textLayout.*;
[Bindable]
private var textFlow:TextFlow;
private var img:InlineGraphicElement;
private function doSomething():void {
textFlow = new TextFlow();
var p:ParagraphElement = new ParagraphElement();
img = new InlineGraphicElement();
img.source = "assets/butterfly.gif";
img.height = 100;
img.width = 100;
p.addChild(img);
textFlow.addChild(p);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:Panel title="Simple Inline Graphic Image"
width="90%" height="90%"
horizontalCenter="0" verticalCenter="0"&gt;
&lt;s:RichEditableText id="richTxt" textAlign="justify" width="100%"
textFlow="{textFlow}" /&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">As with text-based examples, you can use a variety of techniques
to load the image with an InlineGraphicElement object. The following
example uses child tags:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimpleInlineGraphicTags.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:Panel title="Simple Inline Graphic Image"
width="90%" height="90%"
horizontalCenter="0" verticalCenter="0"&gt;
&lt;s:RichEditableText id="richTxt" textAlign="justify" width="100%"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
&lt;s:img source="@Embed(source='../assets/butterfly.gif')" height="100" width="100"/&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">Rather than load the image at run time, you can also use an embedded
image for the InlineGraphicImage object’s source, as the following
example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimpleEmbed.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
[Embed(source="../assets/butterfly.gif")]
[Bindable]
public var imgCls:Class;
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="richTxt" textAlign="justify" width="100%"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
&lt;s:img id="myImage" source="{imgCls}" height="100" width="100"/&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The InlineGraphicElement class can also display a drawn element,
such as a Sprite or an FXG component. The following example loads
an FXG component into the InlineGraphicElement:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/FXGInlineGraphic.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:comps="comps.*"
creationComplete="doSomething()"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.elements.*;
import flashx.textLayout.*;
import comps.*;
[Bindable]
private var textFlow:TextFlow;
private var img:InlineGraphicElement;
private function doSomething():void {
textFlow = new TextFlow();
var p:ParagraphElement = new ParagraphElement();
img = new InlineGraphicElement();
img.source = new ArrowAbsolute();
img.height = 100;
img.width = 100;
p.addChild(img);
textFlow.addChild(p);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:Panel title="FXG Inline Graphic Image"
width="90%" height="90%"
horizontalCenter="0" verticalCenter="0"&gt;
&lt;s:RichEditableText id="richTxt" textAlign="justify" width="100%"
textFlow="{textFlow}" /&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The FXG component used in this example is as follows:<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- textcontrols/comps/ArrowAbsolute.fxg --&gt;
&lt;fxg:Graphic xmlns:fxg="http://ns.adobe.com/fxg/2008" version="1"&gt;
&lt;!-- Use Use compact syntax with absolute coordinates. --&gt;
&lt;fxg:Path data="
M 20 0
C 50 0 50 35 20 35
L 15 35
L 15 45
L 0 32
L 15 19
L 15 29
L 20 29
C 44 29 44 6 20 6
"&gt;
&lt;!-- Define the border color of the arrow. --&gt;
&lt;fxg:stroke&gt;
&lt;fxg:SolidColorStroke color="#888888"/&gt;
&lt;/fxg:stroke&gt;
&lt;!-- Define the fill for the arrow. --&gt;
&lt;fxg:fill&gt;
&lt;fxg:LinearGradient rotation="90"&gt;
&lt;fxg:GradientEntry color="#000000" alpha="0.8"/&gt;
&lt;fxg:GradientEntry color="#FFFFFF" alpha="0.8"/&gt;
&lt;/fxg:LinearGradient&gt;
&lt;/fxg:fill&gt;
&lt;/fxg:Path&gt;
&lt;/fxg:Graphic&gt; </pre>
</div>
<p>For more information about using FXG, see <a href="flx_fxg_fx.html#WS145DAB0B-A958-423f-8A01-12B679BA0CC7_verapache">FXG
and MXML graphics</a>.</p>
<div class="p">If you do not know the image’s dimensions, you can use the InlineGraphicElement
class’s <samp class="codeph">measuredHeight</samp> and <samp class="codeph">measuredWidth</samp> properties
to define the size of the image. You can only use these properties
after the image loads. To do this, you can trigger a function that
sizes the image off of the TextFlow object’s <samp class="codeph">StatusChangeEvent</samp> event,
as the following example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/LoadImageEvent.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="initApp()"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.events.StatusChangeEvent;
import flashx.textLayout.elements.*;
import flashx.textLayout.*;
[Bindable]
private var textFlow:TextFlow;
private var img:InlineGraphicElement;
private function initApp():void {
textFlow = new TextFlow();
textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, sizeGraphic);
var p:ParagraphElement = new ParagraphElement();
img = new InlineGraphicElement();
img.source = "assets/butterfly.gif";
p.addChild(img);
textFlow.addChild(p);
}
private function sizeGraphic(e:StatusChangeEvent):void {
if (e.status == "ready" || e.status == "sizePending") {
img.height = img.measuredHeight;
img.width = img.measuredWidth;
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:Panel title="Sizing Inline Graphic Image"
width="90%" height="90%"
horizontalCenter="0" verticalCenter="0"&gt;
&lt;s:RichEditableText id="richTxt" textAlign="justify" width="100%"
textFlow="{textFlow}" /&gt;
&lt;/s:Panel&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can get a reference to the InlineGraphicElement’s graphic
by using the <samp class="codeph">graphic</samp> property. This property points
to the embedded DisplayObject. This lets you interact with the InlineGraphicElement
in the same ways that you can interact with any DisplayObject. For
example, you can apply blend modes, change the alpha, rotate, and
scale the image.</p>
<div class="p">The following example changes the <samp class="codeph">alpha</samp> of the
DisplayObject when you move the slider:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/DisplayObjectImageElement.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
private function changeAlpha():void {
myImage.graphic.alpha = .5;
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="richTxt" textAlign="justify" width="100%"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
&lt;s:img id="myImage"
source="@Embed(source='../assets/butterfly.gif')"
height="100" width="100"/&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;s:HSlider id="hSlider"
minimum="0" maximum="1"
value="1"
stepSize="0.1"
snapInterval="0.1"
liveDragging="true"
valueCommit="myImage.graphic.alpha=hSlider.value;"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>Note that the previous example uses a RichEditableText control
and not a RichText control. The RichEditableText control supports
user interaction, while the RichText control does not.</p>
</div>
<div class="nested3" id="WS19f279b149e7481c2028ff4112df207af8b-8000_verapache"><a name="WS19f279b149e7481c2028ff4112df207af8b-8000_verapache"><!-- --></a>
<h4 class="topictitle4">Positioning images inline</h4>
<div>
<div class="p">To position the InlineGraphicElement within a text element,
you use the following properties:<ul>
<li>
<p>
<samp class="codeph">float</samp> property
of the InlineGraphicElement class</p>
</li>
<li>
<p>
<samp class="codeph">clearFloats</samp> property of the FlowElement
(or the <samp class="codeph">clearFloats</samp> style property of the text
container)</p>
</li>
<li>
<p>
<samp class="codeph">paddingTop/paddingBottom/paddingLeft/paddingRight</samp> properties
on the FlowElement class</p>
</li>
</ul>
</div>
<div class="p">The <samp class="codeph">float</samp> property controls the placement of
the inline graphic within the text. The following example shows
a simple image surrounded by text. By changing the value of the <samp class="codeph">float</samp> property,
you can change the way text flows around the image, as the following
example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFFloat.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function changeSelection(event:Event):void {
image1.float = event.currentTarget.selectedItem;
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:HGroup&gt;
&lt;s:Label text="float for the image (default:none):"/&gt;
&lt;s:ComboBox id="cb1"
change="changeSelection(event)"
creationComplete="cb1.selectedIndex=0"&gt;
&lt;s:ArrayCollection&gt;
&lt;fx:String&gt;none&lt;/fx:String&gt;
&lt;fx:String&gt;left&lt;/fx:String&gt;
&lt;fx:String&gt;right&lt;/fx:String&gt;
&lt;fx:String&gt;start&lt;/fx:String&gt;
&lt;fx:String&gt;end&lt;/fx:String&gt;
&lt;/s:ArrayCollection&gt;
&lt;/s:ComboBox&gt;
&lt;/s:HGroup&gt;
&lt;s:RichEditableText id="myRET1" width="300"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow columnWidth="290"&gt;
&lt;s:p id="p1"&gt;Images in a flow are a good thing. For example, here is a float. &lt;s:img id="image1" float="none" source="@Embed(source='../assets/bulldog.jpg')" paddingRight="10" paddingTop="10" paddingBottom="10" paddingLeft="10"&gt;&lt;/s:img&gt;Don't you agree?
It should show on the left. If it doesn't show up on the left, then it is a bug. You can submit bugs at http://bugs.adobe.com/jira/. You can set how the float is positioned within
the paragraph by using the ComboBox below. You can select left, right, start, end, or none. This example does not use the clearFloats property. That is in a different example.&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You use the constants defined by the flashx.textLayout.formats.Float
class to set the value of the <samp class="codeph">float</samp> property. The
values “left” and “right” indicate that the image should be left-aligned
or right-aligned within the text. The values of “start” and “end”
are similar, in that they left- and right-align the image, but the meanings
of them depend on the direction of the text (RTL or LTR). For RTL
text, for example, “end” means the end of the line, which is typically
the left side and “start” means the start of the line, which is
typically the right side. The value of “none” means that no text
should flow around the image. The default value is “none”.</p>
<div class="p">The <samp class="codeph">clearFloats</samp> property controls the placement
of the paragraph elements relative to the <samp class="codeph">float</samp>.
For example, if you want to ensure that a second paragraph after
a floating image starts below the image, you might set <samp class="codeph">clearFloats</samp> on
the second paragraph to “both” or “left”, as the following example
shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFClearFloats.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:HGroup&gt;
&lt;s:Label text="clearFloats for second paragraph (default:none):"/&gt;
&lt;s:ComboBox id="cb1"
change="p2.clearFloats = cb1.selectedItem"
creationComplete="cb1.selectedIndex=0"&gt;
&lt;s:ArrayCollection&gt;
&lt;fx:String&gt;none&lt;/fx:String&gt;
&lt;fx:String&gt;left&lt;/fx:String&gt;
&lt;fx:String&gt;right&lt;/fx:String&gt;
&lt;fx:String&gt;start&lt;/fx:String&gt;
&lt;fx:String&gt;end&lt;/fx:String&gt;
&lt;fx:String&gt;both&lt;/fx:String&gt;
&lt;/s:ArrayCollection&gt;
&lt;/s:ComboBox&gt;
&lt;/s:HGroup&gt;
&lt;s:RichEditableText id="myRET1" width="300" height="400"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow columnWidth="275"&gt;
&lt;s:p id="p0" fontWeight="bold"&gt;Heading 1&lt;/s:p&gt;
&lt;s:p id="p1"&gt;Images in a flow are a good thing. &lt;s:img id="image1" float="left" source="@Embed(source='../assets/bulldog.jpg')" paddingRight="10" paddingTop="10" paddingBottom="10" paddingLeft="10"&gt;&lt;/s:img&gt; You can use the ComboBox to change the clearFloats value on the second paragraph ("Heading 2"). This should ensure that Heading 2 starts on a new line after the image.&lt;/s:p&gt;
&lt;s:p id="p2" fontWeight="bold"&gt;Heading 2&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You use the constants defined by the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/formats/ClearFloats.html" target="_blank">flashx.textLayout.formats.ClearFloats</a> class to
set the value of the <samp class="codeph">clearFloats</samp> property. The
values “left” and “right” indicate that the new paragraph should
be placed after any float that appears on the left or right. As
with the <samp class="codeph">float</samp> property, the “start” and “end”
values are dependent on the direction of the text in the paragraph.
A value of “both” causes text to appear after all floats. A value
of “none” lets the text appear next to the float. The default value
is “none”.</p>
<p>Note that you can also set the <samp class="codeph">clearFloats</samp> property
as a style on the TLF-based text controls such as RichEditableText
and Spark TextArea. This style property is inheritable, which means
that all child flow elements will inherit the value you set on the
control.</p>
<p>To further customize the location of images within text blocks,
you can apply the padding properties (<samp class="codeph">paddingTop</samp>, <samp class="codeph">paddingBottom</samp>, <samp class="codeph">paddingRight</samp>,
and <samp class="codeph">paddingLeft</samp>) to any FlowElement object, including
an InlineGraphicElement object such as an image. This lets you control
the offset of the image from the margin as well as the offset between
the image and the text that wraps around it. </p>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff3_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff3_verapache"><!-- --></a>
<h3 class="topictitle3">Adding hyperlinks with TLF</h3>
<div>
<p>TLF-based text controls support hyperlinks with the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/LinkElement.html" target="_blank">LinkElement</a> class.
To insert a hyperlink into the TextFlow, you use the <samp class="codeph">&lt;a&gt;</samp> tag
in a <samp class="codeph">&lt;s:textFlow&gt;</samp> tag or the default property,
or create an instance of the LinkElement class. </p>
<p>You can only use hyperlinks in a TextFlow object in the TextArea
and RichEditableText controls. The Spark Label, TextInput, and RichText
controls do not support hyperlinks.</p>
<div class="p">The default behavior of a LinkElement object in the text object
model is to launch a new browser window and navigate to the location
specified in the <samp class="codeph">href</samp> property of the LinkElement
object. The following example shows a basic navigation link:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimpleLinkElement.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText id="richTxt"
editable="false"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
The following link takes you to: &lt;s:a href="http://www.adobe.com"&gt;Adobe.com&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;s:RichEditableText id="richTxt2"
editable="true"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
Hold CTRL key down when using the following link: &lt;s:a href="http://www.adobe.com"&gt;Adobe.com&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>To ensure that your links use the hand cursor when the user mouses
over them, set the <samp class="codeph">editable</samp> property to <samp class="codeph">false</samp> on
the RichEditableText object. If you do not, then your user must
hold the Control key down while moving the cursor over the link
to be able to click on that link.</p>
<p>The LinkElement is the only flow element that supports Flex events.
Supported events include <samp class="codeph">click</samp>, <samp class="codeph">mouseDown</samp>,
and <samp class="codeph">rollOut</samp>.</p>
<p>While the default behavior of the LinkElement object is to launch
a new browser window and open the specified link as a new page,
you can also define a custom event handler for the <samp class="codeph">click</samp> event.
The easiest way to do this is to exclude the <samp class="codeph">href</samp> attribute
from the anchor tag. </p>
<div class="p">The following example defines custom behavior for the <samp class="codeph">click</samp> event
of the LinkElement object. It does not specify a destination link
in the LinkElement, but instead builds one in the <samp class="codeph">click</samp> event
handler:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/CustomLinkElement.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.events.FlowElementMouseEvent;
import mx.collections.ArrayCollection;
[Bindable]
public var myArray:ArrayCollection = new ArrayCollection(["Flex", "Flash", "ActionScript"]);
private function handleClickEvent(e:FlowElementMouseEvent):void {
var url:String = "http://www.google.com/search?q=" + productList.selectedItem;
navigateToURL(new URLRequest(url), '_blank');
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="richTxt"
editable="false"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
Search for product info on &lt;s:a click="handleClickEvent(event)"&gt;Google&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;s:ComboBox id="productList" dataProvider="{myArray}" prompt="Select one"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can also suppress the click event in the event handler by
calling the <samp class="codeph">stopPropagation()</samp> and <samp class="codeph">preventDefault()</samp> methods
in the <samp class="codeph">click</samp> event’s handler. </p>
<p>The <samp class="codeph">stopPropagation()</samp> method prevents processing
of any event listeners in nodes subsequent to the current node in
the event flow. The <samp class="codeph">preventDefault()</samp> method cancels
the event’s default behavior.</p>
<div class="p">You can then access properties of the LinkElement object to carry
out additional actions. The following example presents the user
with an option of navigating to the target location or cancelling
the action:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/CustomLinkElementHandling.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
import flashx.textLayout.events.FlowElementMouseEvent;
import flashx.textLayout.elements.LinkElement;
import mx.controls.Alert;
import mx.events.CloseEvent;
private var linkTarget:String;
private function doSomething(e:FlowElementMouseEvent):void {
e.stopImmediatePropagation();
e.preventDefault();
var le:LinkElement = e.flowElement as LinkElement;
linkTarget = le.href;
Alert.show("You are about to navigate away from this page.","Alert",Alert.OK | Alert.CANCEL, this, alertListener, null, Alert.OK);
}
private function alertListener(e:CloseEvent):void {
if (e.detail == Alert.OK) {
navigateToURL(new URLRequest(linkTarget), '_self')
}
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="richTxt"
editable="false"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
The following link takes you to: &lt;s:a href="http://www.adobe.com" target="_blank" click="doSomething(event)"&gt;Adobe.com&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The default styling for a LinkElement is underlined, blue text.
To style the links in TLF, you can use a SpanElement object and
set style properties on that. The following example removes the
underline, and makes the link color red rather than blue:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/StyledLinkElement.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText id="richTxt"
editable="false"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
The following link takes you to: &lt;s:a href="http://www.adobe.com"&gt;&lt;s:span color="0xFF0066" textDecoration="none"&gt;Adobe.com&lt;/s:span&gt;&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can also use the TextLayoutFormat class to style hyperlinks.
For more information, see <a href="flx_sparktextcontrols_stc.html#WS02f7d8d4857b1677-165a04e1126951a2d98-7ff0_verapache">Applying
styles with the TextLayoutFormat class</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff2_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff2_verapache"><!-- --></a>
<h3 class="topictitle3">Styling TLF-based text controls</h3>
<div>
<p>The Spark text controls TextInput, TextArea, Label, RichText,
and RichEditableText support specifying default text formatting
with CSS styles. The complete set of styles supports all of TLF’s
formatting capabilities, including kerning and bidirectionality.</p>
<p>The names and descriptions of the styles supported by the TLF
text controls are the described in the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/formats/TextLayoutFormat.html" target="_blank">TextLayoutFormat</a> and <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/edit/SelectionFormat.html" target="_blank">SelectionFormat</a> classes.</p>
<div class="p">The default values for these styles is defined by the <samp class="codeph">global</samp> selector
in the defaults.css file. This file is compiled into the framework.swc
file. To change the values of the defaults, you can create your
own global selector; for example:<pre class="codeblock">&lt;fx:Styles&gt;
global {
fontFamily: "Verdana"
}
&lt;/fx:Style&gt;</pre>
</div>
<p>TLF’s FlowElement tags such as <samp class="codeph">&lt;p&gt;</samp> and <samp class="codeph">&lt;span&gt;</samp>,
which are supported in the content of the RichText or RichEditableText
controls, support formatting only with properties, not using CSS.
As a result, to set styles on individual flow elements, you must
set them as you would set a style property, but not in CSS. </p>
<div class="p">The following example shows setting style properties on the paragraphs.
It shows you that you can set the style properties either with the <samp class="codeph">setStyle()</samp> method
or as a property assignment.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFStylesProperties.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
import flashx.textLayout.elements.*;
private function initApp():void {
// You cannot set these properties in CSS.
// Set color of first paragraph to red with the setStyle() method.
myRET.textFlow.getChildAt(0).setStyle("color", 0xFF0000);
// Set color of second paragraph to green with a property assignment.
myRET.textFlow.getChildAt(1).color = 0x00FF00;
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="myRET" height="100" width="200"&gt;
&lt;s:p id="p1"&gt;This is paragraph 1.&lt;/s:p&gt;
&lt;s:p id="p2"&gt;This is paragraph 2.&lt;/s:p&gt;
&lt;/s:RichEditableText&gt;
&lt;s:Button click="initApp()" label="Apply Styles"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The RichText and RichEditableText controls support additional
style properties that Label does not. These properties include properties
related to columns and paragraphs, including <samp class="codeph">columnCount</samp>, <samp class="codeph">columnGap</samp>, <samp class="codeph">paragraphSpaceAfter</samp>, <samp class="codeph">paragraphStartIndent</samp>,
and <samp class="codeph">whiteSpaceCollapse</samp>.</p>
<p>The RichEditableText control supports style properties that are
not supported by the Label and RichText controls. These properties
include <samp class="codeph">selectionColor</samp>, <samp class="codeph">inactiveSelectionColor</samp>,
and <samp class="codeph">unfocusedSelectionColor</samp>. </p>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff1_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff1_verapache"><!-- --></a>
<h4 class="topictitle4">Style inheritance</h4>
<div>
<p>Some styles are inheriting, meaning that if you set them
on a container they affect the children of that container. Generally,
the choice of whether a CSS style is inheriting or non-inheriting
is made based on whether the corresponding TLF format inherits from
the parent FlowElement to the child FlowElement.</p>
<div class="p">The following example shows an inheriting style and a non-inheriting
style set on the Button control. The inheriting style, <samp class="codeph">color</samp>,
is applied to the text, but the non-inheriting style, <samp class="codeph">backgroundColor</samp>,
is not.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFStyles.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
s|Button {
color: red;
backgroundColor: #33CC99;
}
&lt;/fx:Style&gt;
&lt;s:Button label="Click Me"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>Because a skinnable component is a type of Spark container, inheriting
styles are inherited by children of the container. If you set an
inheriting style such as <samp class="codeph">fontSize</samp> on a Spark Button,
for example, the style is applied to the Label class that renders
the Button’s label. The Label control is defined in the ButtonSkin class.
The parts that make up a larger component are known as subcomponents. If
you set a non-inheriting style such as <samp class="codeph">backgroundColor</samp> it
will not affect the Label subcomponent of a Button; instead you
can create a custom type selector for Label, or you can reskin the
Button and set the value of the <samp class="codeph">backgroundColor</samp> property
directly on the Label. </p>
<div class="p">To set the value of a non-inheriting style property on the Button’s
label, you can set the value of the <samp class="codeph">backgroundColor</samp> property
in a Label type selector. The following example sets the <samp class="codeph">backgroundColor</samp> style
to #33CC99 for the Label type, which affects the way the Button
control’s label is rendered because the Label class is a subcomponent
of Button:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFStylesSubComps.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
s|Button {
color: red;
}
s|Label {
backgroundColor: #33CC99;
}
&lt;/fx:Style&gt;
&lt;s:Button label="Click Me"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>For the TextArea and TextInput controls, the text is rendered
by a RichEditableText subcomponent. You can access the RichEditableText
subcomponent by casting the result of the <samp class="codeph">textDisplay</samp> property
to a type that supports the <samp class="codeph">setStyle()</samp> method.
You can then call the <samp class="codeph">setStyle()</samp> method on this object,
which applies non-inheritable style properties to the subcomponent. </p>
<p>Note that this technique does not work for mobile versions of
the TextArea and TextInput controls because the mobile skins do
not include support for the RichEditableText subcomponent. </p>
<div class="p">The following example illustrates the difference between correctly
and incorrectly applying a non-inheriting style property to a pair
of TextArea controls:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TextAreaStyling.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="doSomething()"&gt;
&lt;fx:Script&gt;
import spark.components.RichEditableText;
private function doSomething():void {
/* To set a non-inheritable style on a TextArea, you must actually
apply it to the underlying RichEditableText subcomponent, which is
accessed through the textDisplay property: */
RichEditableText(text1.textDisplay).setStyle("columnCount", 2);
/* Setting a non-inheritable style directly on the TextArea does
not apply the style properly. */
text2.setStyle("columnCount", 2);
}
&lt;/fx:Script&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:TextArea id="text1" width="200" height="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;This is TextArea #1. This is enough text to ensure that there will be more than one column if the columnCount property is properly applied.&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:TextArea&gt;
&lt;s:TextArea id="text2" width="200" height="100"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;This is TextArea #2. This is enough text to ensure that there will be more than one column if the columnCount property is properly applied.&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:TextArea&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">You can also change the number of columns in a TextFlow object
by setting the <samp class="codeph">columnCount</samp> property on the <samp class="codeph">&lt;s:TextFlow&gt;</samp> tag,
as the following example shows:<pre class="codeblock">&lt;s:TextFlow columnCount="2"&gt;</pre>
</div>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff0_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7ff0_verapache"><!-- --></a>
<h4 class="topictitle4">Applying styles with the TextLayoutFormat
class</h4>
<div>
<p>To style TLF-based text controls, you can also use the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/formats/TextLayoutFormat.html" target="_blank">TextLayoutFormat</a> class.
You begin by creating an instance of the TextLayoutFormat class.
You can then set any formatting properties on that object, including
paragraph indentation, leading, justification, and typographic case.
Finally, you specify the custom TextLayoutFormat with the TextFlow
object’s <samp class="codeph">hostFormat</samp> property.</p>
<div class="p">The following example sets various styles on the text:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TextLayoutFormatExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
import flashx.textLayout.formats.*;
private function initApp():void {
var textLayoutFormat:TextLayoutFormat = new TextLayoutFormat();
textLayoutFormat.color = 0x336633;
textLayoutFormat.fontFamily = "Arial, Helvetica, _sans";
textLayoutFormat.fontSize = 14;
textLayoutFormat.paragraphSpaceBefore = 15;
textLayoutFormat.paragraphSpaceAfter = 15;
textLayoutFormat.typographicCase = TLFTypographicCase.LOWERCASE_TO_SMALL_CAPS;
textFlow.hostFormat = textLayoutFormat;
}
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="richTxt"
editable="false"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow id="textFlow"&gt;
&lt;s:p&gt;
The following link takes you to &lt;s:a href="http://www.adobe.com"&gt;Adobe.com&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;s:p&gt;
The following link takes you to &lt;s:a href="http://www.omniture.com"&gt;Omniture.com&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">You can define a TextLayoutFormat object inline, rather than
in ActionScript. The following example defines TextLayoutFormat
objects that style the hyperlink, based on its state:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/StyledLinkElement2.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;s:RichEditableText id="richTxt"
editable="false"
focusEnabled="false"&gt;
&lt;s:textFlow&gt;
&lt;s:TextFlow&gt;
&lt;s:p&gt;
&lt;s:linkHoverFormat&gt;
&lt;s:TextLayoutFormat color="#33CC00" textDecoration="underline"/&gt;
&lt;/s:linkHoverFormat&gt;
&lt;s:linkNormalFormat&gt;
&lt;s:TextLayoutFormat color="#009900"/&gt;
&lt;/s:linkNormalFormat&gt;
&lt;s:a href="http://www.adobe.com"&gt;Adobe.com&lt;/s:a&gt;
&lt;/s:p&gt;
&lt;/s:TextFlow&gt;
&lt;/s:textFlow&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
<div class="nested3" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fef_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fef_verapache"><!-- --></a>
<h4 class="topictitle4">Applying styles with the Configuration
class</h4>
<div>
<p>Another approach to styling TLF is to use the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/Configuration.html" target="_blank">Configuration</a> class.
This class provides access to some properties of text, such as its
state. For example, you can use this class to define the appearance
of a hyperlink when it is active or when it is hovered over. You
can also use this class to define the appearance of text when it
is selected.</p>
<p>To use a Configuration object with TLF, you define the styles
on the TextLayoutFormat or SelectionFormat objects and assign them
to the Configuration object’s format properties. </p>
<div class="p">The format properties include the following:<ul>
<li>
<p>
<samp class="codeph">defaultLinkActiveFormat</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">defaultLinkHoverFormat</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">defaultLinkNormalFormat</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">focusedSelectionFormat</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">inactiveSelectionFormat</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">textFlowInitialFormat</samp>
</p>
</li>
<li>
<p>
<samp class="codeph">unfocusedSelectionFormat</samp>
</p>
</li>
</ul>
</div>
<div class="p">The following example defines the appearance of the hyperlink
by using custom TextLayoutFormat objects attached to a Configuration
object:<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- sparktextcontrols/StylingWithConfig.mxml --&gt;
&lt;s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp()"&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.IConfiguration;
import flashx.textLayout.formats.ITextLayoutFormat;
import flashx.textLayout.formats.TextDecoration;
import flashx.textLayout.formats.TextLayoutFormat;
private function initApp():void {
var txt:String = "Check out our website at &lt;a href='http://www.adobe.com/'&gt;adobe.com&lt;/a&gt;.";
var cfg:Configuration = new Configuration(true);
var normalFmt:TextLayoutFormat = new TextLayoutFormat(cfg.defaultLinkNormalFormat);
normalFmt.color = 0xFF0000; // red
normalFmt.textDecoration = TextDecoration.NONE;
var hoverFmt:TextLayoutFormat = new TextLayoutFormat(cfg.defaultLinkHoverFormat);
hoverFmt.color = 0xFF00FF; // purple
hoverFmt.textDecoration = TextDecoration.UNDERLINE;
cfg.defaultLinkNormalFormat = normalFmt;
cfg.defaultLinkHoverFormat = hoverFmt;
rt.textFlow = TextConverter.importToFlow(txt, TextConverter.TEXT_FIELD_HTML_FORMAT, cfg);
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:RichEditableText id="rt" x="20" y="20" editable="false"/&gt;
&lt;/s:Application&gt; </pre>
</div>
</div>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fee_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fee_verapache"><!-- --></a>
<h3 class="topictitle3">Skinning TLF-based text controls</h3>
<div>
<p>You do not typically add skins or chrome to the Spark text
controls. </p>
<p>The Label, RichText, and RichEditableText Spark text controls
are used in the skins of skinnable components. Because each has
a different set of features, you can use the lightest weight text
control that meets your needs.</p>
<p>For example, the default skin of a Spark Button uses the Label
class to render the label of the Button. If you have a Button that
requires rich text, you can sometimes replace the Label control
in its skin with a RichText control. </p>
<p>The default skins of the Spark TextInput and TextArea controls
use a RichEditableText control to provide an area in which text
can be edited. The border and background are provided by a Rect
class, and the scrollbars by a Scroller class.</p>
<p>For more information on skinning Spark controls, see <a href="flx_gumboskinning_gs.html#WS53116913-F952-4b21-831F-9DE85B647C8A_verapache">Spark
Skinning</a>.</p>
</div>
</div>
<div class="nested2" id="WS02f7d8d4857b1677-165a04e1126951a2d98-7fed_verapache"><a name="WS02f7d8d4857b1677-165a04e1126951a2d98-7fed_verapache"><!-- --></a>
<h3 class="topictitle3">Mirroring and bidirectional text</h3>
<div>
<p>Some languages, such as Hebrew and Arabic, read from right
to left. However, those languages often include text from other
languages that read from left to right. Most of a sentence in Hebrew,
for example, might read from right to left, but it might include
English words that are read from left to right. This makes it necessary
for Flex controls to support bidirectional text. </p>
<p>To use bidirectional text in a TLF text-based control, use the <samp class="codeph">direction</samp> style. </p>
<p>Bidirectional text lets you render text from left-to-right (LTR)
or right-to-left (RTL). You can embed RTL text inside an LTR block
so that portions of a paragraph render LTR and portions render RTL.
There is a dominant direction for the entire paragraph, but parts
of the paragraph can be read in the opposite direction, and this
can be nested.</p>
<div class="p">The following simple example embeds a small amount of Hebrew
text in a text control, and sets the <samp class="codeph">direction</samp> style
to <samp class="codeph">rtl</samp>. The text is written and stored using the
UTF-8 encoding.<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- sparktextcontrols/RTLHebrewExample.mxml --&gt;
&lt;s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"&gt;
&lt;s:layout&gt;&lt;s:VerticalLayout/&gt;&lt;/s:layout&gt;
&lt;s:Graphic&gt;
&lt;s:Label direction="rtl" text="???? ??????? ????? ????? ?????? This is a Hebrew test" width="100" height="100"/&gt;
&lt;/s:Graphic&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The following example includes English and two examples of RTL
text (Hebrew and Arabic). The text is defined as Unicode characters,
which makes it easier to follow. You can click the button to toggle
the RichEditableText control from RTL to LTR.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/RTLTest.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="addText()"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
@font-face {
src:url("../assets/MyriadWebPro.ttf");
fontFamily: myFontFamily;
advancedAntiAliasing: true;
embedAsCFF: true;
unicodeRange:
U+0041-005A, /* Latin upper-case [A..Z] */
U+0061-007A, /* Latin lower-case a-z */
U+002E-002E, /* Latin period [.] */
U+05E1, /* The necessary Hebrew letters */
U+05B5,
U+05E4,
U+05B6,
U+05E8,
U+0645, /* The necessary Arabic letters */
U+062F,
U+0631,
U+0633,
U+0629;
}
s|RichText {
fontFamily: myFontFamily;
fontSize: 32;
paddingTop: 10;
}
&lt;/fx:Style&gt;
&lt;fx:Script&gt;
import flashx.textLayout.formats.*;
import spark.utils.TextFlowUtil;
private function addText():void {
myRT.textFlow = TextFlowUtil.importFromString("school is written " +
String.fromCharCode(0x0645, 0x062f, 0x0631, 0x0633, 0x0629) +
" in Arabic and " + String.fromCharCode(0x05E1, 0x05B5, 0x05E4, 0x05B6, 0x05E8) +
" in Hebrew.");
}
private function mirrorText():void {
if (myRT.getStyle("direction")=="ltr") {
myRT.setStyle("direction", flashx.textLayout.formats.Direction.RTL);
} else {
myRT.setStyle("direction", flashx.textLayout.formats.Direction.LTR);
}
}
&lt;/fx:Script&gt;
&lt;s:Panel title="RTL and LTR with embedded font"&gt;
&lt;s:RichText id="myRT" width="400" height="150"/&gt;
&lt;/s:Panel&gt;
&lt;s:Button click="mirrorText()" label="Toggle Direction"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>Mirroring refers to laying the chrome of a component, or an entire
application, out in one direction and then display in the opposite
direction. For example, a mirrored TextArea would have its vertical
scrollbar on the left. A mirrored Tree would have its disclosure
triangles on the right. A mirrored HGroup would have its first child
on the right, and a mirrored TabBar would have its first tab on
the right. Mirroring can apply to subcomponents as well as chrome.
For example, a mirrored RadioButton would have its label on the
left side instead of the right side (the default).</p>
<p>Mirroring of components complement bidirectional text by having
the application and components reflect the text direction.</p>
</div>
</div>
<div class="nested2" id="WS19f279b149e7481c7fdc883d12de39353f1-8000_verapache"><a name="WS19f279b149e7481c7fdc883d12de39353f1-8000_verapache"><!-- --></a>
<h3 class="topictitle3">Using numbered and bulleted lists
with TLF-based text controls</h3>
<div>
<p>You can use the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/ListElement.html" target="_blank">ListElement</a> and <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/ListItemElement.html" target="_blank">ListItemElement</a> classes
to add bulleted lists to your text controls. The bulleted lists
can be nested and can be customized to use different bullets (or
markers) and auto-numbering.</p>
<p>To create lists in your applications, use the <samp class="codeph">&lt;s:list&gt;</samp> tag
inside a text control that uses TLF. You then use<samp class="codeph"> &lt;s:li&gt;</samp> tags
within the <samp class="codeph">&lt;s:list&gt;</samp> tag for each list item
in the list. You can customize the appearance of the bullets by
using the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/formats/ListMarkerFormat.html" target="_blank">ListMarkerFormat</a> class.</p>
<div class="p">The following example creates simple lists:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFLists.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;!-- Simple bulleted list. --&gt;
&lt;s:RichEditableText id="myRET1" width="200"&gt;
&lt;s:p&gt;Simple bulleted list:&lt;/s:p&gt;
&lt;s:list id="list1" listStylePosition="outside"&gt;
&lt;s:li&gt;Item 1&lt;/s:li&gt;
&lt;s:li&gt;Item 2&lt;/s:li&gt;
&lt;s:li&gt;Item 3&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;!-- Nested bulleted list. --&gt;
&lt;s:RichEditableText id="myRET2" width="200"&gt;
&lt;s:p&gt;Nested bulleted list:&lt;/s:p&gt;
&lt;s:list id="list2"&gt;
&lt;s:li&gt;Dry cleaning&lt;/s:li&gt;
&lt;s:li&gt;Groceries
&lt;s:list id="list1a"&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;s:li&gt;Stick of butter&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:li&gt;
&lt;s:li&gt;Oil change
&lt;s:list id="list1b"&gt;
&lt;s:li&gt;Item 1b&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;!-- Custom spacing list. --&gt;
&lt;s:RichEditableText id="myRET3" width="200"&gt;
&lt;s:p&gt;List with custom indents:&lt;/s:p&gt;
&lt;s:list id="list3" paddingLeft="20"&gt;
&lt;s:li&gt;Dry cleaning&lt;/s:li&gt;
&lt;s:li&gt;Groceries
&lt;s:list id="list31" paddingLeft="20"&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;s:li&gt;Stick of butter&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:li&gt;
&lt;s:li&gt;Item 3&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;!-- Custom styled list. --&gt;
&lt;s:RichEditableText id="myRET4" width="200"&gt;
&lt;s:p&gt;Styled bulleted list:&lt;/s:p&gt;
&lt;s:list id="list4" listStylePosition="inside"&gt;
&lt;s:listMarkerFormat&gt;
&lt;s:ListMarkerFormat fontSize="14" fontWeight="bold" color="0xFF0066" afterContent=" "/&gt;
&lt;/s:listMarkerFormat&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;s:li&gt;Stick of butter&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">To change the type of marker or use numbering in the list, use
the <samp class="codeph">listStyleType</samp> property of the ListElement.
This property can be any value defined by the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/formats/ListStyleType.html" target="_blank">ListStyleType</a> class
(such as <samp class="codeph">check</samp>, <samp class="codeph">circle</samp>, <samp class="codeph">decimal</samp>,
and <samp class="codeph">box</samp>). The following example creates lists with
various marker types and a custom increment:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFListsCustomBullets.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;!-- Custom bullets lists. --&gt;
&lt;s:RichEditableText id="myRET1" width="200"&gt;
&lt;s:p&gt;Lists with custom bullets:&lt;/s:p&gt;
&lt;s:p&gt;Box:&lt;/s:p&gt;
&lt;s:list id="list1" listStyleType="box"&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;s:p&gt;Decimal:&lt;/s:p&gt;
&lt;s:list id="list2" listStyleType="decimal"&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;s:p&gt;Check:&lt;/s:p&gt;
&lt;s:list id="list3" listStyleType="check"&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;s:p&gt;Nested Roman:&lt;/s:p&gt;
&lt;s:list id="list4" listStyleType="upperRoman"&gt;
&lt;s:li&gt;Item 1
&lt;s:list id="list41" listStyleType="lowerRoman"&gt;
&lt;s:li&gt;Quart of milk&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:li&gt;
&lt;s:li&gt;Item 2&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;!-- List with custom increment. --&gt;
&lt;s:RichEditableText id="myRET2" width="200"&gt;
&lt;s:p&gt;List with countdown:&lt;/s:p&gt;
&lt;s:list id="list5" listStyleType="decimal"&gt;
&lt;s:listMarkerFormat&gt;
&lt;!-- Increments the list by 2s rather than 1s. --&gt;
&lt;s:ListMarkerFormat counterIncrement="ordered 2"/&gt;
&lt;/s:listMarkerFormat&gt;
&lt;s:li&gt;Quart of milk
&lt;s:listMarkerFormat&gt;
&lt;!-- Causes counter to start at 10. --&gt;
&lt;s:ListMarkerFormat counterReset="ordered 9"/&gt;
&lt;/s:listMarkerFormat&gt;
&lt;/s:li&gt;
&lt;s:li&gt;Loaf of bread&lt;/s:li&gt;
&lt;s:li&gt;Stick of butter&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>You can further customize the appearance of the markers in your
lists by using the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/formats/ListMarkerFormat.html" target="_blank">ListMarkerFormat</a> class
to define “before” and “after” content. This is content that appears
before and after the content of the marker.</p>
<div class="p">The following example adds the word “Chapter” before the marker,
and a colon after the marker. The marker, or content, is ordered
upper-case Roman numerals.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/TLFListsBeforeAfter.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;!-- Before/After content. --&gt;
&lt;s:RichEditableText id="myRET" width="500"&gt;
&lt;s:p&gt;List with Before/After content:&lt;/s:p&gt;
&lt;s:list id="myList" paddingLeft="10" listStylePosition="inside"&gt;
&lt;s:listMarkerFormat&gt;
&lt;!-- Note that this example inserts an empty string with &amp;quote; HTML entities. --&gt;
&lt;s:ListMarkerFormat
beforeContent="Chapter "
content="counters(ordered,&amp;quot;&amp;quot;,upperRoman)"
afterContent=": "/&gt;
&lt;/s:listMarkerFormat&gt;
&lt;s:li&gt;Beginning&lt;/s:li&gt;
&lt;s:li&gt;Middle&lt;/s:li&gt;
&lt;s:li&gt;End&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;s:list id="myList2" paddingLeft="10" listStylePosition="inside"&gt;
&lt;s:listMarkerFormat&gt;
&lt;s:ListMarkerFormat
beforeContent="*BEFORE*"
content="counters(ordered,&amp;quot;*SUFFIX*&amp;quot;,upperRoman)"
afterContent="*AFTER*"/&gt;
&lt;/s:listMarkerFormat&gt;
&lt;s:li&gt;Beginning&lt;/s:li&gt;
&lt;s:li&gt;Middle&lt;/s:li&gt;
&lt;s:li&gt;End&lt;/s:li&gt;
&lt;/s:list&gt;
&lt;/s:RichEditableText&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>As the previous example shows, you can use the <samp class="codeph">content</samp> property
to insert a suffix: a string that appears after the marker, but
before the <samp class="codeph">afterContent</samp>. To insert this string
when providing XML content to the flow, wrap the string in <samp class="codeph">&amp;quote;</samp> HTML
entities rather than quotation marks (<samp class="codeph">“&lt;<em>string</em>&gt;”</samp>).
The previous example inserted an empty string.</p>
</div>
</div>
</div>
<div class="nested1" id="WS19f279b149e7481c-177b1c712d80a315e7-8000_verapache"><a name="WS19f279b149e7481c-177b1c712d80a315e7-8000_verapache"><!-- --></a>
<h2 class="topictitle2">Using prompts with text controls</h2>
<div>
<p>The Spark TextInput and TextArea controls support a <samp class="codeph">prompt</samp> property
that lets you specify text that helps users know what to enter.
For example, an input field might include prompt text that says
“Search”.</p>
<p>Prompt text appears when the text control is first created. Prompt
text disappears when the control gets focus or when the control’s <samp class="codeph">text</samp> property
is non-null. Prompt text reappears when the control loses focus,
but only if no text was entered (if the value of the text field
is the empty string). </p>
<p>For text controls, if the user enters text, but later deletes
it, the prompt text reappears when the control loses focus. You
can also cause the prompt text to reappear programmatically by setting
the text control’s text property to <samp class="codeph">null</samp> or the
empty string.</p>
<div class="p">The following example creates a TextInput and TextArea control
with prompt text. You can focus on the text controls and enter text,
which causes the prompt text to disappear. If you click the Reset
button, the prompt text reappears.<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/BasicPromptExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
/* If you reset the text properties of the TextInput and TextArea controls to null
or the empty string, the prompt text reappears. */
private function resetPrompts():void {
myTextInput.text = "";
myTextArea.text = "";
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextInput id="myTextInput" prompt="Enter name..."/&gt;
&lt;s:TextArea id="myTextArea" prompt="Enter details..."/&gt;
&lt;s:Button label="Reset" click="resetPrompts()"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>The Spark ComboBox control also supports the <samp class="codeph">prompt</samp> property
because it uses the Spark TextInput control as a subcontrol. For
more information, see <a href="flx_spark_dpcontrols_sdp.html#WS19f279b149e7481c3ae73812d80da7397-8000_verapache">Use prompt
text with the Spark ComboBox control</a>.</p>
</div>
<div class="nested2" id="WS19f279b149e7481ccb9899c12d861ca08a-8000_verapache"><a name="WS19f279b149e7481ccb9899c12d861ca08a-8000_verapache"><!-- --></a>
<h3 class="topictitle3">Text prompt styles</h3>
<div>
<p>The default prompt styles are defined in the current theme’s
default style sheet. By default, the prompt text is gray and italicised.
The style of the prompt text is defined by the text control’s pseudo
selectors. </p>
<p>Pseudo selectors let you apply styles to a component based on
its current state. For example, if your TextInput control has prompt
text and is not disabled, the style is defined by the <samp class="codeph">normalWithPrompt</samp> pseudo
selector because it is in the <samp class="codeph">normalWithPrompt</samp> state.
If the control is disabled, then the styles defined by the <samp class="codeph">disabledWithPrompt</samp> pseudo
selector are used.</p>
<div class="p">You can change the prompt text styles by overriding the default
CSS. The following example changes the prompt text styles by defining
different behavior for the <samp class="codeph">normalWithPrompt</samp> and <samp class="codeph">disabledWithPrompt</samp> pseudo
selectors for the TextInput and TextArea controls:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/StylingPrompts.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
s|TextInput:normalWithPrompt {
color: #CCCCFF;
fontStyle: italic;
}
s|TextArea:normalWithPrompt {
color: #CCCCFF;
fontStyle: italic;
}
s|TextInput:disabledWithPrompt {
color: #CCFFFF;
fontStyle: italic;
}
s|TextArea:disabledWithPrompt {
color: #CCFFFF;
fontStyle: italic;
}
&lt;/fx:Style&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function resetPrompts():void {
myTextInput.text = "";
myTextArea.text = "";
}
/* Disabling the controls causes the disabledWithPrompt pseudo selector to be used
instead of the normalWithPrompt pseudo selector. */
private function disableControls():void {
if (myTextInput.enabled) {
myTextInput.enabled = false;
myTextArea.enabled = false;
} else {
myTextInput.enabled = true;
myTextArea.enabled = true;
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextInput id="myTextInput" prompt="Enter name..."/&gt;
&lt;s:TextArea id="myTextArea" prompt="Enter details..."/&gt;
&lt;s:HGroup&gt;
&lt;s:Button label="Reset" click="resetPrompts()"/&gt;
&lt;s:Button label="Toggle Enabled/Disabled" click="disableControls()"/&gt;
&lt;/s:HGroup&gt;
&lt;/s:Application&gt;</pre>
</div>
<p>In general, you should avoid setting the prompt text to be larger
or smaller than the regular text in the text control. Unless you
explicitly define the height and width of the control, the text
control’s size will grow or shrink as the size of the text or prompt
text grows and shrinks.</p>
<div class="p">To simplify your CSS you can also define text prompt styles on
the SkinnableTextBase type selector. Styles set on this selector
will apply to the TextArea and TextInput controls, as the following
example shows:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/SimplerStylingPrompts.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Style&gt;
@namespace s "library://ns.adobe.com/flex/spark";
s|SkinnableTextBase:normalWithPrompt {
color: #CCCCFF;
fontStyle: italic;
}
s|SkinnableTextBase:disabledWithPrompt {
color: #CCFFFF;
fontStyle: italic;
}
&lt;/fx:Style&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function resetPrompts():void {
myTextInput.text = "";
myTextArea.text = "";
}
/* Disabling the controls causes the disabledWithPrompt pseudo selector to be used
instead of the normalWithPrompt pseudo selector. */
private function disableControls():void {
if (myTextInput.enabled) {
myTextInput.enabled = false;
myTextArea.enabled = false;
} else {
myTextInput.enabled = true;
myTextArea.enabled = true;
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextInput id="myTextInput" prompt="Enter name..."/&gt;
&lt;s:TextArea id="myTextArea" prompt="Enter details..."/&gt;
&lt;s:HGroup&gt;
&lt;s:Button label="Reset" click="resetPrompts()"/&gt;
&lt;s:Button label="Toggle Enabled/Disabled" click="disableControls()"/&gt;
&lt;/s:HGroup&gt;
&lt;/s:Application&gt;</pre>
</div>
</div>
</div>
<div class="nested2" id="WS19f279b149e7481ccb9899c12d861ca08a-7fff_verapache"><a name="WS19f279b149e7481ccb9899c12d861ca08a-7fff_verapache"><!-- --></a>
<h3 class="topictitle3">Text prompt skins and transitions</h3>
<div>
<p>The prompt text of the TextArea and TextInput controls
is implemented as a Label control on the skins. The prompt text
is defined in the skin as a skin part named <samp class="codeph">promptDisplay</samp>.
You can change the behavior and appearance of the prompt text by
creating custom skins for those controls.</p>
<p>Typically, you copy the text control’s skin class (for example,
the TextInputSkin class) and customize it. You then apply the new
skin class by pointing the <samp class="codeph">skinClass</samp> property on
the text control to your new skin.</p>
<div class="p">The following example uses a custom skin called CustomTextInputSkin:<pre class="codeblock">&lt;?xml version="1.0"?&gt;
&lt;!-- sparktextcontrols/CustomPromptExample.mxml --&gt;
&lt;s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout/&gt;
&lt;/s:layout&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private function resetPrompts():void {
myTextInput.text = "";
}
]]&gt;
&lt;/fx:Script&gt;
&lt;s:TextInput id="myTextInput" prompt="Enter name..."
skinClass="mySkins.CustomTextInputSkin"/&gt;
&lt;s:Button label="Reset" click="resetPrompts()"/&gt;
&lt;/s:Application&gt;</pre>
</div>
<div class="p">The following custom skin adds a transition to the prompt text
when the state changes to <samp class="codeph">normalWithPrompt</samp>. Most
of the skin is directly copied from the original TextInputSkin class.
The only new code is the <samp class="codeph">&lt;s:transitions&gt;</samp> block
near the bottom of the example. When you enter some text, and then
click the Reset button, you should notice that the prompt text fades
in.<pre class="codeblock">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- sparktextcontrols\mySkins\CustomTextInputSkin.mxml --&gt;
&lt;s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
alpha.disabledStates="0.5" blendMode="normal"&gt;
&lt;fx:Metadata&gt;
&lt;![CDATA[
[HostComponent("spark.components.TextInput")]
]]&gt;
&lt;/fx:Metadata&gt;
&lt;fx:Script fb:purpose="styling"&gt;
&lt;![CDATA[
import mx.core.FlexVersion;
private var paddingChanged:Boolean;
static private const exclusions:Array = ["background", "textDisplay", "promptDisplay", "border"];
static private const exclusions_4_0:Array = ["background", "textDisplay", "promptDisplay"];
override public function get colorizeExclusions():Array {
if (FlexVersion.compatibilityVersion &lt; FlexVersion.VERSION_4_5) {
return exclusions_4_0;
}
return exclusions;
}
static private const contentFill:Array = ["bgFill"];
override public function get contentItems():Array {return contentFill};
override protected function commitProperties():void {
super.commitProperties();
if (paddingChanged) {
updatePadding();
paddingChanged = false;
}
}
override protected function initializationComplete():void {
useChromeColor = true;
super.initializationComplete();
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
if (getStyle("borderVisible") == true) {
border.visible = true;
shadow.visible = true;
background.left = background.top = background.right = background.bottom = 1;
textDisplay.left = textDisplay.top = textDisplay.right = textDisplay.bottom = 1;
if (promptDisplay)
{
promptDisplay.setLayoutBoundsSize(unscaledWidth - 2, unscaledHeight - 2);
promptDisplay.setLayoutBoundsPosition(1, 1);
}
}
else
{
border.visible = false;
shadow.visible = false;
background.left = background.top = background.right = background.bottom = 0;
textDisplay.left = textDisplay.top = textDisplay.right = textDisplay.bottom = 0;
if (promptDisplay)
{
promptDisplay.setLayoutBoundsSize(unscaledWidth, unscaledHeight);
promptDisplay.setLayoutBoundsPosition(0, 0);
}
}
borderStroke.color = getStyle("borderColor");
borderStroke.alpha = getStyle("borderAlpha");
super.updateDisplayList(unscaledWidth, unscaledHeight);
}
private function updatePadding():void {
if (!textDisplay)
return;
var padding:Number;
padding = getStyle("paddingLeft");
if (textDisplay.getStyle("paddingLeft") != padding)
textDisplay.setStyle("paddingLeft", padding);
padding = getStyle("paddingTop");
if (textDisplay.getStyle("paddingTop") != padding)
textDisplay.setStyle("paddingTop", padding);
padding = getStyle("paddingRight");
if (textDisplay.getStyle("paddingRight") != padding)
textDisplay.setStyle("paddingRight", padding);
padding = getStyle("paddingBottom");
if (textDisplay.getStyle("paddingBottom") != padding)
textDisplay.setStyle("paddingBottom", padding);
if (!promptDisplay)
return;
padding = getStyle("paddingLeft");
if (promptDisplay.getStyle("paddingLeft") != padding)
promptDisplay.setStyle("paddingLeft", padding);
padding = getStyle("paddingTop");
if (promptDisplay.getStyle("paddingTop") != padding)
promptDisplay.setStyle("paddingTop", padding);
padding = getStyle("paddingRight");
if (promptDisplay.getStyle("paddingRight") != padding)
promptDisplay.setStyle("paddingRight", padding);
padding = getStyle("paddingBottom");
if (promptDisplay.getStyle("paddingBottom") != padding)
promptDisplay.setStyle("paddingBottom", padding);
}
override public function styleChanged(styleProp:String):void {
var allStyles:Boolean = !styleProp || styleProp == "styleName";
super.styleChanged(styleProp);
if (allStyles || styleProp.indexOf("padding") == 0)
{
paddingChanged = true;
invalidateProperties();
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
private static const focusExclusions:Array = ["textDisplay"];
override public function get focusSkinExclusions():Array { return focusExclusions;};
]]&gt;
&lt;/fx:Script&gt;
&lt;s:states&gt;
&lt;s:State name="normal"/&gt;
&lt;s:State name="disabled" stateGroups="disabledStates"/&gt;
&lt;s:State name="normalWithPrompt"/&gt;
&lt;s:State name="disabledWithPrompt" stateGroups="disabledStates"/&gt;
&lt;/s:states&gt;
&lt;!-- border --&gt;
&lt;s:Rect left="0" right="0" top="0" bottom="0" id="border"&gt;
&lt;s:stroke&gt;
&lt;!--- @private --&gt;
&lt;s:SolidColorStroke id="borderStroke" weight="1" /&gt;
&lt;/s:stroke&gt;
&lt;/s:Rect&gt;
&lt;!-- fill --&gt;
&lt;s:Rect id="background" left="1" right="1" top="1" bottom="1"&gt;
&lt;s:fill&gt;
&lt;!--- @private Defines the background fill color. --&gt;
&lt;s:SolidColor id="bgFill" color="0xFFFFFF" /&gt;
&lt;/s:fill&gt;
&lt;/s:Rect&gt;
&lt;!-- shadow --&gt;
&lt;s:Rect left="1" top="1" right="1" height="1" id="shadow"&gt;
&lt;s:fill&gt;
&lt;s:SolidColor color="0x000000" alpha="0.12" /&gt;
&lt;/s:fill&gt;
&lt;/s:Rect&gt;
&lt;!-- text --&gt;
&lt;s:RichEditableText id="textDisplay"
verticalAlign="middle"
widthInChars="10"
left="1" right="1" top="1" bottom="1" /&gt;
&lt;s:Label id="promptDisplay" maxDisplayedLines="1"
verticalAlign="middle"
mouseEnabled="false" mouseChildren="false"
includeIn="normalWithPrompt,disabledWithPrompt"
includeInLayout="false"/&gt;
&lt;!-- Added to custom skin to cause prompt text to fade in. --&gt;
&lt;s:transitions&gt;
&lt;s:Transition toState="normalWithPrompt"&gt;
&lt;s:Fade targets="{promptDisplay}" duration="500"/&gt;
&lt;/s:Transition&gt;
&lt;/s:transitions&gt;
&lt;/s:SparkSkin&gt; </pre>
</div>
</div>
</div>
<p>Adobe, Adobe AIR, Adobe Flash, Adobe Flash Platform and Adobe Flash Player are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries and are used by permission from Adobe. No other license to the Adobe trademarks are granted.</p>
</div>
</body>
</html>