﻿<?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.

-->
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" horizontalAlign="left" initialize="init()">
<mx:Script>
	<![CDATA[


	import com.adobe.linguistics.spelling.HunspellDictionary;
	import com.adobe.linguistics.spelling.SpellChecker;
	import com.adobe.linguistics.spelling.UserDictionary;
		
	
	private var ud:UserDictionary;
	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";
	}
		
	public function updateWordList():void
	{
		wordList.text = "";
		
		var wl:Vector.<String> = ud.wordList;
		for each(var w:String in wl)
		{
			wordList.text += w + "\n";
		}
		
	}
	
	
	public function loadDict():void
	{
		var inFile:File = File.desktopDirectory;
		inFile = inFile.resolvePath(filename.text);
		if (inFile.exists)
		{		
			var inStream:FileStream = new FileStream();
			inStream.open(inFile, FileMode.READ);
			ud = new UserDictionary(inStream.readObject() as Vector.<String>);
			inStream.close();  	
			result1.text = "File loaded";	
		}
		else
		{
			ud = new UserDictionary();
			result1.text = "File created";
		}		
		updateWordList();
		sp.addUserDictionary(ud);
	}
	
	public function saveDict():void
	{
		var outFile:File = File.desktopDirectory;
		outFile = outFile.resolvePath(filename.text);
		var outStream:FileStream = new FileStream();
		outStream.open(outFile, FileMode.WRITE);
		outStream.writeObject(ud.wordList);
		outStream.close();
		result1.text = "File saved"
	}
	
	public function addWord():void
	{
		ud.addWord(word.text);
		updateWordList();
	}
	
	public function removeWord():void
	{
		ud.removeWord(word.text);
		updateWordList();
	}
	
	]]>
</mx:Script>		
	<mx:HBox>
		<mx:TextInput id="filename" text="mywords.ud"/>
		<mx:Button id="load" label="Load/New dictionary" click="loadDict()" />
		<mx:Button id="save" label="Save dictionary" click="saveDict()" />
		<mx:Label id="result1" text="Result:"/> 
	</mx:HBox>	
	<mx:HBox>
		<mx:TextInput id="word" text="myword"/>
		<mx:Button id="add" label="Add Word" click="addWord()" />
		<mx:Button id="remove" label="Remove word" click="removeWord()" />
		<mx:Label id="result2" text="Result:"/> 
	</mx:HBox>
	<mx:TextArea id="wordList" height="100" width="100"/>
	
	<mx:TextInput id="inputWord" text ="test" keyUp="checkWord()"/>
	<mx:Button id="check" label="Check Word" click="checkWord()"  />
	<mx:Label id ="result" text="Result:"/>
</mx:WindowedApplication>
