00001 import mx.controls.MediaDisplay;
00002 import gugga.events.EventDispatcher;
00003 import mx.utils.Delegate;
00004
00005 import gugga.common.IProgressiveTask;
00006 import gugga.common.MediaTypes;
00007 import gugga.common.ProgressEventInfo;
00008
00009
00010 [Event("start")]
00011 [Event("progress")]
00012 [Event("interrupted")]
00013 [Event("completed")]
00014
00018 class gugga.components.MediaLoader extends EventDispatcher implements IProgressiveTask
00019 {
00020 private var mIsRunning:Boolean;
00021 private var mInterrupted:Boolean;
00022
00023 private var mPercentsLoaded:Number;
00024
00025 private var mProgressDelegate:Function;
00026
00027 private var mMedia:MediaDisplay;
00028
00029 private var mMediaPath:String;
00030 public function get MediaPath():String { return mMediaPath; }
00031 public function set MediaPath(aValue:String):Void { mMediaPath = aValue; }
00032
00033 private var mMediaType:MediaTypes;
00034 public function get MediaType():MediaTypes { return mMediaType; }
00035 public function set MediaType(aValue:MediaTypes):Void { mMediaType = aValue; }
00036
00037 private var mUnloadMediaAfterLoad:Boolean;
00038 public function get UnloadMediaAfterLoad():Boolean { return mUnloadMediaAfterLoad; }
00039 public function set UnloadMediaAfterLoad(aValue:Boolean):Void { mUnloadMediaAfterLoad = aValue; }
00040
00041
00042 public function MediaLoader(aMedia:MediaDisplay, aMediaPath:String, aMediaType:MediaTypes)
00043 {
00044 mMedia = aMedia;
00045 mMediaPath = aMediaPath;
00046 mMediaType = aMediaType;
00047
00048 mIsRunning = false;
00049 mUnloadMediaAfterLoad = false;
00050
00051 mPercentsLoaded = 0;
00052
00053 mProgressDelegate = Delegate.create(this, onMediaProgress);
00054 }
00055
00056 public function start() : Void
00057 {
00058
00059 unloadData();
00060 mMedia.addEventListener("progress", mProgressDelegate);
00061 mIsRunning = true;
00062 mInterrupted = false;
00063 mPercentsLoaded = 0;
00064
00065 dispatchEvent({type:"start", target:this});
00066
00067 mMedia.setMedia(mMediaPath, mMediaType.toString());
00068 }
00069
00070 public function isImmediatelyInterruptable() : Boolean
00071 {
00072 return false;
00073 }
00074
00075 public function interrupt() : Void
00076 {
00077 unloadData();
00078 mInterrupted = true;
00079 }
00080
00081 public function unloadData() : Void
00082 {
00083 mMedia.stop();
00084 mMedia.setMedia("");
00085 }
00086
00087 private function onMediaProgress(ev) : Void
00088 {
00089 mPercentsLoaded = (mMedia.bytesLoaded / mMedia.bytesTotal) * 100;
00090
00091 dispatchEvent(new ProgressEventInfo(this, mMedia.bytesTotal, mMedia.bytesLoaded, mPercentsLoaded));
00092
00093 if (mMedia.bytesLoaded == mMedia.bytesTotal)
00094 {
00095 mediaLoaded();
00096 }
00097 }
00098
00099 private function mediaLoaded() : Void
00100 {
00101 mMedia.removeEventListener("progress", mProgressDelegate);
00102 mPercentsLoaded = 100;
00103
00104 if (mUnloadMediaAfterLoad)
00105 {
00106 unloadData();
00107 }
00108
00109 mIsRunning = false;
00110
00111 if(mInterrupted)
00112 {
00113 dispatchEvent({type:"interrupted", target:this});
00114 }
00115 else
00116 {
00117 dispatchEvent({type:"completed", target:this});
00118 }
00119 }
00120
00121 public function getProgress() : Number
00122 {
00123 return mPercentsLoaded;
00124 }
00125
00126 public function isRunning() : Boolean
00127 {
00128 return mIsRunning;
00129 }
00130
00131 }