Merge pull request #64 from 1ec5/patch-2
[potlatch2.git] / net / systemeD / potlatch2 / PreloaderDisplayBase.as
1 package net.systemeD.potlatch2
2 {
3     // As seen at: http://www.pathf.com/blogs/2008/08/custom-flex-3-lightweight-preloader-with-source-code/
4     // Can be "resued without restriction", so say the original authors
5
6     import flash.display.Sprite;
7     import flash.events.Event;
8     import flash.events.ProgressEvent;
9     import flash.events.TimerEvent;
10     import flash.utils.Timer;
11
12     import mx.events.FlexEvent;
13     import mx.preloaders.IPreloaderDisplay;
14
15     public class PreloaderDisplayBase extends Sprite implements IPreloaderDisplay
16     {
17         // Implementation variables, used to make everything work properly
18         protected var _IsInitComplete:Boolean = false;
19         protected var _timer:Timer;                 // we have a timer for animation
20         protected var _bytesLoaded:uint = 0;
21         protected var _bytesExpected:uint = 1;      // we start at 1 to avoid division by zero errors.
22         protected var _fractionLoaded:Number = 0;   // 0-1
23
24         public function PreloaderDisplayBase()
25         {
26             super();
27         }
28
29         // This function is called whenever the state of the preloader changes.  Use the _fractionLoaded variable to draw your progress bar.
30         virtual protected function draw():void
31         {
32         }
33
34         ////
35         //// IPreloaderDisplay interface elements
36         ////   check out the docs on IPreloaderDisplay to see more details.
37
38         // This function is called when the PreloaderDisplayBase has been created and is ready for action.
39         virtual public function initialize():void
40         {
41             _timer = new Timer(20);
42             _timer.addEventListener(TimerEvent.TIMER, timerHandler);
43             _timer.start();
44         }
45
46
47         protected var _preloader:Sprite;
48         /**
49          *  The Preloader class passes in a reference to itself to the display class
50          *  so that it can listen for events from the preloader.
51          */
52          // This code comes from DownloadProgressBar.  I have modified it to remove some unused event handlers.
53         virtual public function set preloader(value:Sprite):void
54         {
55             _preloader = value;
56
57             value.addEventListener(ProgressEvent.PROGRESS, progressHandler);
58             value.addEventListener(Event.COMPLETE, completeHandler);
59
60         //    value.addEventListener(RSLEvent.RSL_PROGRESS, rslProgressHandler);
61         //    value.addEventListener(RSLEvent.RSL_COMPLETE, rslCompleteHandler);
62         //    value.addEventListener(RSLEvent.RSL_ERROR, rslErrorHandler);
63
64             value.addEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler);
65             value.addEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler);
66         }
67
68         virtual public function set backgroundAlpha(alpha:Number):void{}
69         virtual public function get backgroundAlpha():Number { return 1; }
70
71         protected var _backgroundColor:uint = 0xffffffff;
72         virtual public function set backgroundColor(color:uint):void { _backgroundColor = color; }
73         virtual public function get backgroundColor():uint { return _backgroundColor; }
74
75         virtual public function set backgroundImage(image:Object):void {}
76         virtual public function get backgroundImage():Object { return null; }
77
78         virtual public function set backgroundSize(size:String):void {}
79         virtual public function get backgroundSize():String { return "auto"; }
80
81         protected var _stageHeight:Number = 300;
82         virtual public function set stageHeight(height:Number):void { _stageHeight = height; }
83         virtual public function get stageHeight():Number { return _stageHeight; }
84
85         protected var _stageWidth:Number = 400;
86         virtual public function set stageWidth(width:Number):void { _stageWidth = width; }
87         virtual public function get stageWidth():Number { return _stageWidth; }
88
89         //--------------------------------------------------------------------------
90         //
91         //  Event handlers
92         //
93         //--------------------------------------------------------------------------
94
95         // Called from time to time as the download progresses.
96         virtual protected function progressHandler(event:ProgressEvent):void
97         {
98             _bytesLoaded = event.bytesLoaded;
99             _bytesExpected = event.bytesTotal;
100
101             // Some browsers got nuts when the swf is served with gzip encoding and report bytesTotal as zero
102             if(_bytesExpected == 0) {
103                 _bytesExpected = _bytesLoaded; // This is how Firefox behaves anyway in such cases
104             }
105             _fractionLoaded = Number(_bytesLoaded) / Number(_bytesExpected);
106
107             draw();
108         }
109
110         // Called when the download is complete, but initialization might not be done yet.  (I *think*)
111         // Note that there are two phases- download, and init
112         virtual protected function completeHandler(event:Event):void
113         {
114         }
115
116
117         // Called from time to time as the initialization continues.
118         virtual protected function initProgressHandler(event:Event):void
119         {
120             draw();
121         }
122
123         // Called when both download and initialization are complete
124         virtual protected function initCompleteHandler(event:Event):void
125         {
126             _IsInitComplete = true;
127         }
128
129         // Called as often as possible
130         virtual protected function timerHandler(event:Event):void
131         {
132             if (_IsInitComplete)
133             {
134                 // We're done!
135                 _timer.stop();
136                 dispatchEvent(new Event(Event.COMPLETE));
137             }
138             else
139                 draw();
140         }
141     }
142 }