<!--

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.

-->
How to use Squiggly examples
===================================

To build and run an example, please follow these steps:

1. Import the project into Flex Builder 3 or Flash Builder 4 beta.

2. Copy the dictionary data (including the AdobeSpellingConfig.xml file and the dictionaries folder) from ../src to <project>/src folder. If you want to place the dictionary files in a different folder, please make sure the url is referred correctly in the code or in AdobeSpellingConfig.xml file.

3. Copy the Squiggly lib(s) from ../libs to <project>/libs folder
   - CheckWord, GetSuggestion, TextEditor needs only AdobeSpellingEngine.swc
   - SquigglyUIExample, ContextMenuWithResource, CustomContextMenu needs both AdobeSpellingEngine.swc and AdobeSpellingUI.swc
   - SquigglyTLFExample needs AdobeSpellingUIForTLF.swc

4. Build the project

