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

Revision 476, 10.5 KB checked in by zach, 4 years ago (diff)

Fixing DisplayComponent rendering

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.Player;
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.RootReference;
15        import com.longtailvideo.jwplayer.utils.Stretcher;
16        import com.longtailvideo.jwplayer.view.interfaces.IControlbarComponent;
17        import com.longtailvideo.jwplayer.view.interfaces.IDisplayComponent;
18        import com.longtailvideo.jwplayer.view.interfaces.IDockComponent;
19        import com.longtailvideo.jwplayer.view.interfaces.IPlayerComponent;
20        import com.longtailvideo.jwplayer.view.interfaces.IPlaylistComponent;
21        import com.longtailvideo.jwplayer.view.interfaces.ISkin;
22       
23        import flash.display.DisplayObject;
24        import flash.display.Loader;
25        import flash.display.MovieClip;
26        import flash.display.Stage;
27        import flash.display.StageAlign;
28        import flash.display.StageDisplayState;
29        import flash.display.StageScaleMode;
30        import flash.events.ErrorEvent;
31        import flash.events.Event;
32        import flash.events.IOErrorEvent;
33        import flash.net.URLRequest;
34
35        public class View extends GlobalEventDispatcher {
36                private var _player:Player;
37                private var _model:Model;
38                private var _skin:ISkin;
39                private var _components:PlayerComponents;
40                private var _fullscreen:Boolean = false;
41                private var stage:Stage;
42
43                private var _root:MovieClip;
44
45                private var _backgroundLayer:MovieClip;
46                private var _mediaLayer:MovieClip;
47                private var _imageLayer:MovieClip;
48                private var _componentsLayer:MovieClip;
49                private var _logoLayer:MovieClip;
50                private var _pluginsLayer:MovieClip;
51
52                private var _displayMasker:MovieClip;
53
54                private var _image:Loader;
55                private var _logo:Logo;
56
57                private var layoutManager:PlayerLayoutManager;
58                 
59                public function View(player:Player, model:Model) {
60                        _player = player;
61                        _model = model;
62
63                        _root = new MovieClip();
64                        RootReference.stage.addChildAt(_root, 0);
65
66                        setupLayers();
67                        RootReference.stage.scaleMode = StageScaleMode.NO_SCALE;
68                        RootReference.stage.stage.align = StageAlign.TOP_LEFT;
69                        RootReference.stage.addEventListener(Event.FULLSCREEN, resizeHandler);
70                        RootReference.stage.addEventListener(Event.RESIZE, resizeHandler);
71                        _model.addEventListener(MediaEvent.JWPLAYER_MEDIA_LOADED, mediaLoaded);
72                        _model.playlist.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, itemHandler);
73                        _model.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler);
74
75                        layoutManager = new PlayerLayoutManager(_player);
76                }
77
78                private function setupLayers():void {
79                        _backgroundLayer = setupLayer("background", 0);
80                        setupBackground();
81                       
82                        _mediaLayer = setupLayer("media", 1);
83
84                        _imageLayer = setupLayer("image", 2);
85                        _image = new Loader();
86                        _image.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imageError);
87                        _image.contentLoaderInfo.addEventListener(Event.COMPLETE, imageComplete);
88
89                        _componentsLayer = setupLayer("components", 3);
90
91                        _logoLayer = setupLayer("logo", 4);
92                        _logo = new Logo(_player);
93                        _logoLayer.addChild(_logo);
94
95                        _pluginsLayer = setupLayer("plugins", 5);
96                }
97
98                public function setupView():void {
99                        var menu:RightclickMenu = new RightclickMenu(_model, _root);
100                        menu.addGlobalListener(forward);
101                }
102
103                private function setupBackground():void {
104                        var background:MovieClip = new MovieClip();
105                        background.name = "background";
106                        _backgroundLayer.addChildAt(background, 0);
107                        background.graphics.beginFill(_player.config.screencolor, 1);
108                        background.graphics.drawRect(0, 0, 1, 1);
109                        background.graphics.endFill();
110                }
111
112                private function setupDisplayMask():void {
113                        _displayMasker = new MovieClip();
114                        _displayMasker.graphics.beginFill(_player.config.screencolor, 1);
115                        _displayMasker.graphics.drawRect(0, 0, _player.config.width, _player.config.height);
116                        _displayMasker.graphics.endFill();
117                       
118                        _backgroundLayer.mask = _displayMasker;
119                        _imageLayer.mask = _displayMasker;
120                        _mediaLayer.mask = _displayMasker;
121                }
122
123                private function setupLayer(name:String, index:Number):MovieClip {
124                        var layer:MovieClip = new MovieClip();
125                        _root.addChildAt(layer, index);
126                        layer.name = name;
127                        layer.x = 0;
128                        layer.y = 0;
129                        return layer;
130                }
131
132                private function resizeHandler(event:Event):void {
133                        redraw();
134
135                        var currentFSMode:Boolean = (RootReference.stage.displayState == StageDisplayState.FULL_SCREEN);
136                        if (_model.fullscreen != currentFSMode) {
137                                dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_FULLSCREEN, currentFSMode));
138                        }
139                }
140
141                public function set skin(skn:ISkin):void {
142                        _skin = skn;
143                        if (!_components) {
144                                setupComponents();
145                        }
146                }
147
148                private function setupComponents():void {
149                        _components = new PlayerComponents(_player);
150                       
151                        setupComponent(_components.playlist, 0);
152                        setupComponent(_components.display, 1);
153                        setupComponent(_components.controlbar, 2);
154                        setupComponent(_components.dock, 3);
155                        redraw();
156                }
157               
158                private function setupComponent(component:IPlayerComponent, index:Number):void {
159                        component.addGlobalListener(forward);
160                        _componentsLayer.addChildAt(component as DisplayObject, index);
161                }
162
163                public function get skin():ISkin {
164                        return _skin;
165                }
166
167                public function fullscreen(mode:Boolean=true):void {
168                        RootReference.stage.displayState = mode ? StageDisplayState.FULL_SCREEN : StageDisplayState.NORMAL;
169                }
170
171                /** Redraws the plugins and player components **/
172                public function redraw():void {
173                        layoutManager.resize(RootReference.stage.stageWidth, RootReference.stage.stageHeight);
174
175                        _components.resize(_player.config.width, _player.config.height);
176
177                        resizeBackground();
178                        resizeMasker();
179
180                        if (_imageLayer.numChildren) {
181                                _imageLayer.x = _components.display.x;
182                                _imageLayer.y = _components.display.y;
183                                Stretcher.stretch(_image, _player.config.width, _player.config.height, _player.config.stretching);
184                        }
185                       
186                        if (_mediaLayer.numChildren && _model.media.display) {
187                                _mediaLayer.x = _components.display.x;
188                                _mediaLayer.y = _components.display.y;
189                                _model.media.resize(_player.config.width, _player.config.height);
190                        }
191
192                        if (_logoLayer.numChildren) {
193                                _logo.resize(_components.display.width, _components.display.height);
194                                _logoLayer.x = 0;
195                                _logoLayer.y = _components.display.height - _logoLayer.height;
196                        }
197                       
198                        for (var i:Number = 0; i < _pluginsLayer.numChildren; i++) {
199                                var plug:IPlugin = _pluginsLayer.getChildAt(i) as IPlugin;
200                                if (plug) {
201                                        var cfg:PluginConfig = _player.config.pluginConfig((plug as DisplayObject).name);
202                                        if (cfg['visible']) {
203                                                plug.visible = true;
204                                                plug.resize(cfg.width, cfg.height);
205                                        } else {
206                                                plug.visible = false;
207                                        }
208                                }
209                        }
210                        PlayerV4Emulation.getInstance().resize(_player.config.width, _player.config.height);
211                }
212
213                private function resizeBackground():void {
214                        var bg:DisplayObject = _backgroundLayer.getChildByName("background");
215                        bg.width = _player.config.width;
216                        bg.height = _player.config.height;
217                        bg.x = _components.display.x;
218                        bg.y = _components.display.y;
219                }
220
221                private function resizeMasker():void {
222                        if (_displayMasker == null) setupDisplayMask();
223                       
224                        _displayMasker.x = _components.display.x;
225                        _displayMasker.y = _components.display.y;
226                        _displayMasker.width = _player.config.width;
227                        _displayMasker.height = _player.config.height;
228                }
229
230                public function get components():PlayerComponents {
231                        return _components;
232                }
233
234                public function overrideComponent(newComponent:IPlayerComponent):void {
235                        if (newComponent is IControlbarComponent) {
236                                // Replace controlbar
237                        } else if (newComponent is IDisplayComponent) {
238                                // Replace display
239                        } else if (newComponent is IDockComponent) {
240                                // Replace dock
241                        } else if (newComponent is IPlaylistComponent) {
242                                // Replace playlist
243                        } else {
244                                dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, "Component must implement a component interface"));
245                        }
246                }
247
248                public function addPlugin(name:String, plugin:IPlugin):void {
249                        try {
250                                var plugDO:DisplayObject = plugin as DisplayObject;
251                                if (_pluginsLayer.getChildByName(name) == null && plugDO != null) {
252                                        plugDO.name = name;
253                                        _pluginsLayer.addChild(plugDO);
254                                        _pluginsLayer[name] = plugDO;
255                                }
256                        } catch (e:Error) {
257                                dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, e.message));
258                        }
259                }
260
261                public function loadedPlugins():Array {
262                        var list:Array = [];
263                        for each (var plugin:DisplayObject in _pluginsLayer) {
264                                if (plugin is IPlugin) {
265                                        list.push(plugin.name);
266                                }
267                        }
268                        return list;
269                }
270
271                public function getPlugin(name:String):IPlugin {
272                        return _pluginsLayer.getChildByName(name) as IPlugin;
273                }
274
275                private function mediaLoaded(evt:MediaEvent):void {
276                        _mediaLayer.x = _components.display.x;
277                        _mediaLayer.y = _components.display.y;
278                        if (_model.media.display) {
279                                _model.media.resize(_player.config.width, _player.config.height);
280                                _mediaLayer.addChild(_model.media.display);
281                        }
282                }
283
284                private function itemHandler(evt:PlaylistEvent):void {
285                        while (_mediaLayer.numChildren) {
286                                _mediaLayer.removeChildAt(0);
287                        }
288                        if (_model.playlist.currentItem && _model.playlist.currentItem.image) {
289                                loadImage(_model.playlist.currentItem.image);
290
291                        }
292                }
293
294                private function loadImage(url:String):void {
295                        _image.load(new URLRequest(url));
296                }
297
298                private function imageComplete(evt:Event):void {
299                        while (_imageLayer.numChildren) {
300                                _imageLayer.removeChildAt(0);
301                        }
302                        _imageLayer.addChild(_image);
303                        _imageLayer.x = _components.display.x;
304                        _imageLayer.y = _components.display.y;
305                        Stretcher.stretch(_image, _player.config.width, _player.config.height, _player.config.stretching);
306                }
307
308                private function imageError(evt:IOErrorEvent):void {
309                        _image = null;
310                        dispatchEvent(new PlayerEvent(PlayerEvent.JWPLAYER_ERROR, evt.text));
311                }
312
313                private function stateHandler(evt:PlayerStateEvent):void {
314                        switch (evt.newstate) {
315                                case PlayerState.IDLE:
316                                        _imageLayer.visible = true;
317                                        _mediaLayer.visible = false;
318                                        _logoLayer.visible = false;
319                                        break;
320                                case PlayerState.PLAYING:
321                                        _imageLayer.visible = false;
322                                        _mediaLayer.visible = true;
323                                        _logoLayer.visible = true;
324                                        break;
325                        }
326                }
327
328                private function forward(evt:Event):void {
329                        if (evt is PlayerEvent) dispatchEvent(evt);
330                }
331
332        }
333}
Note: See TracBrowser for help on using the repository browser.