`
jakielong
  • 浏览: 223751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex AIR--简单文本编辑器源码

    博客分类:
  • Flex
阅读更多

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	 width="800" height="600" title="Text Editor" applicationComplete="onAppInit();">
	
	<mx:Script>
		<![CDATA[
			import mx.validators.ValidationResult;
			import mx.events.FileEvent;
			import flash.events.KeyboardEvent;
			import flash.filesystem.File;
			import flash.filesystem.FileMode;
			import flash.filesystem.FileStream;
			import flash.net.FileFilter;
			import mx.controls.Alert;
			import mx.events.CloseEvent;
			import mx.events.MenuEvent;
			
			private var browseHolder:File;
			private var currentFile:File;
			private var defaultFile:File;
			private var fileStream:FileStream;
			private var fileToOpen:File;
			private var fileToSave:File;
			private var textChanged:Boolean;
			
			public function onAppInit():void
			{
				title = "Text Editor - Untitled.txt";
				defaultFile = File.documentsDirectory.resolvePath("untitled.txt");
				textChanged = false;
				
				application.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
			}
			
			private function onKeyUp(event:KeyboardEvent):void
			{
				if (event.keyCode==Keyboard.TAB&&!event.altKey&&!event.shiftKey&&!event.ctrlKey)
				{
					var sb:Number = fileTextArea.selectionBeginIndex;
					var se:Number = fileTextArea.selectionEndIndex;
					
					var firstPart:String = fileTextArea.text.slice(0,sb);
					var secondPart:String = fileTextArea.text.slice(se);
					
					fileTextArea.text = firstPart + "\t" + secondPart;
				}
			}
			
			private function onItemClick(event:MenuEvent):void
			{
				switch(event.label)
				{
					case "New":
						newDocument();
						break;
					case "Open":
						promptUserToOpenFile();
						break;
					case "Save":
						saveFile();
						break;
					case "Save As...":
						promptUserToSaveFile();
						break;
				}
			}
			
			private function onAlertClose(event:CloseEvent):void
			{
				switch(event.detail)
				{
					case Alert.YES:
						saveFile();
						break;
					case Alert.NO:
						textChanged = false;
						newDocument();
						break;
				}
			}
			
			private function onFileOpenSelect(event:FileEvent):void
			{
				currentFile = event.file as File;
				openFile();
			}
			
			private function onFileSaveSelect(event:FileEvent):void
			{
				currentFile = event.file as File;
				textChanged = false;
				title = "Text Editor - " + currentFile.name;
				saveFile();
			}
			
			private function onOpenComplete(event:Event):void
			{
				var theText:String = fileStream.readUTFBytes(fileStream.bytesAvailable);
				var lineEndPattern:RegExp = new RegExp(File.lineEnding,"g");
				
				fileTextArea.text = theText.replace(lineEndPattern,"\n");
				textChanged = false;
				title = "Text Editor - " + currentFile.name;
				fileStream.close();
			}
			
			private function onReadIOError(event:IOErrorEvent):void
			{
				Alert.show("The specified file cannot be opened.","Error",Alert.OK,this);
			}
			
			private function onWriteIOError(event:IOErrorEvent):void
			{
				Alert.show("The specified file cannot be saved.","Error",Alert.OK,this);
			}
			
			private function openFile():void
			{
				if (fileStream!=null)
				{
					fileStream.close();
				}
				fileStream = new FileStream();
				fileStream.addEventListener(Event.COMPLETE,onOpenComplete);
				fileStream.addEventListener(IOErrorEvent.IO_ERROR,onReadIOError);
				fileStream.openAsync(currentFile,FileMode.READ);
			}
			
			private function saveFile():void
			{
				if (currentFile)
				{
					if (fileStream!=null)
					{
						fileStream.close();
					}
					var theText:String = fileTextArea.text;
					theText = theText.replace(/\r/g,"\n");
					theText = theText.replace(/\n/g,File.lineEnding);
					
					fileStream = new FileStream();
					fileStream.openAsync(currentFile,FileMode.WRITE);
					fileStream.addEventListener(IOErrorEvent.IO_ERROR,onWriteIOError);
					fileStream.writeUTFBytes(theText);
					fileStream.close();
					textChanged = false;
				}
				else
				{
					promptUserToSaveFile();
				}
			}
			
			private function promptUserToOpenFile():void
			{
				fileToOpen = (currentFile!=null)?currentFile.parent:File.documentsDirectory;
				fileToOpen.removeEventListener(Event.SELECT,onFileSaveSelect);
				
				var textFilter:FileFilter = new FileFilter("Text","*.as;*.css;*.html;*.txt;*.xml");
				var allFilter:FileFilter = new FileFilter("All Files","*.*");
				
				try
				{
					fileToOpen.browseForOpen("Open",[textFilter,allFilter]);
					fileToOpen.addEventListener(Event.SELECT,onFileOpenSelect);
				}
				catch(error:Error)
				{
					trace("Failed:",error.message);
				}
			}
			
			private function promptUserToSaveFile():void
			{
				fileToSave = (currentFile)?currentFile:defaultFile;
				fileToSave.removeEventListener(Event.SELECT,onFileOpenSelect);
				
				var typeFilter:FileFilter = new FileFilter("Text","*.as;*.css;*.html;*.txt;*.xml");
				
				try
				{
					fileToSave.browseForSave("Save");
					fileToSave.addEventListener(Event.SELECT,onFileSaveSelect);
				}
				catch(error:Error)
				{
					trace("Failed:",error.message);
				}
			}
			
			private function newDocument():void
			{
				if (textChanged)
				{
					Alert.show("The text in your current document has changed.\nDo" + 
							" you want to save your changes?","Alert",(Alert.YES|Alert.NO|Alert.CANCEL),this,onAlertClose);
				}
				else
				{
					currentFile = undefined;
					textChanged = false;
					fileTextArea.text = "";
				}
			}
		]]>
	</mx:Script>
	
	<mx:MenuBar id="myMenuBar" labelField="@label"
		 left="0" top="0" right="0" tabEnabled="false"
		 itemClick="onItemClick(event);">
		<mx:XMLList>
			<menuitem label="File">
				<menuitem label="New"/>
				<menuitem label="Open"/>
				<menuitem label="Save"/>
				<menuitem label="Save As..."/>
			</menuitem>
		</mx:XMLList>
	</mx:MenuBar>
	<mx:TextArea id="fileTextArea"
		 top="21" left="0" right="0" bottom="0"
		 focusThickness="0" fontFamily="Arial"
		 fontSize="14" tabEnabled="false"
		 change="textChanged=true;"/>
</mx:WindowedApplication>
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics