package com.oxylusflash.book { import com.oxylusflash.events.ParamEvent; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.MouseEvent; import flash.events.ProgressEvent; import flash.net.URLRequest; import flash.printing.PrintJob; import flash.printing.PrintJobOptions; import flash.system.LoaderContext; public class FullView extends FadeInOutItem { public static const ZOOM_SOURCE_CHANGED:String = "zoomSourceChanged"; public static const SOURCE_LOAD_START:String = "sourceLoadStart"; public static const SOURCE_LOAD_END:String = "sourceLoadEnd"; public var toolBarMc:FullViewToolbar; public var zoomSrcHolder:ZoomSourceHolder; private var zoomSrcLoader:Loader; private var w:Number = 0; private var h:Number = 0; public var crtSourceIndex:int = 0; private var printJob:PrintJob; private var printJobOptions:PrintJobOptions = new PrintJobOptions; /** * Book page zoom view. */ public function FullView() { this.alpha = 0; _state = FadeInOutItem.INVISIBLE; zoomSrcHolder = this.addChildAt(new ZoomSourceHolder, 0) as ZoomSourceHolder; } /** * Create new loader for external zoom content. */ private function createZoomSrcLoader():void { clearZoomSrcLoader(); zoomSrcLoader = new Loader(); zoomSrcLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, zoomSrcLoader_ioErrorHandler, false, 0, true); zoomSrcLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, zoomSrcLoader_progressHandler, false, 0, true); zoomSrcLoader.contentLoaderInfo.addEventListener(Event.INIT, zoomSrcLoader_initHandler, false, 0, true); } /** * Clear current loader if exists. */ private function clearZoomSrcLoader():void { if (zoomSrcLoader) { try { zoomSrcLoader.close(); } catch (error:Error) { } zoomSrcLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, zoomSrcLoader_ioErrorHandler); zoomSrcLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, zoomSrcLoader_progressHandler); zoomSrcLoader.contentLoaderInfo.removeEventListener(Event.INIT, zoomSrcLoader_initHandler); zoomSrcLoader = null; } } /** * Loader event handlers. */ private function zoomSrcLoader_ioErrorHandler(e:IOErrorEvent):void { trace("[ERROR] I/O Error: " + e.text); } private function zoomSrcLoader_progressHandler(e:ProgressEvent):void { Global.msgBox.label = String(Global.xmlTranslate.str34).replace(/%PERCENTAGE%/g, String(Math.round(e.bytesLoaded / e.bytesTotal * 100))); } private function zoomSrcLoader_initHandler(e:Event):void { Global.msgBox.hide(); zoomSrcHolder.addWrapperFor(zoomSrcLoader.content); dispatchEvent(new Event(SOURCE_LOAD_END)); } /** * Show zoom source for a certain page. * @param sourceIndex Zoom source index. */ public function show(sourceIndex:int = -1):void { Global.overlay.state = FadeInOutItem.VISIBLE; this.state = FadeInOutItem.VISIBLE; loadZoomSource(sourceIndex); } /** * Hide full view. */ public function hide():void { clearZoomSrcLoader(); zoomSrcHolder.clearWrapper(); this.state = FadeInOutItem.INVISIBLE; Global.overlay.state = FadeInOutItem.INVISIBLE; Global.msgBox.hide(); } /** * Print current page view. */ public function printCurrentView():void { printJob = new PrintJob(); if (printJob.start() && zoomSrcHolder.wrapper) { zoomSrcHolder.wrapper.changeToPrintSize(printJob.pageWidth, printJob.pageHeight); printJobOptions.printAsBitmap = BookPage.zoomSources[crtSourceIndex].printAsBitmap; printJob.addPage(zoomSrcHolder.wrapper.content, null, printJobOptions); zoomSrcHolder.wrapper.changeToOriginalSize(); printJob.send(); } printJob = null; } /** * Load zoom source. * @param sourceIndex Zoom source index. */ public function loadZoomSource(sourceIndex:int):void { if (sourceIndex >= 0 && sourceIndex < BookPage.zoomSources.length) { dispatchEvent(new Event(SOURCE_LOAD_START)); zoomSrcHolder.blurWrapper(); Global.msgBox.show("Loading 100%"); Global.msgBox.label = String(Global.xmlTranslate.str34).replace(/%PERCENTAGE%/g, "0"); var zoomData:Object = BookPage.zoomSources[sourceIndex]; createZoomSrcLoader(); zoomSrcLoader.load(new URLRequest(zoomData.zoomSource)); Global.theBook.roughPageIndexUpdate(zoomData.pageIndex); crtSourceIndex = sourceIndex; this.dispatchEvent(new ParamEvent(ZOOM_SOURCE_CHANGED, { prevEnabled: crtSourceIndex != 0, nextEnabled: crtSourceIndex != BookPage.zoomSources.length - 1 } ) ); } } /** * Load next page. */ public function loadNextZoomSrc():void { loadZoomSource(crtSourceIndex + 1); } /** * Load previous page. */ public function loadPrevZoomSrc():void { loadZoomSource(crtSourceIndex - 1); } /** * Overrides. */ override protected function fadeCompleteHandler():void { super.fadeCompleteHandler(); if (_state == FadeInOutItem.INVISIBLE) { zoomSrcHolder.clearWrapper(); } } override public function get width():Number { return w; } override public function set width(value:Number):void { var dx:Number = value - w; w = value; zoomSrcHolder.width = value; if (dx != value && toolBarMc.x - w * 0.5 > 0) { toolBarMc.updatePosition(toolBarMc.x + dx, toolBarMc.y); } } override public function get height():Number { return h; } override public function set height(value:Number):void { var dy:Number = value - h; h = value; zoomSrcHolder.height = value; if (dy != value && toolBarMc.y - h * 0.5 > 0) { toolBarMc.updatePosition(toolBarMc.x, toolBarMc.y + dy); } } } }