<!--
  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 xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Text Layout Framework: Flex Samples</title>
</head>

<body>
<h1>Text Layout Framework: Flex Samples</h1>
<p>The Text Layout Framework is an ActionScript library that provides text composition functionality. It is built on  the Flash text  engine available in Flash Player 10. This framework provides  support for high quality, typographically rich, flowable text layout  with selection, editing, undo, copy-paste, and an XML markup language  to dynamically style text. </p>
<p>The Text Layout Framework can be used by any developer who wants to build new text components for Flash Player. It uses pure  ActionScript; you can work with it in any Flash or Flex development environment. The library is implemented by the <font face="Courier New, Courier, monospace">flashx.textLayout.*</font> packages in <font face="Courier New, Courier, monospace">textLayout.swc</font>.</p>
<h2>Flex sample projects</h2>
<p>Note: These are examples of using TLF within Flex.  These do not use spark components.</p>
<p>The <font face="Courier New, Courier, monospace">flex/SimpleEditor</font> folder of the Text Layout Framework SDK contains the <font face="Courier New, Courier, monospace">SimpleEditor</font> example Flex project. </p>
<p>This project demonstrates how to work with the Text Layout Framework in Flex Builder. It defines an editing component (<font face="Courier New, Courier, monospace">SimpleEditor</font>) that displays editable text, and includes Flex controls for setting the font family, font size, line spacing, alignment, and other attributes.</p>
<p>The <font face="Courier New, Courier, monospace">flex/SimpleEditorWithCSS</font> folder of the Text Layout Framework SDK contains the <font face="Courier New, Courier, monospace">SimpleEditorWithCSS</font> example Flex project. </p>
<p>This project enhances SimpleEditor to include CSS styling support using the IFormatResolver.</p>
<p>The <font face="Courier New, Courier, monospace">flex/TextLayoutEditor</font>  folder of the Text Layout Framework SDK contains the <font face="Courier New, Courier, monospace">TextLayoutEditor</font>.
<p>This project is a large demonstration editor for working with TextLayout Framework content. It has a user interface that allows editing of most TLF attributes.</p>
<h2>Building the example projects</h2>
<p>You can build the example projects with either with Flash Builder, or with Ant using the Flex 4 SDK. To load the project into your FlashBuilder development environment:</p>
<ol>
  <li>Open <a href="http://labs.adobe.com/technologies/flashbuilder4/">Flash Builder 4.</a></li>
  <li>Switch your workspace to the parent of the Samples folder.</li>
  <li>Choose File &gt; Import.</li>
  <li> In the General tab, select &quot;Existing Projects into Workspace&quot;.</li>
  <li>Browse to  the root folder of the workspace. It is preselected.</li>
  <li>Deselect any examples you do not want to import. Do not select &quot;Copy into workspace&quot;.</li>
  <li>Click Finish. You can now build and run the examples from your development environment.</li>
</ol>
<hr />
</body>
</html>
