| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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. |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| package textEditBar |
| { |
| import flash.display.DisplayObject; |
| import flash.events.Event; |
| import flash.events.IOErrorEvent; |
| import flash.net.FileReference; |
| |
| import flashx.textLayout.conversion.ConversionType; |
| import flashx.textLayout.conversion.ITextExporter; |
| import flashx.textLayout.conversion.ITextImporter; |
| import flashx.textLayout.conversion.TextConverter; |
| import flashx.textLayout.debug.assert; |
| import flashx.textLayout.elements.TextFlow; |
| |
| import mx.managers.CursorManager; |
| import mx.managers.PopUpManager; |
| import mx.rpc.events.ResultEvent; |
| import mx.rpc.http.mxml.HTTPService; |
| |
| import textEditBar.StatusPopup; |
| |
| public class FileIOHelper |
| { |
| static public var parentWindow:DisplayObject; |
| static public var changeContent:Function; |
| |
| static private var _openedFile:String; |
| |
| // called when the app has a specific file it wants to read (at startup) |
| static public function fileOpen(fileName:String):void |
| { |
| var localHTTP:HTTPService = new HTTPService(); |
| localHTTP.url = fileName; |
| _openedFile = fileName; |
| localHTTP.method = "GET"; |
| localHTTP.resultFormat="text" |
| localHTTP.showBusyCursor=true; |
| localHTTP.addEventListener(ResultEvent.RESULT,parseIntoFlowFromHTTP,false,0,true); |
| localHTTP.addEventListener(IOErrorEvent.IO_ERROR,errorOnReadFromHTTP,false,0,true); |
| localHTTP.send(); |
| } |
| |
| // called when user picks a file |
| static public function fileChoose(fileName:FileReference) : void |
| { |
| fileName.addEventListener(Event.COMPLETE,onFileReferenceLoadComplete,false,0,true); |
| fileName.addEventListener(IOErrorEvent.IO_ERROR,errorOnReadFromFileReference,false,0,true); |
| fileName.load(); |
| } |
| |
| static private function onFileReferenceLoadComplete(event:Event):void |
| { |
| var fileReference:FileReference = FileReference(event.target); |
| _extension= getExtension(fileReference.name).toLowerCase(); |
| _fileData = String(fileReference.data); |
| parseCurrentDataWithExtension(); |
| } |
| |
| static private function errorOnReadFromFileReference(event:IOErrorEvent):void |
| { |
| var curFileReference:FileReference = FileReference(event.target); |
| // Text content will be an error string |
| var errorString:String = "Error reading file " + curFileReference.name; |
| errorString += "\n"; |
| errorString += event.toString(); |
| _extension = "txt"; |
| _fileData = errorString; |
| parseCurrentDataWithExtension(); |
| //CursorManager.removeBusyCursor(); //get rid of hourglass cursor. |
| } |
| |
| static private function parseIntoFlowFromHTTP(event:ResultEvent):void |
| { |
| _fileData = String(event.result); |
| _extension = getExtension(_openedFile).toLowerCase(); |
| parseCurrentDataWithExtension(); |
| _openedFile = null; |
| } |
| |
| static private function errorOnReadFromHTTP(event:Object):void |
| { |
| // Text content will be an error string |
| var errorString:String = "Error reading file " + _openedFile; |
| errorString += "\n"; |
| errorString += event.fault; |
| _extension = "txt"; |
| _fileData = errorString; |
| parseCurrentDataWithExtension(); |
| CursorManager.removeBusyCursor(); //get rid of hourglass cursor. |
| _openedFile = null; |
| } |
| |
| static private function getExtension(fileName:String):String |
| { |
| var dotPos:int = fileName.lastIndexOf("."); |
| if (dotPos >= 0) |
| return fileName.substring(dotPos + 1); |
| return fileName; |
| } |
| |
| // hold onto these two in case we need to recreate textFlow |
| static private var _extension:String; |
| static private var _fileData:String; |
| |
| static public function parseCurrentDataWithExtension():void |
| { |
| switch (_extension) |
| { |
| case "xml": // use Vellum markup |
| parseStringIntoFlow(_fileData, TextConverter.TEXT_LAYOUT_FORMAT); |
| break; |
| case "txt": |
| parseStringIntoFlow(_fileData, TextConverter.PLAIN_TEXT_FORMAT); |
| break; |
| case "html": |
| parseStringIntoFlow(_fileData, TextConverter.TEXT_FIELD_HTML_FORMAT); |
| break; |
| |
| } |
| } |
| |
| static private function parseStringIntoFlow(source:String, format:String):void |
| { |
| var textImporter:ITextImporter = TextConverter.getImporter(format); |
| var newFlow:TextFlow = textImporter.importToFlow(source); |
| reportImportErrors(textImporter.errors); |
| // no TextFlow found - Flow will display an empty TextFlow by design |
| // - alternative is to do some kind of error string |
| changeContent(newFlow ? newFlow : new TextFlow()); |
| } |
| |
| static private function reportImportErrors(errors:Vector.<String>):void |
| { |
| if (errors) |
| { |
| var errorText:String = "ERRORS REPORTED ON IMPORT"; |
| for each(var e:String in errors) |
| errorText += "\n" + e; |
| |
| var dlg:StatusPopup = new StatusPopup(); |
| dlg.closeFunction = closeStatusPopup; |
| |
| PopUpManager.addPopUp(dlg, parentWindow, true); |
| PopUpManager.centerPopUp(dlg); |
| // stick it in the upper left |
| dlg.x = 0; |
| dlg.y = 0; |
| |
| dlg.setDialogText(errorText); |
| } |
| } |
| static private function closeStatusPopup(dlg:StatusPopup):void |
| { |
| PopUpManager.removePopUp(dlg); |
| } |
| |
| static private function importStatusPopupContent(dlg:StatusPopup):void |
| { |
| switch(dlg.textFormat) |
| { |
| case TextConverter.TEXT_LAYOUT_FORMAT: |
| _extension = "xml"; |
| break; |
| case TextConverter.TEXT_FIELD_HTML_FORMAT: |
| _extension = "html"; |
| break; |
| } |
| _fileData = dlg.getDialogText(); |
| parseCurrentDataWithExtension(); |
| PopUpManager.removePopUp(dlg); |
| } |
| |
| static private function saveStatusPopupContent(dlg:StatusPopup):void |
| { |
| var extension:String; |
| switch(dlg.textFormat) |
| { |
| case TextConverter.TEXT_LAYOUT_FORMAT: |
| extension = "xml"; |
| break; |
| case TextConverter.TEXT_FIELD_HTML_FORMAT: |
| extension = "html"; |
| break; |
| } |
| |
| var fileReference:FileReference = new FileReference(); |
| fileReference.save(dlg.getDialogText(),extension == null ? null : "NewFile."+extension); |
| } |
| |
| |
| |
| // Export related code |
| static public function textLayoutExport(activeFlow:TextFlow) : void |
| { |
| export(activeFlow, TextConverter.TEXT_LAYOUT_FORMAT); |
| } |
| |
| |
| static public function htmlExport(activeFlow:TextFlow) : void |
| { |
| export(activeFlow, TextConverter.TEXT_FIELD_HTML_FORMAT); |
| } |
| |
| static private const xmlBoilerPlate:String = '<?xml version="1.0" encoding="utf-8"?>\n'; |
| |
| static public function export(activeFlow:TextFlow, format:String) : void |
| { |
| //CONFIG::debug |
| { |
| var originalSettings:Object = XML.settings(); |
| try |
| { |
| XML.ignoreProcessingInstructions = false; |
| XML.ignoreWhitespace = false; |
| XML.prettyPrinting = false; |
| |
| |
| var exporter:ITextExporter = TextConverter.getExporter(format); |
| var xmlExport:String = exporter.export(activeFlow, ConversionType.STRING_TYPE) as String; |
| |
| var result:String = xmlBoilerPlate + xmlExport; |
| XML.setSettings(originalSettings); |
| } |
| |
| catch(e:Error) |
| { |
| XML.setSettings(originalSettings); |
| throw(e); |
| } |
| } |
| |
| // show it in the pop-up dialog |
| var dlg:StatusPopup = new StatusPopup(); |
| dlg.closeFunction = closeStatusPopup; |
| dlg.importFunction = importStatusPopupContent; |
| dlg.saveFunction = saveStatusPopupContent; |
| dlg.textFormat = format; |
| |
| PopUpManager.addPopUp(dlg, parentWindow, true); |
| PopUpManager.centerPopUp(dlg); |
| // stick it in the upper left |
| dlg.x = 0; |
| dlg.y = 0; |
| |
| dlg.setDialogText(result); |
| |
| } |
| |
| |
| |
| } |
| } |