PageRenderTime 57ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/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

Large files files are truncated, but you can click here to view the full 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

Large files files are truncated, but you can click here to view the full file