PageRenderTime 29ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/FlexPaper/src/com/devaldi/controls/flexpaper/Viewer.as

http://flexpaper.googlecode.com/
ActionScript | 1896 lines | 1486 code | 358 blank | 52 comment | 463 complexity | f72a0c045faee902976cf5188c76db37 MD5 | raw file
  1. /*
  2. Copyright 2009 Erik Engstr??m
  3. This file is part of FlexPaper.
  4. FlexPaper is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, version 3 of the License.
  7. FlexPaper is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with FlexPaper. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. package com.devaldi.controls.flexpaper
  15. {
  16. import caurina.transitions.Tweener;
  17. import com.devaldi.controls.FlowBox;
  18. import com.devaldi.controls.FlowVBox;
  19. import com.devaldi.controls.MatrixTransformer;
  20. import com.devaldi.controls.Spinner;
  21. import com.devaldi.controls.ZoomCanvas;
  22. import com.devaldi.controls.flexpaper.resources.MenuIcons;
  23. import com.devaldi.controls.flexpaper.utils.StreamUtil;
  24. import com.devaldi.controls.flexpaper.utils.TextMapUtil;
  25. import com.devaldi.events.CurrentPageChangedEvent;
  26. import com.devaldi.events.CursorModeChangedEvent;
  27. import com.devaldi.events.DocumentLoadedEvent;
  28. import com.devaldi.events.DocumentPrintedEvent;
  29. import com.devaldi.events.ErrorLoadingPageEvent;
  30. import com.devaldi.events.ExternalLinkClickedEvent;
  31. import com.devaldi.events.FitModeChangedEvent;
  32. import com.devaldi.events.PageLoadedEvent;
  33. import com.devaldi.events.PageLoadingEvent;
  34. import com.devaldi.events.ScaleChangedEvent;
  35. import com.devaldi.events.SelectionCreatedEvent;
  36. import com.devaldi.events.SwfLoadedEvent;
  37. import com.devaldi.events.ViewModeChangedEvent;
  38. import com.devaldi.streaming.DupImage;
  39. import com.devaldi.streaming.DupLoader;
  40. import com.devaldi.streaming.IDocumentLoader;
  41. import com.devaldi.streaming.IGenericDocument;
  42. import com.devaldi.streaming.ITextSelectableDisplayObject;
  43. import com.devaldi.streaming.SwfDocument;
  44. import flash.display.AVM1Movie;
  45. import flash.display.Bitmap;
  46. import flash.display.BitmapData;
  47. import flash.display.DisplayObject;
  48. import flash.display.InteractiveObject;
  49. import flash.display.Loader;
  50. import flash.display.MovieClip;
  51. import flash.display.Shape;
  52. import flash.display.SimpleButton;
  53. import flash.display.Sprite;
  54. import flash.events.Event;
  55. import flash.events.IOErrorEvent;
  56. import flash.events.KeyboardEvent;
  57. import flash.events.MouseEvent;
  58. import flash.events.ProgressEvent;
  59. import flash.external.ExternalInterface;
  60. import flash.filters.DropShadowFilter;
  61. import flash.geom.Matrix;
  62. import flash.geom.Point;
  63. import flash.net.URLRequest;
  64. import flash.printing.PrintJob;
  65. import flash.printing.PrintJobOptions;
  66. import flash.system.ApplicationDomain;
  67. import flash.system.LoaderContext;
  68. import flash.system.System;
  69. import flash.text.TextSnapshot;
  70. import flash.ui.Keyboard;
  71. import flash.utils.ByteArray;
  72. import flash.utils.Timer;
  73. import flash.utils.escapeMultiByte;
  74. import flash.utils.setTimeout;
  75. import mx.containers.Canvas;
  76. import mx.controls.Image;
  77. import mx.core.Container;
  78. import mx.core.UIComponent;
  79. import mx.events.FlexEvent;
  80. import mx.managers.CursorManager;
  81. import mx.managers.PopUpManager;
  82. import mx.resources.ResourceManager;
  83. import mx.rpc.events.FaultEvent;
  84. import mx.rpc.events.ResultEvent;
  85. import mx.rpc.http.HTTPService;
  86. [Event(name="onDocumentLoaded", type="com.devaldi.events.DocumentLoadedEvent")]
  87. [Event(name="onPageLoaded", type="com.devaldi.events.PageLoadedEvent")]
  88. [Event(name="onPageLoading", type="com.devaldi.events.PageLoadingEvent")]
  89. [Event(name="onDocumentLoading", type="flash.events.Event")]
  90. [Event(name="onNoMoreSearchResults", type="flash.events.Event")]
  91. [Event(name="onLoadingProgress", type="flash.events.ProgressEvent")]
  92. [Event(name="onScaleChanged", type="com.devaldi.events.ScaleChangedEvent")]
  93. [Event(name="onExternalLinkClicked", type="com.devaldi.events.ExternalLinkClickedEvent")]
  94. [Event(name="onCurrPageChanged", type="com.devaldi.events.CurrentPageChangedEvent")]
  95. [Event(name="onViewModeChanged", type="com.devaldi.events.ViewModeChangedEvent")]
  96. [Event(name="onFitModeChanged", type="com.devaldi.events.FitModeChangedEvent")]
  97. [Event(name="onCursorModeChanged", type="com.devaldi.events.CursorModeChangedEvent")]
  98. [Event(name="onDocumentLoadedError", type="flash.events.ErrorEvent")]
  99. [Event(name="onLogoClicked", type="flash.events.Event")]
  100. [Event(name="onSelectionCreated", type="com.devaldi.events.SelectionCreatedEvent")]
  101. [Event(name="onDocumentPrinted", type="com.devaldi.events.DocumentPrintedEvent")]
  102. [Event(name="onErrorLoadingPage", type="com.devaldi.events.ErrorLoadingPageEvent")]
  103. public class Viewer extends Canvas
  104. {
  105. private var _swfFile:String = "";
  106. private var _swfFileChanged:Boolean = false;
  107. private var _initialized:Boolean = false;
  108. private var _loaderptr:Loader;
  109. private var _libMC:IGenericDocument;
  110. private var _displayContainer:Container;
  111. private var _paperContainer:ZoomCanvas;
  112. private var _swfContainer:Canvas;
  113. private var _scale:Number = 1;
  114. private var _pscale:Number = 1;
  115. private var _swfLoaded:Boolean = false;
  116. private var _pageList:Array;
  117. private var _viewMode:String = Viewer.InitViewMode;
  118. private var _fitMode:String = FitModeEnum.FITNONE ;
  119. public static var InitViewMode:String = ViewModeEnum.PORTRAIT;
  120. private var _scrollToPage:Number = 0;
  121. private var _numPages:Number = 0;
  122. private var _currPage:Number = 0;
  123. private var _tweencount:Number = 0;
  124. private var _bbusyloading:Boolean = true;
  125. private var _zoomtransition:String = "easeOut";
  126. private var _zoomtime:Number = 0.6;
  127. private var _fitPageOnLoad:Boolean = false;
  128. private var _fitWidthOnLoad:Boolean = false;
  129. private var _dupImageClicked:Boolean = false;
  130. private var _docLoader:IDocumentLoader;
  131. private var _progressiveLoading:Boolean = false;
  132. private var _encodeURI:Boolean = true;
  133. private var _repaintTimer:Timer;
  134. private var _loadTimer:Timer;
  135. private var _frameLoadCount:int = 0;
  136. private var _adjGotoPage:int = 0;
  137. private var _zoomInterval:Number = 0;
  138. private var _inputBytes:ByteArray;
  139. private var _textSelectEnabled:Boolean = false;
  140. private var _cursorsEnabled:Boolean = true;
  141. private var _grabCursorID:Number = 0;
  142. private var _grabbingCursorID:Number = 0;
  143. private var _pluginList:Array;
  144. public static var ViewModeExtList:Array;
  145. private var _currentExtViewMode:IFlexPaperViewModePlugin;
  146. private var _minZoomSize:Number = 0.3;
  147. private var _maxZoomSize:Number = 5;
  148. private var _searchMatchAll:Boolean = false;
  149. private var _searchServiceUrl:String = "";
  150. private var _performSearchOnPageLoad:Boolean = false;
  151. private var _autoAdjustPrintSize:Boolean = true;
  152. private var _pendingSearchPage:int = -1;
  153. private var _printPaperAsBitmap:Boolean = false;
  154. private var _skinImg:Bitmap = new MenuIcons.SMALL_TRANSPARENT();
  155. private var _skinImgc:Bitmap = new MenuIcons.SMALL_TRANSPARENT_COLOR();
  156. private var _skinImgDo:Image;
  157. public function Viewer(){
  158. super();
  159. }
  160. public function get BusyLoading():Boolean {
  161. return _bbusyloading;
  162. }
  163. public function set BusyLoading(b:Boolean):void {
  164. _bbusyloading = b;
  165. }
  166. public function get libMC():IGenericDocument {
  167. return _libMC;
  168. }
  169. public function get IsInitialized():Boolean{
  170. return _initialized;
  171. }
  172. public function get SwfLoaded():Boolean{
  173. return _swfLoaded;
  174. }
  175. public function get DisplayContainer():Container{
  176. return _displayContainer;
  177. }
  178. public function set DisplayContainer(c:Container):void{
  179. _displayContainer = c;
  180. }
  181. public function get PaperContainer():ZoomCanvas{
  182. return _paperContainer;
  183. }
  184. public function get PageList():Array {
  185. return _pageList;
  186. }
  187. public function get DocLoader():IDocumentLoader{
  188. return _docLoader;
  189. }
  190. public function set DocLoader(d:IDocumentLoader):void{
  191. _docLoader = d;
  192. }
  193. [Bindable]
  194. public function get ViewMode():String {
  195. return _viewMode;
  196. }
  197. [Bindable]
  198. public function get FitMode():String {
  199. return _fitMode;
  200. }
  201. public function set ViewMode(s:String):void {
  202. if(s!=_viewMode){
  203. for each (var vme:IFlexPaperViewModePlugin in ViewModeExtList){
  204. if(s == vme.Name){
  205. _currentExtViewMode = vme;
  206. }
  207. }
  208. if(s == ViewModeEnum.TILE&&ViewMode==ViewModeEnum.PORTRAIT){_pscale = _scale; _scale = 0.23;_paperContainer.verticalScrollPosition = 0;_fitMode = FitModeEnum.FITNONE;}else{_scale = _pscale;}
  209. _paperContainer.x = (s==ViewModeEnum.PORTRAIT||s==ViewModeEnum.TILE)?2.5:0;
  210. _viewMode = s;
  211. if(_initialized && _swfLoaded){createDisplayContainer();if(this._progressiveLoading){this.addInLoadedPages(true);}else{reCreateAllPages();}_displayContainer.visible = true;}
  212. FitMode = FitModeEnum.FITNONE;
  213. if(UsingExtViewMode){
  214. CurrExtViewMode.setViewMode(s);
  215. _viewMode = s;
  216. }
  217. dispatchEvent(new ViewModeChangedEvent(ViewModeChangedEvent.VIEWMODE_CHANGED,_viewMode));
  218. dispatchEvent(new ScaleChangedEvent(ScaleChangedEvent.SCALE_CHANGED,_scale));
  219. dispatchEvent(new FitModeChangedEvent(FitModeChangedEvent.FITMODE_CHANGED,_fitMode));
  220. }
  221. }
  222. public function set FitMode(s:String):void {
  223. if(_viewMode == ViewModeEnum.TILE){_fitMode = FitModeEnum.FITNONE;return}
  224. if(s!=_fitMode){
  225. _fitMode = s;
  226. switch(s){
  227. case FitModeEnum.FITWIDTH:
  228. fitWidth();
  229. break;
  230. case FitModeEnum.FITHEIGHT:
  231. fitHeight();
  232. break;
  233. }
  234. dispatchEvent(new FitModeChangedEvent(FitModeChangedEvent.FITMODE_CHANGED,_fitMode));
  235. }
  236. }
  237. public function set ProgressiveLoading(b1:Boolean):void {
  238. _progressiveLoading = b1;
  239. }
  240. [Bindable]
  241. public function get ProgressiveLoading():Boolean {
  242. return _progressiveLoading;
  243. }
  244. public function set EncodeURI(b1:Boolean):void {
  245. _encodeURI = b1;
  246. }
  247. [Bindable]
  248. public function get EncodeURI():Boolean {
  249. return _encodeURI;
  250. }
  251. public function set TextSelectEnabled(b1:Boolean):void {
  252. _textSelectEnabled = b1;
  253. if(_textSelectEnabled && CursorsEnabled)
  254. dispatchEvent(new CursorModeChangedEvent(CursorModeChangedEvent.CURSORMODE_CHANGED,"TextSelectorCursor"));
  255. else
  256. dispatchEvent(new CursorModeChangedEvent(CursorModeChangedEvent.CURSORMODE_CHANGED,"ArrowCursor"));
  257. }
  258. [Bindable]
  259. public function get TextSelectEnabled():Boolean {
  260. return _textSelectEnabled;
  261. }
  262. [Bindable]
  263. public function get CursorsEnabled():Boolean {
  264. return _cursorsEnabled;
  265. }
  266. public function set CursorsEnabled(b:Boolean):void {
  267. _cursorsEnabled = b;
  268. }
  269. public function setPaperFocus():void{
  270. _paperContainer.setFocus();
  271. }
  272. public function get ZoomTransition():String {
  273. return _zoomtransition;
  274. }
  275. public function set ZoomTransition(s:String):void {
  276. _zoomtransition = s;
  277. }
  278. public function get ZoomTime():Number {
  279. return _zoomtime;
  280. }
  281. public function set ZoomTime(n:Number):void {
  282. _zoomtime = n;
  283. }
  284. public function get MinZoomSize():Number {
  285. return _minZoomSize;
  286. }
  287. public function set MinZoomSize(n:Number):void {
  288. _minZoomSize = n;
  289. }
  290. public function get MaxZoomSize():Number {
  291. return _maxZoomSize;
  292. }
  293. public function set MaxZoomSize(n:Number):void {
  294. _maxZoomSize = n;
  295. }
  296. public function get PluginList():Array{
  297. return _pluginList;
  298. }
  299. public function set PluginList(p:Array):void{
  300. _pluginList = p;
  301. }
  302. public function get CurrExtViewMode():IFlexPaperViewModePlugin{
  303. if(_currentExtViewMode != null && _currentExtViewMode.Name == ViewMode)
  304. return _currentExtViewMode;
  305. else{
  306. for each (var vme:IFlexPaperViewModePlugin in ViewModeExtList){
  307. if(ViewMode == vme.Name){
  308. _currentExtViewMode = vme;
  309. }
  310. }
  311. }
  312. return _currentExtViewMode;
  313. }
  314. public function get UsingExtViewMode():Boolean{
  315. if(ViewMode == ViewModeEnum.PORTRAIT || ViewMode == ViewModeEnum.TILE)
  316. return false;
  317. else
  318. return (CurrExtViewMode!=null && ViewMode == CurrExtViewMode.Name);
  319. }
  320. public function get ZoomInterval():Number {
  321. return _zoomInterval;
  322. }
  323. public function set ZoomInterval(n:Number):void {
  324. _zoomInterval = n;
  325. }
  326. [Bindable]
  327. public function get numPages():Number {
  328. return _numPages;
  329. }
  330. private function set numPages(n:Number):void {
  331. _numPages = n;
  332. }
  333. [Bindable]
  334. public function get numPagesLoaded():Number {
  335. return (_libMC!=null)?_libMC.framesLoaded:0;
  336. }
  337. private function set numPagesLoaded(n:Number):void {
  338. }
  339. [Bindable]
  340. public function get currPage():Number {
  341. return _currPage;
  342. }
  343. private function set currPage(n:Number):void {
  344. _currPage = n;
  345. }
  346. [Bindable]
  347. public function get SearchMatchAll():Boolean {
  348. if(SearchServiceUrl!=null && SearchServiceUrl.length>0)
  349. return false;
  350. else
  351. return _searchMatchAll;
  352. }
  353. public function set SearchMatchAll(b1:Boolean):void {
  354. _searchMatchAll = b1;
  355. }
  356. public function set AutoAdjustPrintSize(b1:Boolean):void {
  357. _autoAdjustPrintSize = b1;
  358. }
  359. [Bindable]
  360. public function get AutoAdjustPrintSize():Boolean {
  361. return _autoAdjustPrintSize;
  362. }
  363. public function set PrintPaperAsBitmap(b1:Boolean):void{
  364. _printPaperAsBitmap = b1;
  365. }
  366. [Bindable]
  367. public function get PrintPaperAsBitmap():Boolean{
  368. return _printPaperAsBitmap;
  369. }
  370. [Bindable]
  371. public function get SearchServiceUrl():String {
  372. return _searchServiceUrl;
  373. }
  374. public function set SearchServiceUrl(s1:String):void {
  375. _searchServiceUrl = unescape(s1);
  376. }
  377. public function get FitWidthOnLoad():Boolean {
  378. return _fitWidthOnLoad;
  379. }
  380. public function set FitWidthOnLoad(b1:Boolean):void {
  381. _fitWidthOnLoad = b1;
  382. }
  383. public function get FitPageOnLoad():Boolean {
  384. return _fitPageOnLoad;
  385. }
  386. public function set FitPageOnLoad(b2:Boolean):void {
  387. _fitPageOnLoad = b2;
  388. }
  389. public function gotoPage(p:Number, adjGotoPage:int=0):void{
  390. if(adjGotoPage!=0){_adjGotoPage=adjGotoPage;}
  391. if(p<1 || p-1 >_pageList.length)
  392. return;
  393. else{
  394. if(ViewMode == ViewModeEnum.PORTRAIT){
  395. _paperContainer.verticalScrollPosition = _pageList[p-1].y+3 + _adjGotoPage;
  396. }
  397. if(UsingExtViewMode)
  398. CurrExtViewMode.gotoPage(p,adjGotoPage);
  399. // retry if y is not set
  400. if(!UsingExtViewMode && p>1 && _pageList[p-1].y ==0)
  401. {
  402. flash.utils.setTimeout(gotoPage,200,p);
  403. }
  404. else
  405. _adjGotoPage = 0;
  406. repaint();
  407. }
  408. }
  409. public function mvNext(extmode:Boolean=true):void{
  410. if(UsingExtViewMode && extmode)
  411. CurrExtViewMode.mvNext();
  412. else
  413. if(currPage<numPages){gotoPage(currPage+1);}
  414. }
  415. public function mvPrev(extmode:Boolean=true):void{
  416. if(UsingExtViewMode && extmode)
  417. CurrExtViewMode.mvPrev();
  418. else
  419. {
  420. if(currPage>1){gotoPage(currPage-1);}
  421. }
  422. }
  423. public function switchMode(mode:String=null):void{
  424. if(mode==null){ // no mode passed, just
  425. if(ViewMode == ViewModeEnum.PORTRAIT){ViewMode = ViewModeEnum.TILE;}
  426. else if(ViewMode == ViewModeEnum.TILE){_scale = _pscale; ViewMode = ViewModeEnum.PORTRAIT;}
  427. }else{
  428. if(ViewMode == mode && ViewMode != ViewModeEnum.PORTRAIT){
  429. ViewMode = Viewer.InitViewMode;
  430. }
  431. else
  432. ViewMode = mode;
  433. }
  434. }
  435. public function get PaperVisible():Boolean {
  436. return _paperContainer.visible;
  437. }
  438. public function set PaperVisible(b:Boolean):void {
  439. _paperContainer.visible = b;
  440. }
  441. public function get SwfFile():String {
  442. return _swfFile;
  443. }
  444. public function getSwfFilePerPage(swfFile:String, page:int):String{
  445. var fileName:String = swfFile;
  446. var map:String = (fileName.substr(fileName.indexOf("[*,"),fileName.indexOf("]")-fileName.indexOf("[*,")+1));
  447. var padding:int = parseInt(map.substr(map.indexOf(",")+1,map.indexOf("]")-2));
  448. fileName = TextMapUtil.StringReplaceAll(fileName,map,padString(page.toString(),padding,"0"));
  449. return encodeURI(fileName);
  450. }
  451. public function loadFromBytes(bytes:ByteArray):void{
  452. clearPlugins();
  453. deleteDisplayContainer();
  454. deletePageList();
  455. deleteLoaderPtr();
  456. deleteLoaderList();
  457. deleteFLoader();
  458. deleteSelectionMarker();
  459. TextMapUtil.totalFragments = "";
  460. deleteLibMC();
  461. _swfFileChanged = true;
  462. _frameLoadCount = 0;
  463. ViewMode = Viewer.InitViewMode;
  464. try{
  465. new flash.net.LocalConnection().connect('devaldiGCdummy');
  466. new flash.net.LocalConnection().connect('devaldiGCdummy');
  467. } catch (e:*) {}
  468. try{flash.system.System.gc();} catch (e:*) {}
  469. if(_docLoader!=null && !_docLoader.hasEventListener(SwfLoadedEvent.SWFLOADED)){
  470. _docLoader.addEventListener("onDocumentLoadedError", onDocumentLoadedErrorHandler,false,0,true);
  471. _docLoader.addEventListener(SwfLoadedEvent.SWFLOADED, swfComplete,false,0,true);
  472. }
  473. if(_docLoader!=null){
  474. _docLoader.stream.removeEventListener(ProgressEvent.PROGRESS, onLoadProgress);
  475. _docLoader.stream.addEventListener(ProgressEvent.PROGRESS, onLoadProgress,false,0,true);
  476. }
  477. _docLoader.loadFromBytes(bytes);
  478. _paperContainer.verticalScrollPosition = 0;
  479. createDisplayContainer();
  480. // Changing the SWF file causes the component to invalidate.
  481. invalidateProperties();
  482. invalidateSize();
  483. invalidateDisplayList();
  484. }
  485. public function set SwfFile(s:String):void {
  486. var pagesSplit:Boolean = false;
  487. if(EncodeURI)
  488. s = unescape(s);
  489. if(s.length!=0){
  490. if(s.indexOf("{")>=0 && s.indexOf("}")>0){
  491. numPages = parseInt(s.substr(s.lastIndexOf(",")+1,s.indexOf("}")-s.lastIndexOf(",")-1));
  492. s = TextMapUtil.StringReplaceAll(s,"{","");
  493. s = TextMapUtil.StringReplaceAll(s,","+numPages.toString()+"}","");
  494. pagesSplit = true;
  495. }
  496. clearPlugins();
  497. deleteDisplayContainer();
  498. deletePageList();
  499. deleteLoaderPtr();
  500. deleteLoaderList();
  501. deleteFLoader();
  502. deleteSelectionMarker();
  503. TextMapUtil.totalFragments = "";
  504. if(s!=_swfFile)
  505. deleteLibMC();
  506. _swfFileChanged = true;
  507. _frameLoadCount = 0;
  508. _currPage = 0;
  509. if(!pagesSplit){
  510. if(EncodeURI)
  511. _swfFile = encodeURI(s);
  512. else
  513. _swfFile = s;
  514. }
  515. else
  516. _swfFile = s;
  517. ViewMode = Viewer.InitViewMode;
  518. try{
  519. new flash.net.LocalConnection().connect('devaldiGCdummy');
  520. new flash.net.LocalConnection().connect('devaldiGCdummy');
  521. } catch (e:*) {}
  522. try{flash.system.System.gc();} catch (e:*) {}
  523. if(_docLoader!=null && !_docLoader.hasEventListener(SwfLoadedEvent.SWFLOADED)){
  524. _docLoader.IsSplit = pagesSplit;
  525. _docLoader.addEventListener("onDocumentLoadedError", onDocumentLoadedErrorHandler,false,0,true);
  526. _docLoader.addEventListener(SwfLoadedEvent.SWFLOADED, swfComplete,false,0,true);
  527. }
  528. if(_docLoader!=null){
  529. _docLoader.stream.removeEventListener(ProgressEvent.PROGRESS, onLoadProgress);
  530. _docLoader.stream.addEventListener(ProgressEvent.PROGRESS, onLoadProgress,false,0,true);
  531. }
  532. _paperContainer.verticalScrollPosition = 0;
  533. createDisplayContainer();
  534. // Changing the SWF file causes the component to invalidate.
  535. invalidateProperties();
  536. invalidateSize();
  537. invalidateDisplayList();
  538. if(_swfFile.length>0 && pagesSplit){
  539. _loadTimer = new Timer(100);
  540. _loadTimer.addEventListener("timer",loadtimer);
  541. _docLoader.load(new URLRequest(getSwfFilePerPage(_swfFile,1)),StreamUtil.getExecutionContext()); //new URLRequest(decodeURI(_swfFile))
  542. }
  543. else if(_swfFile.length > 0 && !pagesSplit)
  544. _docLoader.load(new URLRequest(_swfFile),StreamUtil.getExecutionContext());
  545. }
  546. }
  547. [Bindable]
  548. public function get Scale():String {
  549. return _scale.toString();
  550. }
  551. public function get CurrentlySelectedText():String {
  552. return _currentlySelectedText;
  553. }
  554. public function Zoom(factor:Number, fnOnUpdate:Function=null):void{
  555. if(factor<_minZoomSize || factor>_maxZoomSize || factor == _scale)
  556. return;
  557. if((!UsingExtViewMode && _viewMode != ViewModeEnum.PORTRAIT) || (UsingExtViewMode && !CurrExtViewMode.doZoom)){return;}
  558. var _target:DisplayObject;
  559. _paperContainer.CenteringEnabled = (_paperContainer.width>0);
  560. _tweencount = _displayContainer.numChildren;
  561. for(var i:int=0;i<_displayContainer.numChildren;i++){
  562. _target = _displayContainer.getChildAt(i);
  563. _target.filters = null;
  564. if(fnOnUpdate!=null)
  565. Tweener.addTween(_target, {scaleX: factor, scaleY: factor, time: _zoomtime, transition: _zoomtransition, onUpdate: fnOnUpdate, onComplete: tweenComplete});
  566. else
  567. Tweener.addTween(_target, {scaleX: factor, scaleY: factor, time: _zoomtime, transition: _zoomtransition, onComplete: tweenComplete});
  568. }
  569. FitMode = FitModeEnum.FITNONE;
  570. _scale = factor;
  571. dispatchEvent(new ScaleChangedEvent(ScaleChangedEvent.SCALE_CHANGED,_scale));
  572. }
  573. public function rotate():void{
  574. var rotatenum:int = getVisibleMidPage();
  575. if(rotatenum<_pageList.length-1&&_pageList.length>2){rotatenum = rotatenum - 1;}
  576. (_displayContainer.getChildAt(rotatenum) as DupImage).paperRotation = 90;
  577. }
  578. private function degreesToRadians(degrees:Number):Number {
  579. var radians:Number = degrees * (Math.PI / 180);
  580. return radians;
  581. }
  582. public function getFitWidthFactor():Number{
  583. _libMC.gotoAndStop(1);
  584. return (_paperContainer.width / _libMC.width) - 0.032; //- 0.03;
  585. }
  586. public function getFitHeightFactor():Number{
  587. _libMC.gotoAndStop(1);
  588. return (_paperContainer.height / _libMC.height);
  589. }
  590. public function fitWidth():Boolean{
  591. if(_displayContainer.numChildren == 0){return false;}
  592. var _target:DisplayObject;
  593. _paperContainer.CenteringEnabled = (_paperContainer.width>0);
  594. var factor:Number = getFitWidthFactor();
  595. _scale = factor;
  596. _tweencount = _displayContainer.numChildren;
  597. for(var i:int=0;i<_displayContainer.numChildren;i++){
  598. _target = _displayContainer.getChildAt(i);
  599. _target.filters = null;
  600. Tweener.addTween(_target, {scaleX:factor, scaleY:factor,time: 0, transition: 'easenone', onComplete: tweenComplete});
  601. }
  602. FitMode = FitModeEnum.FITWIDTH;
  603. dispatchEvent(new ScaleChangedEvent(ScaleChangedEvent.SCALE_CHANGED,_scale));
  604. _paperContainer.horizontalScrollPosition = _paperContainer.maxHorizontalScrollPosition/2;
  605. _paperContainer.validateDisplayList();
  606. return factor > 0;
  607. }
  608. public function fitHeight():Boolean{
  609. if(_displayContainer.numChildren == 0){return false;}
  610. var _target:DisplayObject;
  611. _paperContainer.CenteringEnabled = (_paperContainer.height>0);
  612. var factor:Number = getFitHeightFactor();
  613. _scale = factor;
  614. _tweencount = _displayContainer.numChildren;
  615. for(var i:int=0;i<_displayContainer.numChildren;i++){
  616. _target = _displayContainer.getChildAt(i);
  617. _target.filters = null;
  618. Tweener.addTween(_target, {scaleX:factor, scaleY:factor,time: 0, transition: 'easenone', onComplete: tweenComplete});
  619. }
  620. FitMode = FitModeEnum.FITHEIGHT;
  621. dispatchEvent(new ScaleChangedEvent(ScaleChangedEvent.SCALE_CHANGED,_scale));
  622. return factor > 0;
  623. }
  624. private function tweenComplete():void{
  625. _tweencount--;
  626. if(_tweencount==0){
  627. if(_loadTimer!=null)
  628. _loadTimer.start();
  629. repositionPapers();
  630. }
  631. if(_tweencount < numPagesLoaded - 2 || _tweencount == 0){
  632. PaperVisible = true;
  633. }
  634. }
  635. private function reScaleComplete():void{
  636. _tweencount--;
  637. if(_tweencount==0){
  638. if(_displayContainer.numChildren>0){
  639. _paperContainer.verticalScrollPosition = 0;
  640. if(_loadTimer!=null)
  641. _loadTimer.start();
  642. repositionPapers();
  643. }
  644. if(_tweencount < numPagesLoaded - 2 || _tweencount == 0){
  645. PaperVisible = true;
  646. }
  647. }
  648. }
  649. public function set Scale(s:String):void {
  650. var diff:Number = _scale - new Number(s);
  651. _scale = new Number(s);
  652. }
  653. override protected function createChildren():void {
  654. // Call the createChildren() method of the superclass.
  655. super.createChildren();
  656. this.styleName = "viewerBackground";
  657. // Bind events
  658. //_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfComplete);
  659. addEventListener(Event.RESIZE, sizeChanged,false,0,true);
  660. systemManager.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardHandler,false,0,true);
  661. // Create a visible container for the swf
  662. _swfContainer = new Canvas();
  663. _swfContainer.visible = false;
  664. this.addChild(_swfContainer);
  665. // Create a timer to use for repainting
  666. _repaintTimer = new Timer(5,0);
  667. _repaintTimer.addEventListener("timer", repaintHandler);
  668. createDisplayContainer();
  669. }
  670. private function onframeenter(event:Event):void{
  671. if(!_dupImageClicked){return;}
  672. if(_docLoader!=null && _docLoader.IsSplit)
  673. return;
  674. if(event.target.content != null){
  675. if (event.target.parent is DupImage &&
  676. event.target.content.currentFrame!=(event.target.parent as DupImage).dupIndex
  677. && _dupImageClicked){
  678. var np:int = event.target.content.currentFrame;
  679. event.target.content.gotoAndStop((event.target.parent as DupImage).dupIndex);
  680. gotoPage(np);
  681. }
  682. }
  683. }
  684. private function updComplete(event:Event):void {
  685. if(_scrollToPage>0){
  686. _paperContainer.verticalScrollPosition = _pageList[_scrollToPage-1].y;
  687. //_paperContainer.horizontalScrollPosition = 0;
  688. _scrollToPage = 0;
  689. }
  690. repaint();
  691. //repositionPapers();
  692. }
  693. private function repaintHandler(e:Event):void {
  694. if(_loadTimer!=null){
  695. _loadTimer.reset();
  696. _loadTimer.start();
  697. }
  698. repositionPapers();
  699. _repaintTimer.stop();
  700. _repaintTimer.delay = 5;
  701. }
  702. private function loadtimer(e:Event):void {
  703. if(_loadTimer!=null)
  704. _loadTimer.stop();
  705. repositionPapers();
  706. }
  707. private function bytesLoaded(event:Event):void{
  708. event.target.loader.loaded = true;
  709. var bFound:Boolean=false;
  710. // Split up approach
  711. if(_docLoader!=null && _docLoader.IsSplit){
  712. event.target.loader.loading = false;
  713. if(event.target.loader.content!=null && event.target.loader.content is MovieClip){event.target.loader.content.stop();}
  714. for(var i:int=0;i<_docLoader.LoaderList.length;i++){
  715. if(_docLoader.LoaderList[i].loading){
  716. bFound = true;
  717. break;
  718. }
  719. }
  720. _frameLoadCount = numPages;
  721. _bbusyloading = false;
  722. _displayContainer.visible = true;
  723. if(!bFound){
  724. dispatchEvent(new PageLoadedEvent(PageLoadedEvent.PAGE_LOADED,event.target.loader.pageStartIndex));
  725. if(_fitPageOnLoad&&((_paperContainer.height / _libMC.height)>0)){FitMode = FitModeEnum.FITHEIGHT;_fitPageOnLoad=false;_scrollToPage=1;_pscale=_scale;}
  726. if(_fitWidthOnLoad&&((_paperContainer.width / _libMC.width)>0)){FitMode = FitModeEnum.FITWIDTH;_fitWidthOnLoad=false;_scrollToPage=1;_pscale=_scale;}
  727. }
  728. repaint();
  729. }else{ // normal file approach
  730. if(event.target.loader.content!=null){event.target.loader.content.stop();}
  731. if(!ProgressiveLoading || (ProgressiveLoading && _libMC.framesLoaded == _libMC.totalFrames)){
  732. for(var i:int=0;i<_docLoader.LoaderList.length;i++){
  733. if(!_docLoader.LoaderList[i].loaded && !(_docLoader.LoaderList[i].parent is DupImage)){
  734. _docLoader.LoaderList[i].unloadAndStop(true);
  735. _docLoader.LoaderList[i].loadBytes(_inputBytes,StreamUtil.getExecutionContext());
  736. bFound = true;
  737. break;
  738. }
  739. }
  740. }
  741. if(!bFound){
  742. _bbusyloading = false;
  743. if(_fitPageOnLoad){FitMode = FitModeEnum.FITHEIGHT;_fitPageOnLoad=false;_scrollToPage=1;_pscale=_scale;}
  744. if(_fitWidthOnLoad){FitMode = FitModeEnum.FITWIDTH;_fitWidthOnLoad=false;_scrollToPage=1;_pscale=_scale;}
  745. _displayContainer.visible = true;
  746. if( _libMC.framesLoaded == _libMC.totalFrames && _frameLoadCount != _libMC.framesLoaded){
  747. dispatchEvent(new DocumentLoadedEvent(DocumentLoadedEvent.DOCUMENT_LOADED,numPages));
  748. _frameLoadCount = _libMC.framesLoaded;
  749. }
  750. }
  751. }
  752. }
  753. public function repositionPapers():void{
  754. if(_docLoader==null){return;}
  755. if(_docLoader!=null&&_docLoader.LoaderList==null||numPagesLoaded==0){return;}
  756. {
  757. var loaderidx:int=0;
  758. var bFoundFirst:Boolean = false;
  759. var _thumb:Bitmap;
  760. var _thumbData:BitmapData;
  761. var uloaderidx:int=0;
  762. var p:int=-1;
  763. var pl:int=0;
  764. for(var i:int=0;i<_pageList.length;i++){
  765. if(ViewMode == ViewModeEnum.TILE){
  766. if(!bFoundFirst && ((i) * (_pageList[i].height + 6)) >= _paperContainer.verticalScrollPosition){
  767. bFoundFirst = true;
  768. p = i + 1;
  769. }
  770. }
  771. else if(ViewMode == ViewModeEnum.PORTRAIT){
  772. if(!bFoundFirst)
  773. {
  774. var perH:int=0;
  775. if(_pageList.length>1)
  776. {
  777. var nowpH:Number = 0;
  778. var nowP:Number = 0;
  779. while(_paperContainer.verticalScrollPosition+1>nowpH && nowP-1<_pageList.length){
  780. nowP++;
  781. if(nowP<_pageList.length)
  782. nowpH+=_pageList[nowP].y-_pageList[nowP-1].y;
  783. else if(nowP>=_pageList.length)
  784. nowpH+=_pageList[_pageList.length-1].y-_pageList[_pageList.length-2].y;
  785. }
  786. if(0<nowP<0.5)
  787. p = 1;
  788. else if(nowP>=(_pageList.length-0.5))
  789. p = _pageList.length;
  790. else{
  791. p = Math.round(nowP);
  792. if(_pageList.length>p-1&&_paperContainer.verticalScrollPosition<_pageList[p-1].y && p!=_pageList.length){
  793. p-=1;
  794. }
  795. }
  796. bFoundFirst = true;
  797. }
  798. else
  799. {
  800. bFoundFirst = true;
  801. p = 1;
  802. }
  803. }
  804. }
  805. if(p>numPages)
  806. return;
  807. if(UsingExtViewMode){
  808. if(currPage != CurrExtViewMode.currentPage)
  809. dispatchEvent(new CurrentPageChangedEvent(CurrentPageChangedEvent.PAGE_CHANGED,CurrExtViewMode.currentPage));
  810. p = CurrExtViewMode.currentPage;
  811. currPage = p;
  812. }
  813. if(p>0&&p!=_currPage){
  814. currPage = p;
  815. dispatchEvent(new CurrentPageChangedEvent(CurrentPageChangedEvent.PAGE_CHANGED,p));
  816. }
  817. if(_libMC!=null&&checkIsVisible(i)){
  818. if(_pageList[i].numChildren<4){
  819. if(ViewMode == ViewModeEnum.PORTRAIT){
  820. if(_docLoader.IsSplit)
  821. uloaderidx = finduloaderIdx(_pageList[i].dupIndex);
  822. if(!_docLoader.IsSplit || uloaderidx == -1)
  823. uloaderidx = (i==_pageList.length-1&&loaderidx+3<_docLoader.LoaderList.length)?loaderidx+3:(loaderidx<_docLoader.LoaderList.length)?loaderidx:0;
  824. if(!_docLoader.IsSplit){
  825. if(!_bbusyloading && _docLoader.LoaderList!=null && _docLoader.LoaderList.length>0){
  826. if(numPagesLoaded>=_pageList[i].dupIndex && _docLoader.LoaderList[uloaderidx] != null && _docLoader.LoaderList[uloaderidx].content==null||(_docLoader.LoaderList[uloaderidx].content!=null&&_docLoader.LoaderList[uloaderidx].content.framesLoaded<_pageList[i].dupIndex)){
  827. _bbusyloading = true;
  828. _docLoader.LoaderList[uloaderidx].unloadAndStop(true);
  829. _docLoader.LoaderList[uloaderidx].loadBytes(_inputBytes,StreamUtil.getExecutionContext());
  830. flash.utils.setTimeout(repositionPapers,200);
  831. }
  832. }
  833. if((i<2||_pageList[i].numChildren==0||_pageList[i].loadedIndex!=_pageList[i].dupIndex||(_pageList[i]!=null&&_docLoader.LoaderList[uloaderidx]!=null&&_docLoader.LoaderList[uloaderidx].content!=null&&_docLoader.LoaderList[uloaderidx].content.currentFrame!=_pageList[i].dupIndex)) && _docLoader.LoaderList[uloaderidx] != null && _docLoader.LoaderList[uloaderidx].content != null){
  834. if(numPagesLoaded >= _pageList[i].dupIndex){
  835. _docLoader.LoaderList[uloaderidx].content.gotoAndStop(_pageList[i].dupIndex);
  836. _pageList[i].addChild(_docLoader.LoaderList[uloaderidx]);
  837. _pageList[i].loadedIndex = _pageList[i].dupIndex;
  838. /*
  839. if(_libMC.width*_scale>0&&_libMC.height*_scale>0){
  840. _libMC.gotoAndStop(_pageList[i].dupIndex);
  841. _thumbData = new BitmapData(_libMC.width*_scale, _libMC.height*_scale, false, 0xFFFFFF);
  842. _thumb = new Bitmap(_thumbData);
  843. _pageList[i].source = _thumb;
  844. _thumbData.draw(_libMC,new Matrix(_scale, 0, 0, _scale),null,null,null,true);
  845. } */
  846. }
  847. }
  848. }
  849. if(_docLoader.IsSplit){
  850. if(!_bbusyloading && _docLoader.LoaderList!=null && _docLoader.LoaderList.length>0){
  851. if(_docLoader.LoaderList[uloaderidx] != null && _docLoader.LoaderList[uloaderidx].pageStartIndex != _pageList[i].dupIndex && !_loadTimer.running && !_docLoader.LoaderList[uloaderidx].loading){
  852. dispatchEvent(new PageLoadingEvent(PageLoadingEvent.PAGE_LOADING,_pageList[i].dupIndex));
  853. try{
  854. _pageList[i].resetPage(_libMC.width,_libMC.height,_scale,true);
  855. _docLoader.LoaderList[uloaderidx].unloadAndStop(true);
  856. _docLoader.LoaderList[uloaderidx].loaded = false;
  857. _docLoader.LoaderList[uloaderidx].loading = true;
  858. _docLoader.LoaderList[uloaderidx].load(new URLRequest(getSwfFilePerPage(_swfFile,_pageList[i].dupIndex)),StreamUtil.getExecutionContext());
  859. _docLoader.LoaderList[uloaderidx].pageStartIndex = _pageList[i].dupIndex;
  860. }catch(err:IOErrorEvent){}
  861. repaint();
  862. }
  863. }
  864. if((_pageList[i].numChildren==0||(_pageList[i]!=null&&_docLoader.LoaderList[uloaderidx]!=null&&_docLoader.LoaderList[uloaderidx].content!=null)) && _docLoader.LoaderList[uloaderidx] != null && _docLoader.LoaderList[uloaderidx].content != null && _docLoader.LoaderList[uloaderidx].loaded && _docLoader.LoaderList[uloaderidx].pageStartIndex == _pageList[i].dupIndex){
  865. if(numPagesLoaded >= _pageList[i].dupIndex||true){
  866. if(_docLoader.LoaderList[uloaderidx].parent != null)
  867. _docLoader.LoaderList[uloaderidx].parent.removeChild(_docLoader.LoaderList[uloaderidx]);
  868. _pageList[i].addChild(_docLoader.LoaderList[uloaderidx]);
  869. _pageList[i].loadedIndex = _pageList[i].dupIndex;
  870. if((_performSearchOnPageLoad && _pendingSearchPage == _pageList[i].dupIndex)||(SearchMatchAll && prevSearchText.length>0)){
  871. _performSearchOnPageLoad = false;
  872. searchTextByService(prevSearchText)
  873. }
  874. }
  875. }
  876. }
  877. }else if(ViewMode == ViewModeEnum.TILE && _pageList[i].source == null && (numPagesLoaded >= _pageList[i].dupIndex||_docLoader.IsSplit)){
  878. if(!_docLoader.IsSplit){
  879. _libMC.gotoAndStop(_pageList[i].dupIndex);
  880. _thumbData = new BitmapData(_libMC.width*_scale, _libMC.height*_scale, false, 0xFFFFFF);
  881. _thumb = new Bitmap(_thumbData);
  882. _pageList[i].source = _thumb;
  883. _thumbData.draw(_libMC.getDocument(),new Matrix(_scale, 0, 0, _scale),null,null,null,true);
  884. }else{
  885. if(!_bbusyloading && !_loadTimer.running && _docLoader.LoaderList!=null && _docLoader.LoaderList.length>0 && !_docLoader.LoaderList[uloaderidx].loading){
  886. dispatchEvent(new PageLoadingEvent(PageLoadingEvent.PAGE_LOADING,_pageList[i].dupIndex));
  887. try{
  888. _pageList[i].resetPage(_libMC.width,_libMC.height,_scale,true);
  889. _docLoader.LoaderList[uloaderidx].loaded = false;
  890. _docLoader.LoaderList[uloaderidx].loading = true;
  891. _docLoader.LoaderList[uloaderidx].load(new URLRequest(getSwfFilePerPage(_swfFile,_pageList[i].dupIndex)),StreamUtil.getExecutionContext());
  892. _docLoader.LoaderList[uloaderidx].pageStartIndex = _pageList[i].dupIndex;
  893. }catch(err:IOErrorEvent){}
  894. repaint();
  895. }
  896. if(_docLoader.LoaderList[uloaderidx].pageStartIndex == _pageList[i].dupIndex && _pageList[i].loadedIndex != _pageList[i].dupIndex && _docLoader.LoaderList[uloaderidx].content!=null){
  897. _thumbData = new BitmapData(_docLoader.LoaderList[uloaderidx].width*_scale, _docLoader.LoaderList[uloaderidx].height*_scale, false, 0xFFFFFF);
  898. _thumb = new Bitmap(_thumbData);
  899. _pageList[i].source = _thumb;
  900. _pageList[i].loadedIndex = _pageList[i].dupIndex;
  901. _thumbData.draw(_docLoader.LoaderList[uloaderidx],new Matrix(_scale, 0, 0, _scale),null,null,null,true);
  902. }
  903. }
  904. if(_pluginList!=null){
  905. for(pl=0;pl<_pluginList.length;pl++){
  906. _pluginList[pl].drawSelf(i,_thumbData,_scale);
  907. }
  908. }
  909. }
  910. }
  911. if(UsingExtViewMode){
  912. CurrExtViewMode.renderPage(i);
  913. if(_selectionMarker!=null)
  914. CurrExtViewMode.renderSelection(i,_selectionMarker);
  915. }
  916. if((_viewMode == ViewModeEnum.PORTRAIT) && _selectionMarker != null){
  917. if(i+1 == searchPageIndex && _selectionMarker.parent != _pageList[i]){
  918. _pageList[i].addChildAt(_selectionMarker,_pageList[i].numChildren);
  919. }else if(i+1 == searchPageIndex && _selectionMarker.parent == _pageList[i]){
  920. _pageList[i].setChildIndex(_selectionMarker,_pageList[i].numChildren -1);
  921. }
  922. }
  923. if(_viewMode != ViewModeEnum.TILE && !UsingExtViewMode && _markList[i] != null){
  924. if(_markList[i].parent != _pageList[i]){
  925. _pageList[i].addChildAt(_markList[i],_pageList[i].numChildren);
  926. }else{
  927. _pageList[i].setChildIndex(_markList[i],_pageList[i].numChildren -1);
  928. }
  929. }
  930. if(UsingExtViewMode && _markList[i] != null){
  931. CurrExtViewMode.renderMark(_markList[i],i);
  932. }
  933. loaderidx++;
  934. }else{
  935. if(_pageList[i].numChildren>0 || _pageList[i].source != null){
  936. _pageList[i].source = null;
  937. if(_tweencount == 0)
  938. _pageList[i].resetPage(_libMC.width,_libMC.height,_scale);
  939. else
  940. _pageList[i].removeAllChildren();
  941. _pageList[i].loadedIndex = -1;
  942. }
  943. }
  944. // plugins should be rendered even if not visible to allow printing to work
  945. if(_viewMode != ViewModeEnum.TILE){
  946. if(_pluginList!=null){
  947. for(pl=0;pl<_pluginList.length;pl++){
  948. _pluginList[pl].drawSelf(i,_pageList[i],_scale);
  949. }
  950. }
  951. }
  952. }
  953. }
  954. }
  955. private function padString(_str:String, _n:Number, _pStr:String):String
  956. {
  957. var _rtn:String = _str;
  958. if ((_pStr == null) || (_pStr.length < 1))
  959. {
  960. _pStr = " ";
  961. }
  962. if (_str.length < _n)
  963. {
  964. var _s:String = "";
  965. for (var i:Number = 0 ; i < (_n - _str.length) ; i++)
  966. {
  967. _s += _pStr;
  968. }
  969. _rtn = _s + _str;
  970. }
  971. return _rtn;
  972. }
  973. private function finduloaderIdx(idx:int):int{
  974. for(var i:int=0;i<_docLoader.LoaderList.length;i++){
  975. if(_docLoader.LoaderList[i].pageStartIndex == idx)
  976. return i;
  977. }
  978. for(var i:int=0;i<_docLoader.LoaderList.length;i++){
  979. if(!checkIsVisible(_docLoader.LoaderList[i].pageStartIndex))
  980. return i;
  981. }
  982. return -1;
  983. }
  984. public function repaint():void{
  985. _repaintTimer.reset();_repaintTimer.start();
  986. }
  987. private function getVisibleMidPage():Number{
  988. var lowPageNum:int = -1;
  989. var highPageNum:int = -1;
  990. for(var i:int=0;i<_pageList.length;i++){
  991. if(lowPageNum==-1 && checkIsVisible(i)){
  992. lowPageNum = i;
  993. }
  994. if(lowPageNum!=-1 && checkIsVisible(i)){
  995. highPageNum = i;
  996. }
  997. }
  998. if(highPageNum - lowPageNum == 1 && _pageList.length<3){
  999. return lowPageNum;
  1000. }else{
  1001. var retval:Number = Math.round(lowPageNum + (highPageNum - lowPageNum) / 2);
  1002. if(retval<0){retval=0;}
  1003. if(retval>_pageList.length-1){retval=_pageList.length-1;}
  1004. return retval;
  1005. }
  1006. }
  1007. private function checkIsVisible(pageIndex:int):Boolean{
  1008. try{
  1009. if(ViewMode == ViewModeEnum.TILE){
  1010. return _pageList[pageIndex].parent.y + _pageList[pageIndex].height >= _paperContainer.verticalScrollPosition &&
  1011. (_pageList[pageIndex].parent.y - _pageList[pageIndex].height) < (_paperContainer.verticalScrollPosition + _paperContainer.height);
  1012. }
  1013. else if(!UsingExtViewMode){
  1014. if(_paperContainer.height <= 0)
  1015. return false;
  1016. return (_pageList[pageIndex].y + (_pageList[pageIndex].getScaledHeight() + 6)) >= _paperContainer.verticalScrollPosition &&
  1017. (_pageList[pageIndex].y - (_pageList[pageIndex].getScaledHeight() + 6)) < (_paperContainer.verticalScrollPosition + _paperContainer.height);
  1018. }
  1019. if(UsingExtViewMode)
  1020. return CurrExtViewMode.checkIsVisible(pageIndex);
  1021. }catch(e:Error){
  1022. return false;
  1023. }
  1024. return false;
  1025. }
  1026. public function createDisplayContainer():void{
  1027. if(_skinImgDo != null && _skinImgDo.parent == this){
  1028. removeChild(_skinImgDo);
  1029. _skinImgDo.removeEventListener(MouseEvent.MOUSE_OVER,skinMouseOver);
  1030. _skinImgDo.removeEventListener(MouseEvent.MOUSE_OUT,skinMouseOut);
  1031. _skinImgDo.removeEventListener(MouseEvent.MOUSE_DOWN,skinMouseDown);
  1032. }
  1033. _skinImgDo = new Image();
  1034. _skinImgDo.source = _skinImg;
  1035. _skinImgDo.x = this.width-_skinImg.width - 27; _skinImgDo.y = this.height-_skinImg.height - 10;
  1036. _skinImgDo.addEventListener(MouseEvent.MOUSE_OVER,skinMouseOver,false,0,true);
  1037. _skinImgDo.addEventListener(MouseEvent.MOUSE_OUT,skinMouseOut,false,0,true);
  1038. _skinImgDo.addEventListener(MouseEvent.MOUSE_DOWN,skinMouseDown,false,0,true);
  1039. _skinImgDo.buttonMode = true;
  1040. addChild(_skinImgDo);
  1041. // Add the swf to the invisible container.
  1042. _swfContainer.removeAllChildren();
  1043. var uic:UIComponent = new UIComponent();
  1044. _swfContainer.addChild(uic);
  1045. if(_docLoader!=null && _docLoader.DocumentContainer != null)
  1046. uic.addChild(_docLoader.DocumentContainer);
  1047. if(_paperContainer !=null && _paperContainer.parent == this){
  1048. removeChild(_paperContainer);
  1049. _paperContainer.removeEventListener(FlexEvent.UPDATE_COMPLETE,updComplete);
  1050. _paperContainer.removeEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);
  1051. }
  1052. _paperContainer = new ZoomCanvas();
  1053. _paperContainer.percentHeight = 100;
  1054. _paperContainer.percentWidth = 100;
  1055. _paperContainer.addEventListener(FlexEvent.UPDATE_COMPLETE,updComplete,false,0,true);
  1056. _paperContainer.x = (ViewMode==ViewModeEnum.PORTRAIT||ViewMode==ViewModeEnum.TILE)?2.5:0;
  1057. _paperContainer.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler,false,0,true);
  1058. _paperContainer.setStyle("horizontalGap",1);
  1059. _paperContainer.setStyle("verticalGap",0);
  1060. addChildAt(_paperContainer,getChildIndex(_skinImgDo)-1);
  1061. try{
  1062. new flash.net.LocalConnection().connect('devaldiGCdummy');
  1063. new flash.net.LocalConnection().connect('devaldiGCdummy');
  1064. } catch (e:*) {}
  1065. try{flash.system.System.gc();} catch (e:*) {}
  1066. if(_paperContainer.numChildren>0){_paperContainer.removeAllChildren();}
  1067. deleteDisplayContainer();
  1068. if(_viewMode == ViewModeEnum.TILE){
  1069. _displayContainer = new FlowBox();
  1070. _displayContainer.setStyle("horizontalAlign", "left");
  1071. _paperContainer.horizontalScrollPolicy = "off";
  1072. _scale = 0.243;
  1073. _paperContainer.addChild(_displayContainer);
  1074. _paperContainer.childrenDoDrag = true;
  1075. _initialized=true;
  1076. }
  1077. else if(UsingExtViewMode){
  1078. _initialized = CurrExtViewMode.initComponent(this);
  1079. }
  1080. else{
  1081. _displayContainer = new FlowVBox();
  1082. _displayContainer.setStyle("horizontalAlign", "center");
  1083. _paperContainer.addChild(_displayContainer);
  1084. _paperContainer.childrenDoDrag = true;
  1085. _initialized=true;
  1086. }
  1087. _displayContainer.verticalScrollPolicy = "off";
  1088. _displayContainer.horizontalScrollPolicy = "off";
  1089. _displayContainer.setStyle("verticalAlign", "center");
  1090. _displayContainer.percentHeight = 100;
  1091. _displayContainer.percentWidth = (ViewMode==ViewModeEnum.PORTRAIT)?96:100;
  1092. _displayContainer.useHandCursor = true;
  1093. _displayContainer.addEventListener(MouseEvent.ROLL_OVER,displayContainerrolloverHandler,false,0,true);
  1094. _displayContainer.addEventListener(MouseEvent.ROLL_OUT,displayContainerrolloutHandler,false,0,true);
  1095. _displayContainer.addEventListener(MouseEvent.MOUSE_DOWN,displayContainerMouseDownHandler,false,0,true);
  1096. _displayContainer.addEventListener(MouseEvent.MOUSE_UP,displayContainerMouseUpHandler,false,0,true);
  1097. _displayContainer.addEventListener(MouseEvent.DOUBLE_CLICK,displayContainerDoubleClickHandler,false,0,true);
  1098. //_displayContainer.mouseChildren = false;
  1099. _displayContainer.doubleClickEnabled = true;
  1100. }
  1101. private function displayContainerrolloverHandler(event:MouseEvent):void{
  1102. if(_viewMode==ViewModeEnum.PORTRAIT||(UsingExtViewMode && CurrExtViewMode.supportsTextSelect)){
  1103. if(TextSelectEnabled && CursorsEnabled){
  1104. _grabCursorID = CursorManager.setCursor(MenuIcons.TEXT_SELECT_CURSOR);
  1105. }else if(CursorsEnabled){
  1106. resetCursor();
  1107. }
  1108. }
  1109. }
  1110. private function displayContainerMouseUpHandler(event:MouseEvent):void{
  1111. if(_viewMode==ViewModeEnum.PORTRAIT||(UsingExtViewMode && CurrExtViewMode.supportsTextSelect)){
  1112. if(CursorsEnabled)
  1113. CursorManager.removeCursor(_grabbingCursorID);
  1114. if(TextSelectEnabled && CursorsEnabled){
  1115. _grabCursorID = CursorManager.setCursor(MenuIcons.TEXT_SELECT_CURSOR);
  1116. }else if(CursorsEnabled && !(event.target is IFlexPaperPluginControl) || (event.target.parent !=null && event.target.parent.parent !=null && event.target.parent.parent is IFlexPaperPluginControl)){
  1117. resetCursor();
  1118. }
  1119. }
  1120. }
  1121. private function displayContainerDoubleClickHandler(event:MouseEvent):void{
  1122. if(TextSelectEnabled){return;}
  1123. if(ViewMode == ViewModeEnum.PORTRAIT)
  1124. FitMode = (FitMode == FitModeEnum.FITWIDTH)?FitModeEnum.FITHEIGHT:FitModeEnum.FITWIDTH;
  1125. if(UsingExtViewMode)
  1126. CurrExtViewMode.handleDoubleClick(event);
  1127. }
  1128. private function displayContainerMouseDownHandler(event:MouseEvent):void{
  1129. if(_viewMode==ViewModeEnum.PORTRAIT||(UsingExtViewMode && CurrExtViewMode.supportsTextSelect)){
  1130. if(CursorsEnabled)
  1131. CursorManager.removeCursor(_grabCursorID);
  1132. if(TextSelectEnabled && CursorsEnabled){
  1133. _grabbingCursorID = CursorManager.setCursor(MenuIcons.TEXT_SELECT_CURSOR);
  1134. }else if(CursorsEnabled){
  1135. _grabbingCursorID = CursorManager.setCursor(MenuIcons.GRABBING);
  1136. }
  1137. }
  1138. if(UsingExtViewMode)
  1139. CurrExtViewMode.handleMouseDown(event);
  1140. }
  1141. private function displayContainerrolloutHandler(event:Event):void{
  1142. if(CursorsEnabled)
  1143. CursorManager.removeAllCursors();
  1144. }
  1145. private function wheelHandler(evt:MouseEvent):void {
  1146. _paperContainer.removeEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);
  1147. var t:Timer = new Timer(1,1);
  1148. t.addEventListener("timer", addMouseScrollListener,false,0,true);
  1149. t.start();
  1150. _paperContainer.dispatchEvent(evt.clone());
  1151. }
  1152. private function addMouseScrollListener(e:Event):void {
  1153. _paperContainer.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler,false,0,true);
  1154. }
  1155. private function keyboardHandler(event:KeyboardEvent):void{
  1156. if(event.keyCode == Keyboard.DOWN){
  1157. _paperContainer.verticalScrollPosition = _paperContainer.verticalScrollPosition + 10;
  1158. }
  1159. if(event.keyCode == Keyboard.UP){
  1160. _paperContainer.verticalScrollPosition = _paperContainer.verticalScrollPosition - 10;
  1161. }
  1162. if(event.keyCode == Keyboard.PAGE_DOWN){
  1163. _paperContainer.verticalScrollPosition = _paperContainer.verticalScrollPosition + 300;
  1164. }
  1165. if(event.keyCode == Keyboard.PAGE_UP){
  1166. _paperContainer.verticalScrollPosition = _paperContainer.verticalScrollPosition - 300;
  1167. }
  1168. if(event.keyCode == Keyboard.HOME){
  1169. _paperContainer.verticalScrollPosition = 0;
  1170. }
  1171. if(event.keyCode == Keyboard.END){
  1172. _paperContainer.verticalScrollPosition = _paperContainer.maxVerticalScrollPosition;
  1173. }
  1174. }
  1175. private function sizeChanged(evt:Event):void{
  1176. _skinImgDo.source = _skinImg;
  1177. _skinImgDo.x = this.width-_skinImg.width - 27; _skinImgDo.y = this.height-_skinImg.height - 10;
  1178. }
  1179. private function skinMouseOver(evt:MouseEvent):void{
  1180. _skinImgDo.addChild(_skinImgc);
  1181. }
  1182. private function skinMouseOut(evt:MouseEvent):void{
  1183. if(_skinImgc.parent==_skinImgDo){_skinImgDo.removeChild(_skinImgc);}
  1184. }
  1185. private function skinMouseDown(evt:MouseEvent):void{
  1186. dispatchEvent(new Event("onLogoClicked"));
  1187. }
  1188. override protected function commitProperties():void {
  1189. super.commitProperties();
  1190. if(_swfFileChanged && _swfFile != null && _swfFile.length > 0){ // handler for when the Swf file has changed.
  1191. dispatchEvent(new Event("onDocumentLoading"));
  1192. _swfFileChanged = false;
  1193. }
  1194. }
  1195. private function resizeMc(mc:MovieClip, maxW:Number, maxH:Number=0, constrainProportions:Boolean=true):void{
  1196. maxH = maxH == 0 ? maxW : maxH;
  1197. mc.width = maxW;
  1198. mc.height = maxH;
  1199. if (constrainProportions) {
  1200. mc.scaleX < mc.scaleY ? mc.scaleY = mc.scaleX : mc.scaleX = mc.scaleY;
  1201. }
  1202. }
  1203. private function onLoadProgress(event:ProgressEvent):void{
  1204. var e:ProgressEvent = new ProgressEvent("onLoadingProgress")
  1205. e.bytesTotal = event.bytesTotal;
  1206. e.bytesLoaded = event.bytesLoaded;
  1207. dispatchEvent(e);
  1208. }
  1209. private function onDocumentLoadedErrorHandler(event:Event):void{
  1210. dispatchEvent(event);
  1211. }
  1212. private function swfComplete(event:SwfLoadedEvent):void{
  1213. if(!ProgressiveLoading){
  1214. try{
  1215. if(event.swfObject.content != null && (event.swfObject.content is MovieClip || event.swfObject.content is Bitmap))
  1216. _libMC = new SwfDocument(event.swfObject.content as DisplayObject);
  1217. DupImage.paperSource = _libMC.getDocument();
  1218. }catch(e:Error){
  1219. if(!_docLoader.Resigned){_docLoader.signFileHeader(_docLoader.InputBytes);return;}
  1220. }
  1221. if((_libMC == null || (event.swfObject!=null && event.swfObject.content != null && event.swfObject.content is AVM1Movie)) && !_docLoader.Resigned){_docLoader.signFileHeader(_docLoader.InputBytes);return;}
  1222. _inputBytes = _docLoader.InputBytes;
  1223. if(_libMC.height>0&&_docLoader.LoaderList==null){createLoaderList();}
  1224. if(!_docLoader.IsSplit)
  1225. numPages = _libMC.totalFrames;
  1226. _swfLoaded = true
  1227. _libMC.getDocument().cacheAsBitmap = true;
  1228. _libMC.getDocument().opaqueBackground = 0xFFFFFF;
  1229. reCreateAllPages();
  1230. _bbusyloading = false;
  1231. repositionPapers();
  1232. //dispatchEvent(new DocumentLoadedEvent(DocumentLoadedEvent.DOCUMENT_LOADED,numPages));
  1233. }else{
  1234. if(event.swfObject.content != null){
  1235. var mobj:Object = event.swfObject.content;
  1236. var firstLoad:Boolean = false;
  1237. if(mobj is AVM1Movie || _loaderptr != null){
  1238. _inputBytes = _docLoader.InputBytes;
  1239. if(_loaderptr==null){
  1240. _docLoader.postProcessBytes(_inputBytes);
  1241. _loaderptr = new Loader();
  1242. _loaderptr.contentLoaderInfo.addEventListener(Event.COMPLETE, swfComplete,false,0,true);
  1243. }
  1244. _docLoader.signFileHeader(_inputBytes,_loaderptr);
  1245. _loaderptr.unloadAndStop(true);
  1246. _loaderptr.loadBytes(_inputBytes,StreamUtil.getExecutionContext());
  1247. }
  1248. if(mobj is MovieClip){
  1249. _libMC = new SwfDocument(mobj as MovieClip);
  1250. _libMC.getDocument().cacheAsBitmap = true;
  1251. _libMC.getDocument().opaqueBackground = 0xFFFFFF;
  1252. if(_libMC.height>0&&_docLoader.LoaderList==null){createLoaderList();}
  1253. DupImage.paperSource = _libMC.getDocument();
  1254. if(!_docLoader.IsSplit)
  1255. numPages = _libMC.totalFrames;
  1256. firstLoad = _pageList == null || (_pageList.length == 0 && numPages > 0);
  1257. if(_loaderptr==null){_inputBytes = _docLoader.InputBytes;}else{_inputBytes = _loaderptr.contentLoaderInfo.bytes;}
  1258. if(_libMC.framesLoaded > 0)
  1259. addInLoadedPages();
  1260. flash.utils.setTimeout(function():void{
  1261. try{
  1262. var bDocLoaded:Boolean=(_libMC.framesLoaded == _libMC.totalFrames && _frameLoadCount != _libMC.framesLoaded);
  1263. if(_libMC.framesLoaded>_frameLoadCount){
  1264. repositionPapers();
  1265. if(_docLoader.LoaderList.length>0 && _viewMode == ViewModeEnum.PORTRAIT){_bbusyloading = true; _docLoader.LoaderList[_docLoader.LoaderList.length-1].unloadAndStop(true); _docLoader.LoaderList[_docLoader.LoaderList.length-1].loadBytes(_libMC.loaderInfo.bytes,StreamUtil.getExecutionContext());}
  1266. _frameLoadCount = _libMC.framesLoaded;
  1267. }
  1268. if(bDocLoaded)
  1269. dispatchEvent(new DocumentLoadedEvent(DocumentLoadedEvent.DOCUMENT_LOADED,numPages));
  1270. } catch (e:*) {}
  1271. },500);
  1272. _bbusyloading = false;
  1273. _swfLoaded = true
  1274. }
  1275. }
  1276. }
  1277. }
  1278. private function deleteDisplayContainer():void{
  1279. if(_displayContainer!=null){
  1280. _displayContainer.removeAllChildren();
  1281. _displayContainer.removeEventListener(MouseEvent.ROLL_OVER,displayContainerrolloverHandler);
  1282. _displayContainer.removeEventListener(MouseEvent.ROLL_OUT,displayContainerrolloutHandler);
  1283. _displayContainer.removeEventListener(MouseEvent.MOUSE_DOWN,displayContainerMouseDownHandler);
  1284. _displayContainer.removeEventListener(MouseEvent.MOUSE_UP,displayContainerMouseUpHandler);
  1285. _displayContainer.removeEventListener(MouseEvent.DOUBLE_CLICK,displayContainerDoubleClickHandler);
  1286. }
  1287. }
  1288. private function deleteLoaderList():void{
  1289. if(_docLoader==null){return;}
  1290. if(_docLoader.LoaderList!=null){
  1291. for(var i:int=0;i<_docLoader.LoaderList.length;i++){
  1292. if(_docLoader.LoaderList[i].parent!=null){
  1293. _docLoader.LoaderList[i].parent.removeChild(_docLoader.LoaderList[i]);
  1294. }
  1295. if(_docLoader.LoaderList[i].contentLoaderInfo!=null){
  1296. _docLoader.LoaderList[i].contentLoaderInfo.removeEventListener(Event.COMPLETE, bytesLoaded);
  1297. _docLoader.LoaderList[i].contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,docLoaderIOErrorListener);
  1298. }
  1299. _docLoader.LoaderList[i].removeEventListener(Event.ENTER_FRAME,onframeenter);
  1300. _docLoader.LoaderList[i].unloadAndStop(true);
  1301. delete(_docLoader.LoaderList[i]);
  1302. _docLoader.LoaderList[i]=null;
  1303. }
  1304. }
  1305. _docLoader.LoaderList = null;
  1306. }
  1307. public function deleteSelectionMarker():void{
  1308. if(_selectionMarker!=null&&_selectionMarker.parent!=null){
  1309. _selectionMarker.parent.removeChild(_selectionMarker);
  1310. _selectionMarker = null;
  1311. }
  1312. }
  1313. private function deleteLibMC():void{
  1314. if(_libMC!=null){
  1315. if(_libMC.parent!=null && _libMC.parent is Loader){
  1316. (_libMC.parent as Loader).unloadAndStop(true);
  1317. }
  1318. _libMC = null;
  1319. }
  1320. }
  1321. private function deleteLoaderPtr():void{
  1322. if(_loaderptr!=null){
  1323. if(_loaderptr.parent!=null){
  1324. _loaderptr.removeChild(_loaderptr);
  1325. }
  1326. if(_loaderptr.contentLoaderInfo !=null){
  1327. _loaderptr.contentLoaderInfo.removeEventListener(Event.COMPLETE, swfComplete);
  1328. }
  1329. _loaderptr.unloadAndStop(true);
  1330. _loaderptr = null;
  1331. }
  1332. }
  1333. private function clearPlugins():void{
  1334. if(_pluginList==null){return;}
  1335. for(var pl:int=0;pl<_pluginList.length;pl++){
  1336. _pluginList[pl].clear();
  1337. }
  1338. }
  1339. private function deletePageList():void{
  1340. if(_pageList!=null){
  1341. for(var pl:int=0;pl<_pageList.length;pl++){
  1342. _pageList[pl].removeEventListener(MouseEvent.MOUSE_OVER,dupImageMoverHandler);
  1343. _pageList[pl].removeEventListener(MouseEvent.MOUSE_OUT,dupImageMoutHandler);
  1344. _pageList[pl].removeEventListener(MouseEvent.CLICK,dupImageClickHandler);
  1345. _pageList[pl].removeEventListener(MouseEvent.MOUSE_DOWN,textSelectorMouseDownHandler);
  1346. if(_pageList[pl].parent!=null){
  1347. _pageList[pl].removeAllChildren();
  1348. _pageList[pl].source = null;
  1349. _pageList[pl].parent.removeChild(_pageList[pl]);
  1350. }
  1351. delete(_pageList[pl]);
  1352. _pageList[pl]=null;}
  1353. }
  1354. DupImage.paperSource = null;
  1355. _pageList = null;
  1356. }
  1357. private function deleteFLoader():void{
  1358. if(_docLoader!=null){
  1359. _docLoader.stream.removeEventListener(ProgressEvent.PROGRESS, onLoadProgress);
  1360. _docLoader.resetURLStream();
  1361. }
  1362. /*if(_loader!=null){
  1363. _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, swfComplete);
  1364. _loader.unloadAndStop(true);
  1365. _loader = null;
  1366. }*/
  1367. //_docLoader = null;
  1368. /*_loader = new Loader();
  1369. if(!_loader.contentLoaderInfo.hasEventListener(Event.COMPLETE))
  1370. _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfComplete,false,0,true);*/
  1371. }
  1372. public function addInLoadedPages(recreate:Boolean = false):void{
  1373. if(_libMC==null){return;}
  1374. if(recreate){
  1375. _displayContainer.removeAllChildren(); deletePageList();
  1376. }
  1377. if(_pageList==null || (_pageList != null && _pageList.length != numPages)){
  1378. _pageList = new Array(numPages);
  1379. if(_markList==null){_markList = new Array(numPages);}
  1380. _displayContainer.visible = false;
  1381. _libMC.stop();
  1382. var w:Number=0; var h:Number=0;
  1383. _libMC.gotoAndStop(1);
  1384. w = _libMC.width; h=_libMC.height;
  1385. for(var i:int=0;i<numPages;i++){
  1386. _libMC.gotoAndStop(i+1);
  1387. createPaper(i+1,(_libMC.width>0)?_libMC.width:w,(_libMC.height>0)?_libMC.height:h);
  1388. }
  1389. addPages();
  1390. if(_pluginList!=null){
  1391. for(var p:int=0;p<_pluginList.length;p++){
  1392. _pluginList[p].init();
  1393. }
  1394. }
  1395. //if(_fitWidthOnLoad){_scale = getFitWidthFactor();}
  1396. //if(_fitPageOnLoad){_scale = getFitHeightFactor();}
  1397. if(_docLoader.LoaderList.length>0 && UsingExtViewMode){CurrExtViewMode.initOnLoading();}
  1398. }
  1399. flash.utils.setTimeout(repositionPapers,500);
  1400. }
  1401. public function reCreateAllPages():void{
  1402. if(!_swfLoaded || _libMC == null){return;}
  1403. _displayContainer.visible = false;
  1404. _displayContainer.removeAllChildren();
  1405. deletePageList();
  1406. _pageList = new Array(numPages);
  1407. if(_markList==null){_markList = new Array(numPages);}
  1408. if(_pluginList!=null){
  1409. for(var p:int=0;p<_pluginList.length;p++){
  1410. _pluginList[p].init();
  1411. }
  1412. }
  1413. _libMC.stop();
  1414. var w:Number=0; var h:Number=0;
  1415. _libMC.gotoAndStop(1);
  1416. w = _libMC.width; h=_libMC.height;
  1417. for(var i:int=0;i<numPages;i++){
  1418. _libMC.gotoAndStop(i+1);
  1419. createPaper(i+1,(_libMC.width>0)?_libMC.width:w,(_libMC.height>0)?_libMC.height:h);
  1420. }
  1421. addPages();
  1422. // kick off the first page to load
  1423. if(!_docLoader.IsSplit){
  1424. if(_docLoader.LoaderList.length>0){_bbusyloading = true; _docLoader.LoaderList[0].unloadAndStop(true); _docLoader.LoaderList[0].loadBytes(_libMC.loaderInfo.bytes,StreamUtil.getExecutionContext());}
  1425. }else{
  1426. if(_docLoader.LoaderList.length>0 && (_viewMode == ViewModeEnum.PORTRAIT) && _libMC.loaderInfo!=null && _libMC.loaderInfo.bytes != null)
  1427. {
  1428. _bbusyloading = true;
  1429. _docLoader.LoaderList[0].pageStartIndex = 1;
  1430. _docLoader.LoaderList[0].loadBytes(_libMC.loaderInfo.bytes,StreamUtil.getExecutionContext());
  1431. }
  1432. }
  1433. if(_docLoader.LoaderList.length>0 && UsingExtViewMode){CurrExtViewMode.initOnLoading();}
  1434. }
  1435. private function createLoaderList():void
  1436. {
  1437. DupLoader.parentLoader = _docLoader;
  1438. _docLoader.LoaderList = new Array(Math.round(getCalculatedHeight(_paperContainer)/(_libMC.height*_minZoomSize))+(_docLoader.IsSplit)?5:1);
  1439. if(UsingExtViewMode && CurrExtViewMode.loaderListLength > _docLoader.LoaderList.length)
  1440. _docLoader.LoaderList = new Array(CurrExtViewMode.loaderListLength);
  1441. {
  1442. for(var li:int=0;li<_docLoader.LoaderList.length;li++){
  1443. _docLoader.LoaderList[li] = new DupLoader();
  1444. _docLoader.LoaderList[li].contentLoaderInfo.addEventListener(Event.COMPLETE, bytesLoaded,false,0,true);
  1445. _docLoader.LoaderList[li].contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,docLoaderIOErrorListener);
  1446. _docLoader.LoaderList[li].addEventListener(Event.ENTER_FRAME,onframeenter,false,0,true);
  1447. if(DupLoader.parentLoader.ShouldPreStream){
  1448. _docLoader.LoaderList[li].resetURLStream();
  1449. }
  1450. }
  1451. }
  1452. }
  1453. private function docLoaderIOErrorListener(e:IOErrorEvent):void{
  1454. if(_docLoader!=null&&_docLoader.IsSplit){
  1455. dispatchEvent(new ErrorLoadingPageEvent(ErrorLoadingPageEvent.ERROR_LOADING_PAGE,-1/*e.target.pageStartIndex*/));
  1456. }
  1457. }
  1458. private function getCalculatedHeight(obj:DisplayObject):Number{
  1459. var pHeight:Number = 0;
  1460. var oPercHeight:Number = 0;
  1461. pHeight = obj.height;
  1462. if(pHeight>0){return pHeight;}
  1463. if((obj as Container).percentHeight>0){oPercHeight=(obj as Container).percentHeight;}
  1464. while(obj.parent != null){
  1465. if(obj.parent.height>0){pHeight = obj.parent.height * (oPercHeight/100);break;}
  1466. obj = obj.parent;
  1467. }
  1468. return pHeight;
  1469. }
  1470. public var snap:TextSnapshot;
  1471. private var searchIndex:int = -1;
  1472. private var searchPageIndex:int = -1;
  1473. private var _selectionMarker:ShapeMarker;
  1474. private var prevSearchText:String = "";
  1475. private var prevYsave:Number=-1;
  1476. private var _markList:Array;
  1477. private var prevSearchIndexList:Array;
  1478. public function get SearchPageIndex():int {
  1479. return searchPageIndex;
  1480. }
  1481. public function set SearchPageIndex(s:int):void {
  1482. searchPageIndex = s;
  1483. }
  1484. private var _searchExtracts:Array;
  1485. public function searchTextByService(text:String):void{
  1486. if(prevSearchText != text){
  1487. _searchExtracts = new Array(numPages);
  1488. searchPageIndex = -1;
  1489. prevSearchText = text;
  1490. searchIndex = -1;
  1491. prevSearchIndexList = new Array();
  1492. }
  1493. if(_selectionMarker!=null && _selectionMarker.parent != null){_selectionMarker.parent.removeChild(_selectionMarker);}
  1494. if(searchPageIndex == -1){
  1495. searchPageIndex = currPage;
  1496. }
  1497. if(_searchExtracts[searchPageIndex-1] == null && searchPageIndex!=currPage){
  1498. var serve:HTTPService = new HTTPService();
  1499. var url = SearchServiceUrl;
  1500. url = TextMapUtil.StringReplaceAll(url,"[page]",searchPageIndex.toString())
  1501. url = TextMapUtil.StringReplaceAll(url,"[searchterm]",text)
  1502. url = encodeURI(url);
  1503. serve.method = "GET";
  1504. serve.url = url;
  1505. serve.resultFormat = "text";
  1506. serve.addEventListener("result",searchByServiceResult);
  1507. serve.addEventListener(FaultEvent.FAULT,searchByServiceFault);
  1508. serve.send();
  1509. }else{ // perform actual search
  1510. if((_searchExtracts[searchPageIndex-1]!=null && _searchExtracts[searchPageIndex-1].length>0 && Number(_searchExtracts[searchPageIndex-1]) >= 0) || searchPageIndex==currPage){
  1511. if(searchPageIndex!=currPage){
  1512. _performSearchOnPageLoad=true;
  1513. _pendingSearchPage = searchPageIndex;
  1514. gotoPage(searchPageIndex);
  1515. }
  1516. else{
  1517. snap = _pageList[searchPageIndex-1].textSnapshot;
  1518. searchIndex = snap.findText((searchIndex==-1?0:searchIndex),adjustSearchTerm(text),false);
  1519. var tri:Array;
  1520. if(searchIndex > 0){ // found a new match
  1521. _selectionMarker = new ShapeMarker();
  1522. _selectionMarker.graphics.beginFill(0x0095f7,0.3);
  1523. tri = snap.getTextRunInfo(searchIndex,searchIndex+text.length-1);
  1524. if(tri.length>0){
  1525. prevYsave = tri[0].matrix_ty;
  1526. drawCurrentSelection(0x0095f7,_selectionMarker,tri);
  1527. }
  1528. if(prevYsave>0){
  1529. _selectionMarker.graphics.endFill();
  1530. _adjGotoPage = (ViewMode==ViewModeEnum.PORTRAIT)?(prevYsave) * _scale - 50:0;
  1531. gotoPage(searchPageIndex);
  1532. }
  1533. searchIndex = searchIndex + text.length;
  1534. }else{