<?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:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" initialize="init()" resize="handleResize()" horizontalScrollPolicy="off" verticalScrollPolicy="off" xmlns:local="*" backgroundColor="#FFFFFF">
	<!-- This file loads and parses a TextFlow markup file and attaches it to the SimpleEditorPanel  -->
	<mx:Script>
		<![CDATA[
			import flashx.textLayout.elements.TextFlow;
			import flashx.textLayout.conversion.TextConverter;
			
			import flash.events.Event;
			import flash.events.IOErrorEvent;
			
			static private const simpleText:String = "<TextFlow xmlns='http://ns.adobe.com/textLayout/2008' fontSize='14' textIndent='15' marginBottom='15' paddingTop='4' paddingLeft='4'>"
   				+ "<p><span>There are many </span><span fontStyle='italic'>such</span><span> lime-kilns in that tract of country, for the purpose of burning the white marble which composes a large part of the substance of the hills. Some of them, built years ago, and long deserted, with weeds growing in the vacant round of the interior, which is open to the sky, and grass and wild-flowers rooting themselves into the chinks of the stones, look already like relics of antiquity, and may yet be overspread with the lichens of centuries to come. Others, where the lime-burner still feeds his daily and nightlong fire, afford points of interest to the wanderer among the hills, who seats himself on a log of wood or a fragment of marble, to hold a chat with the solitary man. It is a lonesome, and, when the character is inclined to thought, may be an intensely thoughtful occupation; as it proved in the case of Ethan Brand, who had mused to such strange purpose, in days gone by, while the fire in this very kiln was burning.</span></p>"
				+ "<p><span>The man who now watched the fire was of a different order, and troubled himself with no thoughts save the very few that were requisite to his business. At frequent intervals, he flung back the clashing weight of the iron door, and, turning his face from the insufferable glare, thrust in huge logs of oak, or stirred the immense brands with a long pole. Within the furnace were seen the curling and riotous flames, and the burning marble, almost molten with the intensity of heat; while without, the reflection of the fire quivered on the dark intricacy of the surrounding forest, and showed in the foreground a bright and ruddy little picture of the hut, the spring beside its door, the athletic and coal-begrimed figure of the lime-burner, and the half-frightened child, shrinking into the protection of his father's shadow. And when again the iron door was closed, then reappeared the tender light of the half-full moon, which vainly strove to trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, though thus far down into the valley the sunshine had vanished long and long ago.</span></p>"
 				+ "</TextFlow>";
			
			/** Initialize the application */
			private function init():void
			{
				// adjust the selection color when focus is not on the selection to look the same.  
				// This is appropriate for an editor but not for UI widgets
				TextFlow.defaultConfiguration.unfocusedSelectionFormat = TextFlow.defaultConfiguration.focusedSelectionFormat;
				
				// switch the boolean below to read the file at run time.  Note: you have to add the swf to the trusted list to load a local file
				if (false)
				{
					// Initiate read of a file
					var loader:URLLoader = new URLLoader();
					loader.load(new URLRequest("../SimpleText.xml"));	// for example
					loader.addEventListener(Event.COMPLETE,loadCompleteHandler);	
					loader.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);
				}
				else
				{		
					editor.textFlow = TextConverter.importToFlow(simpleText, TextConverter.TEXT_LAYOUT_FORMAT);
				}
				handleResize();
			}
			
			/** on file load error show the error string */
			private function errorHandler(e:IOErrorEvent):void
			{
				editor.textFlow = TextConverter.importToFlow("\n"+IOErrorEvent(e).text, TextConverter.PLAIN_TEXT_FORMAT);
			}
			/** on success parse the file and display it */
			private function loadCompleteHandler(e:Event):void
			{
		 		editor.textFlow = TextConverter.importToFlow(e.target.data, TextConverter.TEXT_LAYOUT_FORMAT);
			}
			
			/** Update the size of the editor to be the full size of this window */
			private function handleResize():void
			{
				if (editor)
					editor.setSize(this.width,this.height);
			}
		]]>
	</mx:Script>
	<local:SimpleEditorPanel id="editor"/>

</mx:Application>
