source: trunk/fl5/src/com/longtailvideo/jwplayer/view/View.as @ 801

Revision 801, 14.0 KB checked in by pablo, 3 years ago (diff)
Line 
1package com.longtailvideo.jwplayer.view {
2        import com.longtailvideo.jwplayer.events.GlobalEventDispatcher;
3        import com.longtailvideo.jwplayer.events.MediaEvent;
4        import com.longtailvideo.jwplayer.events.PlayerEvent;
5        import com.longtailvideo.jwplayer.events.PlayerStateEvent;
6        import com.longtailvideo.jwplayer.events.PlaylistEvent;
7        import com.longtailvideo.jwplayer.events.ViewEvent;
8        import com.longtailvideo.jwplayer.model.Model;
9        import com.longtailvideo.jwplayer.player.IPlayer;
10        import com.longtailvideo.jwplayer.player.PlayerState;
11        import com.longtailvideo.jwplayer.player.PlayerV4Emulation;
12        import com.longtailvideo.jwplayer.plugins.IPlugin;
13        import com.longtailvideo.jwplayer.plugins.PluginConfig;
14        import com.longtailvideo.jwplayer.utils.Draw;
15        import com.longtailvideo.jwplayer.utils.Logger;
16        import com.longtailvideo.jwplayer.utils.RootReference;
17        import com.longtailvideo.jwplayer.utils.Stretcher;
18        import com.longtailvideo.jwplayer.view.interfaces.IControlbarComponent;
19        import com.longtailvideo.jwplayer.view.interfaces.IDisplayComponent;
20        import com.longtailvideo.jwplayer.view.interfaces.IDockComponent;
21        import com.longtailvideo.jwplayer.view.interfaces.IPlayerComponent;
22        import com.longtailvideo.jwplayer.view.interfaces.IPlaylistComponent;
23        import com.longtailvideo.jwplayer.view.interfaces.ISkin;
24       
25        import flash.display.Bitmap;
26        import flash.display.DisplayObject;
27        import flash.display.Loader;
28        import flash.display.MovieClip;
29        import flash.display.Sprite;
30        import flash.display.Stage;
31        import flash.display.StageAlign;
32        import flash.display.StageDisplayState;
33        import flash.display.StageScaleMode;
34        import flash.events.ErrorEvent;
35        import flash.events.Event;
36        import flash.events.IOErrorEvent;
37        import flash.net.URLRequest;
38        import flash.system.LoaderContext;
39
40
41        public class View extends GlobalEventDispatcher {
42                protected var _player:IPlayer;
43                protected var _model:Model;
44                protected var _skin:ISkin;
45                protected var _components:IPlayerComponents;
46                protected var _fullscreen:Boolean = false;
47                protected var stage:Stage;
48
49                protected var _root:MovieClip;
50
51                protected var _backgroundLayer:MovieClip;
52                protected var _mediaLayer:MovieClip;
53                protected var _imageLayer:MovieClip;
54                protected var _componentsLayer:MovieClip;
55                protected var _logoLayer:MovieClip;
56                protected var _pluginsLayer:MovieClip;
57                protected var _plugins:Object;
58
59                protected var _displayMasker:MovieClip;
60
61                protected var _image:Loader;
62                protected var _logo:Logo;
63
64                protected var layoutManager:PlayerLayoutManager;
65
66                [Embed(source="../../../../../assets/flash/loader/loader.swf")]
67                protected var LoadingScreen:Class;
68
69                [Embed(source="../../../../../assets/flash/loader/error.swf")]
70                protected var ErrorScreen:Class;
71
72                protected var loaderScreen:Sprite;
73                protected var loaderAnim:DisplayObject;
74               
75                protected var currentLayer:Number = 0;
76
77
78                public function View(player:IPlayer, model:Model) {
79                        _player = player;
80                        _model = model;
81
82                        RootReference.stage.scaleMode = StageScaleMode.NO_SCALE;
83                        RootReference.stage.stage.align = StageAlign.TOP_LEFT;
84
85                        loaderScreen = new Sprite();
86                        loaderScreen.name = 'loaderScreen';
87
88                        loaderAnim = new LoadingScreen() as DisplayObject;
89                        loaderScreen.addChild(loaderAnim);
90
91                        RootReference.stage.addChildAt(loaderScreen, 0);
92
93                        if (RootReference.stage.stageWidth > 0) {
94                                resizeStage();
95                        } else {
96                                RootReference.stage.addEventListener(Event.RESIZE, resizeStage);
97                                RootReference.stage.addEventListener(Event.ADDED_TO_STAGE, resizeStage);
98                        }
99
100                        _root = new MovieClip();
101                }
102
103
104                protected function resizeStage(evt:Event=null):void {
105                        RootReference.stage.removeEventListener(Event.RESIZE, resizeStage);
106                        RootReference.stage.removeEventListener(Event.ADDED_TO_STAGE, resizeStage);
107
108                        loaderScreen.graphics.clear();
109                        loaderScreen.graphics.beginFill(0, 1);
110                        loaderScreen.graphics.drawRect(0, 0, RootReference.stage.stageWidth, RootReference.stage.stageHeight);
111                        loaderScreen.graphics.endFill();
112
113                        loaderAnim.x = (RootReference.stage.stageWidth - loaderAnim.width) / 2;
114                        loaderAnim.y = (RootReference.stage.stageHeight - loaderAnim.height) / 2;
115                }
116
117
118                public function get skin():ISkin {
119                        return _skin;
120                }
121
122
123                public function set skin(skn:ISkin):void {
124                        _skin = skn;
125                }
126
127
128                public function setupView():void {
129                        RootReference.stage.addChildAt(_root, 0);
130                        _root.visible = false;
131
132                        setupLayers();
133                        setupComponents();
134
135                        RootReference.stage.addEventListener(Event.FULLSCREEN, resizeHandler);
136                        RootReference.stage.addEventListener(Event.RESIZE, resizeHandler);
137
138                        _model.addEventListener(MediaEvent.JWPLAYER_MEDIA_LOADED, mediaLoaded);
139                        _model.playlist.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, itemHandler);
140                        //_model.playlist.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, itemHandler);
141                        _model.playlist.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_UPDATED, itemHandler);
142                        _model.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler);
143
144                        layoutManager = new PlayerLayoutManager(_player);
145                        setupRightClick();
146
147                        redraw();
148                }
149               
150                protected function setupRightClick():void {
151                        var menu:RightclickMenu = new RightclickMenu(_player, _root);
152                        menu.addGlobalListener(forward);
153                }
154
155                public function completeView(isError:Boolean=false, errorMsg:String=""):void {
156                        if (!isError) {
157                                _root.visible = true;
158                                RootReference.stage.removeChild(loaderScreen);
159                        } else {
160                                loaderScreen.removeChild(loaderAnim);
161                                var errorScreen:DisplayObject = new ErrorScreen() as DisplayObject;
162                                errorScreen.x = (loaderScreen.width - errorScreen.width) / 2;
163                                errorScreen.y = (loaderScreen.height - errorScreen.height) / 2;
164                                loaderScreen.addChild(errorScreen);
165                        }
166                }
167
168
169                protected function setupLayers():void {
170                        _backgroundLayer = setupLayer("background", currentLayer++);
171                        setupBackground();
172
173                        _mediaLayer = setupLayer("media", currentLayer++);
174                        _mediaLayer.visible = false;
175
176                        _imageLayer = setupLayer("image", currentLayer++);
177                        _image = new Loader();
178                        _image.contentLoaderInfo.addEventListener(Event.COMPLETE, imageComplete);
179                        _image.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imageError);
180
181                        setupLogo();
182
183                        _componentsLayer = setupLayer("components", currentLayer++);
184
185                        _pluginsLayer = setupLayer("plugins", currentLayer++);
186                        _plugins = {};
187                       
188                }
189               
190                protected function setupLogo():void {
191                        _logoLayer = setupLayer("logo", currentLayer++);
192                        _logo = new Logo(_player);
193                        _logoLayer.addChild(_logo);
194                }
195
196
197                protected function setupLayer(name:String, index:Number):MovieClip {
198                        var layer:MovieClip = new MovieClip();
199                        _root.addChildAt(layer, index);
200                        layer.name = name;
201                        layer.x = 0;
202                        layer.y = 0;
203                        return layer;
204                }
205
206
207                protected function setupBackground():void {
208                        var background:MovieClip = new MovieClip();
209                        background.name = "background";
210                        _backgroundLayer.addChild(background);
211                        background.graphics.beginFill(_player.config.screencolor ? _player.config.screencolor.color : 0x000000, 1);
212                        background.graphics.drawRect(0, 0, 1, 1);
213                        background.graphics.endFill();
214                }
215
216
217                protected function setupDisplayMask():void {
218                        _displayMasker = new MovieClip();
219                        _displayMasker.graphics.beginFill(0x000000, 1);
220                        _displayMasker.graphics.drawRect(0, 0, _player.config.width, _player.config.height);
221                        _displayMasker.graphics.endFill();
222
223                        _backgroundLayer.mask = _displayMasker;
224                        _imageLayer.mask = _displayMasker;
225                        _mediaLayer.mask = _displayMasker;
226                }
227
228
229                protected function setupComponents():void {
230                        _components = new PlayerComponents(_player);
231
232                        setupComponent(_components.display, 0);
233                        setupComponent(_components.playlist, 1);
234                        setupComponent(_components.controlbar, 2);
235                        setupComponent(_components.dock, 3);
236                }
237
238
239                protected function setupComponent(component:IPlayerComponent, index:Number):void {
240                        component.addGlobalListener(forward);
241                        _componentsLayer.addChildAt(component as DisplayObject, index);
242                }
243
244
245                protected function resizeHandler(event:Event):void {
246                        redraw();
247
248                        var currentFSMode:Boolean = (RootReference.stage.displayState == StageDisplayState.FULL_SCREEN);
249                        if (_model.fullscreen != currentFSMode) {
250                                dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_FULLSCREEN, currentFSMode));
251                        }
252                }
253
254
255                public function fullscreen(mode:Boolean=true):void {
256                        RootReference.stage.displayState = mode ? StageDisplayState.FULL_SCREEN : StageDisplayState.NORMAL;
257                }
258
259
260                /** Redraws the plugins and player components **/
261                public function redraw():void {
262                        layoutManager.resize(RootReference.stage.stageWidth, RootReference.stage.stageHeight);
263
264                        _components.resize(_player.config.width, _player.config.height);
265
266                        resizeBackground();
267                        resizeMasker();
268
269                        if (_imageLayer.numChildren) {
270                                _imageLayer.x = _components.display.x;
271                                _imageLayer.y = _components.display.y;
272                                Stretcher.stretch(_image, _player.config.width, _player.config.height, _player.config.stretching);
273                        }
274
275                        if (_mediaLayer.numChildren && _model.media.display) {
276                                _mediaLayer.x = _components.display.x;
277                                _mediaLayer.y = _components.display.y;
278                                _model.media.resize(_player.config.width, _player.config.height);
279                        }
280
281                        if (_logoLayer.numChildren) {
282                                _logoLayer.x = _components.display.x;
283                                _logoLayer.y = _components.display.y;
284                                _logo.resize(_player.config.width, _player.config.height);
285                        }
286
287                        for (var i:Number = 0; i < _pluginsLayer.numChildren; i++) {
288                                var plug:IPlugin = _pluginsLayer.getChildAt(i) as IPlugin;
289                                var plugDisplay:DisplayObject = plug as DisplayObject;
290                                if (plug && plugDisplay) {
291                                        var cfg:PluginConfig = _player.config.pluginConfig(plug.id);
292                                        if (cfg['visible']) {
293                                                plugDisplay.visible = true;
294                                                plugDisplay.x = cfg['x'];
295                                                plugDisplay.y = cfg['y'];
296                                                try {
297                                                        plug.resize(cfg.width, cfg.height);
298                                                } catch (e:Error) {
299                                                        Logger.log("There was an error resizing plugin '" + plug.id + "': " + e.message);
300                                                }
301                                        } else {
302                                                plugDisplay.visible = false;
303                                        }
304                                }
305                        }
306
307                        PlayerV4Emulation.getInstance(_player).resize(_player.config.width, _player.config.height);
308                }
309
310
311                protected function resizeBackground():void {
312                        var bg:DisplayObject = _backgroundLayer.getChildByName("background");
313                        bg.width = RootReference.stage.stageWidth;
314                        bg.height = RootReference.stage.stageHeight;
315                        bg.x = 0;
316                        bg.y = 0;
317                }
318
319
320                protected function resizeMasker():void {
321                        if (_displayMasker == null)
322                                setupDisplayMask();
323
324                        _displayMasker.graphics.clear();
325                        _displayMasker.graphics.beginFill(0, 1);
326                        _displayMasker.graphics.drawRect(_components.display.x, _components.display.y, _player.config.width, _player.config.height);
327                        _displayMasker.graphics.endFill();
328                }
329
330
331                public function get components():IPlayerComponents {
332                        return _components;
333                }
334
335
336                public function overrideComponent(newComponent:IPlayerComponent):void {
337                        if (newComponent is IControlbarComponent) {
338                                // Replace controlbar
339                        } else if (newComponent is IDisplayComponent) {
340                                // Replace display
341                        } else if (newComponent is IDockComponent) {
342                                // Replace dock
343                        } else if (newComponent is IPlaylistComponent) {
344                                // Replace playlist
345                        } else {
346                                dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, "Component must implement a component interface"));
347                        }
348                }
349
350
351                public function addPlugin(id:String, plugin:IPlugin):void {
352                        try {
353                                var plugDO:DisplayObject = plugin as DisplayObject;
354                                if (!_plugins[id] && plugDO != null) {
355                                        _plugins[id] = plugDO;
356                                        _pluginsLayer.addChild(plugDO);
357                                                //_pluginsLayer[id] = plugDO;
358                                }
359                        } catch (e:Error) {
360                                dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, e.message));
361                        }
362                }
363
364
365                public function removePlugin(plugin:IPlugin):void {
366                        var id:String = plugin.id.toLowerCase();
367                        if (id && _plugins[id] is IPlugin) {
368                                _pluginsLayer.removeChild(_plugins[id]);
369                                delete _plugins[id];
370                        }
371                }
372
373
374                public function loadedPlugins():Array {
375                        var list:Array = [];
376                        for (var pluginId:String in _plugins) {
377                                if (_plugins[pluginId] is IPlugin) {
378                                        list.push(pluginId);
379                                }
380                        }
381                        return list;
382                }
383
384
385                public function getPlugin(id:String):IPlugin {
386                        return _plugins[id] as IPlugin;
387                }
388
389
390                public function bringPluginToFront(id:String):void {
391                        var plugin:IPlugin = getPlugin(id);
392                        _pluginsLayer.setChildIndex(plugin as DisplayObject, _pluginsLayer.numChildren - 1);
393                }
394
395
396                protected function mediaLoaded(evt:MediaEvent):void {
397                        _mediaLayer.x = _components.display.x;
398                        _mediaLayer.y = _components.display.y;
399                        if (_model.media.display) {
400                                _model.media.resize(_player.config.width, _player.config.height);
401                                _mediaLayer.addChild(_model.media.display);
402                        }
403                }
404
405
406                protected function itemHandler(evt:PlaylistEvent):void {
407                        while (_mediaLayer.numChildren) {
408                                _mediaLayer.removeChildAt(0);
409                        }
410                        if (_model.playlist.currentItem && _model.playlist.currentItem.image) {
411                                loadImage(_model.playlist.currentItem.image);
412
413                        }
414                }
415
416
417                protected function loadImage(url:String):void {
418                        while (_imageLayer.numChildren) {
419                                _imageLayer.removeChildAt(0);
420                        }
421
422                        _image.load(new URLRequest(url), new LoaderContext(true));
423                }
424
425
426                protected function imageComplete(evt:Event):void {
427                        if (_image) {
428                                _imageLayer.addChild(_image);
429                                _imageLayer.x = _components.display.x;
430                                _imageLayer.y = _components.display.y;
431                                Stretcher.stretch(_image, _player.config.width, _player.config.height, _player.config.stretching);
432                                try {
433                                        Draw.smooth(_image.content as Bitmap);
434                                } catch (e:Error) {
435                                        Logger.log('Could not smooth preview image: ' + e.message);
436                                }
437                        }
438                }
439
440
441                protected function imageError(evt:ErrorEvent):void {
442                        Logger.log('Error loading preview image: '+evt.text);
443                        //dispatchEvent(new PlayerEvent(PlayerEvent.JWPLAYER_ERROR, evt.text));
444                }
445
446
447                protected function stateHandler(evt:PlayerStateEvent):void {
448                        switch (evt.newstate) {
449                                case PlayerState.IDLE:
450                                        _imageLayer.visible = true;
451                                        _mediaLayer.visible = false;
452                                        _logoLayer.visible = false;
453                                        break;
454                                case PlayerState.PLAYING:
455                                        if (_model.media.display) {
456                                                _imageLayer.visible = false;
457                                                _mediaLayer.visible = true;
458                                        }
459                                        _logoLayer.visible = true;
460                                        break;
461                        }
462                }
463
464
465                protected function forward(evt:Event):void {
466                        if (evt is PlayerEvent)
467                                dispatchEvent(evt);
468                }
469        }
470}
Note: See TracBrowser for help on using the repository browser.