﻿<?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.

-->
<!--- 
* @exampleText The following CheckWord MXML demonstrates how a word is checked by using Squiggly API.
* Note that the results from this example may differ based on dictionary file.
* 
* The following steps are taken:
* <ol>
*  <li>A <code>SpellingDictionary</code> object is created </li>
*  <li>A <code>SpellChecker</code> object is created </li>
*  <li>In the mx:application tag, add a function call to <code>init</code> for <code>applicationComplete</code> </li>
*  <li>Create <code>init</code> function body: in the body, add an event listener for <code>SpellingDictionary</code> object. 
* 		Then create a <code>URLRequest</code> object to specify the url of dictionary file. Then call the <code>SpellingDictionary</code> 
*  		object <code>load</code> method to load the dictionary from disk or remote URL.
*  </li>
*  <li> Finish the <code>handleLoadComplete</code> function to attach the <code>SpellingDictionary</code> object to a <code>SpellChecker</code> object</li>
*  <li> Add a function to call the <code>CheckWord</code> method of <code>SpellChecker</code> object to verify the correctness of a word. </li>
*  <li>Add related MXML component tag and related property. </li>
* </ol>
* 
* Note: to make this example work properly, please make sure you have the proper dictionary file in the specified folder 
* and put the Squiggly library(AdobeSpellingEngine.swc) in your libs folder. Please see the reference "How to generate Squiggly dictionary".
-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" applicationComplete="init()">
<mx:Script>
	<![CDATA[
		import com.adobe.linguistics.spelling.*;
		
		private var _newdict:HunspellDictionary = new HunspellDictionary();
		private var sp:SpellChecker;
		private function init():void {
				_newdict.addEventListener(Event.COMPLETE, handleLoadComplete);
				_newdict.load("dictionaries/en_US/en_US.aff", "dictionaries/en_US/en_US.dic");
		}
		private function handleLoadComplete(evt:Event):void
		{
			sp = new SpellChecker(_newdict);
		}

		private function checkWord():void {
			if( sp.checkWord( inputWord.text ) )
				result.text = "Result:correct";
			else
				result.text = "Result:wrong";
		}
		
	]]>
</mx:Script>
	<mx:TextInput id="inputWord" text ="test" keyUp="checkWord()"/>
	<mx:Label id ="result" text="Result:"/>
</mx:Application>
