source: trunk/fl5/src/com/longtailvideo/jwplayer/view/V4ControlBarComponent.as @ 398

Revision 398, 18.7 KB checked in by zach, 4 years ago (diff)
  • Updated playlists
Line 
1package com.longtailvideo.jwplayer.view {
2        import com.longtailvideo.jwplayer.events.MediaEvent;
3        import com.longtailvideo.jwplayer.events.PlayerEvent;
4        import com.longtailvideo.jwplayer.events.PlaylistEvent;
5        import com.longtailvideo.jwplayer.events.ViewEvent;
6        import com.longtailvideo.jwplayer.player.Player;
7        import com.longtailvideo.jwplayer.player.PlayerState;
8        import com.longtailvideo.jwplayer.utils.Draw;
9        import com.longtailvideo.jwplayer.utils.Strings;
10       
11        import flash.accessibility.AccessibilityProperties;
12        import flash.display.DisplayObject;
13        import flash.display.MovieClip;
14        import flash.display.Sprite;
15        import flash.events.MouseEvent;
16        import flash.geom.ColorTransform;
17        import flash.geom.Rectangle;
18        import flash.text.TextField;
19        import flash.ui.Mouse;
20        import flash.utils.clearTimeout;
21        import flash.utils.setTimeout;
22       
23        import mx.effects.Fade;
24       
25       
26        public class V4ControlBarComponent extends CoreComponent implements IControlbarComponent {
27                /** Reference to the original skin **/
28                private var skin:Sprite;
29                /** A list with all controls. **/
30                private var stacker:Stacker;
31                /** Timeout for hiding the  **/
32                private var hiding:Number;
33                /** When scrubbing, icon shouldn't be set. **/
34                private var scrubber:MovieClip;
35                /** Color object for frontcolor. **/
36                private var front:ColorTransform;
37                /** Color object for lightcolor. **/
38                private var light:ColorTransform;
39                /** The actions for all controlbar buttons. **/
40                private var BUTTONS:Object;
41                /** The actions for all sliders **/
42                private var SLIDERS:Object = {timeSlider: ViewEvent.JWPLAYER_VIEW_SEEK, volumeSlider: ViewEvent.JWPLAYER_VIEW_VOLUME}
43                /** The button to clone for all custom buttons. **/
44                private var clonee:MovieClip;
45                /** Saving the block state of the controlbar. **/
46                private var blocking:Boolean;
47               
48               
49                public function V4ControlBarComponent(player:Player) {
50                        super(player);
51                        // TODO: Remove Link button
52                        BUTTONS = {
53                                playButton: ViewEvent.JWPLAYER_VIEW_PLAY,
54                                pauseButton: ViewEvent.JWPLAYER_VIEW_PAUSE,
55                                stopButton: ViewEvent.JWPLAYER_VIEW_STOP,
56                                prevButton: ViewEvent.JWPLAYER_VIEW_PREV,
57                                nextButton: ViewEvent.JWPLAYER_VIEW_NEXT,
58                                linkButton: 'LINK',
59                                fullscreenButton: ViewEvent.JWPLAYER_VIEW_FULLSCREEN,
60                                normalscreenButton: ViewEvent.JWPLAYER_VIEW_FULLSCREEN,
61                                muteButton: ViewEvent.JWPLAYER_VIEW_MUTE,
62                                unmuteButton: ViewEvent.JWPLAYER_VIEW_MUTE
63                        };
64                        var temp:Sprite = player.skin.getSWFSkin();
65                        skin = player.skin.getSWFSkin().getChildByName('controlbar') as Sprite;
66                        skin.x = 0;
67                        skin.y = 0;
68                        addChild(skin);
69                        player.addEventListener(PlayerEvent.JWPLAYER_STATE, stateHandler);
70                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_TIME, timeHandler);
71                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_MUTE, muteHandler);
72                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_VOLUME, volumeHandler);
73                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_LOADED, loadedHandler);
74                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, itemHandler);
75                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_UPDATED, itemHandler);
76                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, itemHandler);
77                        stacker = new Stacker(skin as MovieClip);
78                        setButtons();
79                        setColors();
80                        itemHandler();
81                        loadedHandler();
82                        muteHandler();
83                        stateHandler();
84                        timeHandler();
85                        volumeHandler();
86                }
87               
88               
89                /**
90                 * Add a new button to the control
91                 *
92                 * @param icn   A graphic to show as icon
93                 * @param nam   Name of the button
94                   getSkinElement("controlbar", '* @param hdl   The function to call when clicking the Button').
95                 **/
96                public function addButton(name:String, icon:DisplayObject, handler:Function = null):void {
97                        if (getSkinElement("controlbar", 'linkButton') && getSkinElement("controlbar", 'linkButton').getChildByName('back')) {
98                                var btn:* = Draw.clone(getSkinElement("controlbar", 'linkButton') as Sprite);
99                                btn.name = name + 'Button';
100                                btn.visible = true;
101                                btn.tabEnabled = true;
102                                btn.tabIndex = 6;
103                                var acs:AccessibilityProperties = new AccessibilityProperties();
104                                acs.name = name + 'Button';
105                                btn.accessibilityProperties = acs;
106                                addChild(btn);
107                                var off:Number = Math.round((btn.height - icon.height) / 2);
108                                Draw.clear(btn.icon);
109                                btn.icon.addChild(icon);
110                                icon.x = icon.y = 0;
111                                btn.icon.x = btn.icon.y = off;
112                                btn.back.width = icon.width + 2 * off;
113                                btn.buttonMode = true;
114                                btn.mouseChildren = false;
115                                btn.addEventListener(MouseEvent.CLICK, handler);
116                                if (front) {
117                                        btn.icon.transform.colorTransform = front;
118                                        btn.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
119                                        btn.addEventListener(MouseEvent.MOUSE_OUT, outHandler);
120                                }
121                                stacker.insert(btn, getSkinElement("controlbar", 'linkButton') as MovieClip);
122                        }
123                }
124               
125               
126                public function removeButton(name:String):void {
127                }
128               
129               
130                public function resize(width:Number, height:Number):void {
131                        var wid:Number = width;
132                        if (player.config.position == 'over' || player.config.fullscreen == true) {
133                                x = player.config.x + player.config.margin;
134                                y = player.config.y + player.config.height - player.config.margin - player.config.size;
135                                wid = width - 2 * player.config.margin;
136                        }
137                        try {
138                                getSkinElement("controlbar", 'fullscreenButton').visible = false;
139                                getSkinElement("controlbar", 'normalscreenButton').visible = false;
140                                if (stage['displayState'] && player.config.height > 40) {
141                                        if (player.config.fullscreen) {
142                                                getSkinElement("controlbar", 'fullscreenButton').visible = false;
143                                                getSkinElement("controlbar", 'normalscreenButton').visible = true;
144                                        } else {
145                                                getSkinElement("controlbar", 'fullscreenButton').visible = true;
146                                                getSkinElement("controlbar", 'normalscreenButton').visible = false;
147                                        }
148                                }
149                        } catch (err:Error) {
150                        }
151                        stacker.rearrange(width);
152                        stateHandler();
153                        fixTime();
154                        Mouse.show();
155                }
156               
157               
158                public function getButton(buttonName:String):DisplayObject {
159                        return null;
160                }
161               
162               
163                /** Hide the controlbar **/
164                public function block(stt:Boolean):void {
165                        blocking = stt;
166                        timeHandler();
167                }
168               
169               
170                /** Handle clicks from all buttons. **/
171                private function clickHandler(evt:MouseEvent):void {
172                        var act:String = BUTTONS[evt.target.name];
173                        var data:Object = null;
174                        if (blocking != true || act == "FULLSCREEN" || act == "MUTE") {
175                                switch (act) {
176                                        case ViewEvent.JWPLAYER_VIEW_PLAY:
177                                        case ViewEvent.JWPLAYER_VIEW_PAUSE:
178                                                data = Boolean(_player.state == PlayerState.IDLE || _player.state == PlayerState.PAUSED);
179                                                break;
180                                        case ViewEvent.JWPLAYER_VIEW_MUTE:
181                                                data = Boolean(!_player.config.mute);
182                                                break;
183                                }
184                                dispatchEvent(new ViewEvent(act, data));
185                        }
186                }
187               
188               
189                /** Handle mouse presses on sliders. **/
190                private function downHandler(evt:MouseEvent):void {
191                        scrubber = MovieClip(evt.target);
192                        if (blocking != true || scrubber.name == 'volumeSlider') {
193                                var rct:Rectangle = new Rectangle(scrubber.rail.x, scrubber.icon.y, scrubber.rail.width - scrubber.icon.width, 0);
194                                scrubber.icon.startDrag(true, rct);
195                                stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
196                        } else {
197                                scrubber = undefined;
198                        }
199                }
200               
201               
202                /** Fix the timeline display. **/
203                private function fixTime():void {
204                        try {
205                                var scp:Number = getSkinElement("controlbar", 'timeSlider').scaleX;
206                                getSkinElement("controlbar", 'timeSlider').scaleX = 1;
207                                getSkinElement("controlbar", 'timeSlider').getChildByName('icon').x = scp * getSkinElement("controlbar", 'timeSlider').getChildByName('icon').x;
208                                getSkinElement("controlbar", 'timeSlider').getChildByName('mark').x = scp * getSkinElement("controlbar", 'timeSlider').getChildByName('mark').x;
209                                getSkinElement("controlbar", 'timeSlider').getChildByName('mark').width = scp * getSkinElement("controlbar", 'timeSlider').getChildByName('mark').width;
210                                getSkinElement("controlbar", 'timeSlider').getChildByName('rail').width = scp * getSkinElement("controlbar", 'timeSlider').getChildByName('rail').width;
211                                getSkinElement("controlbar", 'timeSlider').getChildByName('done').x = scp * getSkinElement("controlbar", 'timeSlider').getChildByName('done').x;
212                                getSkinElement("controlbar", 'timeSlider').getChildByName('done').width = scp * getSkinElement("controlbar", 'timeSlider').getChildByName('done').width;
213                        } catch (err:Error) {
214                        }
215                }
216               
217               
218                /** Handle a change in the current item **/
219                private function itemHandler(evt:PlaylistEvent = null):void {
220                        try {
221                                if (player.playlist && player.playlist.length > 1) {
222                                        getSkinElement("controlbar", 'prevButton').visible = getSkinElement("controlbar", 'nextButton').visible = true;
223                                } else {
224                                        getSkinElement("controlbar", 'prevButton').visible = getSkinElement("controlbar", 'nextButton').visible = false;
225                                }
226                        } catch (err:Error) {
227                        }
228                        try {
229                                if (player.playlist && player.playlist.currentItem.link) {
230                                        getSkinElement("controlbar", 'linkButton').visible = true;
231                                } else {
232                                        getSkinElement("controlbar", 'linkButton').visible = false;
233                                }
234                        } catch (err:Error) {
235                        }
236                        timeHandler();
237                        stacker.rearrange();
238                        fixTime();
239                        loadedHandler();
240                }
241               
242               
243                /** Process bytesloaded updates given by the model. **/
244                private function loadedHandler(evt:MediaEvent = null):void {
245                        try {
246                                var wid:Number = getSkinElement("controlbar", 'timeSlider').getChildByName('rail').width;
247                                getSkinElement("controlbar", 'timeSlider').getChildByName('mark').x = evt.position * wid;
248                                getSkinElement("controlbar", 'timeSlider').getChildByName('mark').width = evt.bufferPercent * wid;
249                                var icw:Number = getSkinElement("controlbar", 'timeSlider').getChildByName('icon').x + getSkinElement("controlbar", 'timeSlider').getChildByName('icon').width;
250                        } catch (err:Error) {
251                        }
252                }
253               
254               
255                /** Show above controlbar on mousemove. **/
256                private function moveHandler(evt:MouseEvent = null):void {
257                        if (alpha == 0) {
258                                var fade:Fade = new Fade(this);
259                                fade.alphaTo = 1;
260                                fade.play();
261                        }
262                        clearTimeout(hiding);
263                        hiding = setTimeout(moveTimeout, 2000);
264                        Mouse.show();
265                }
266               
267               
268                /** Hide above controlbar again when move has timed out. **/
269                private function moveTimeout():void {
270                        var fade:Fade = new Fade(this);
271                        fade.alphaTo = 0;
272                        fade.play();
273                }
274               
275               
276                /** Show a mute icon if playing. **/
277                private function muteHandler(evt:MediaEvent = null):void {
278                        if (player.config.mute == true) {
279                                try {
280                                        getSkinElement("controlbar", 'muteButton').visible = false;
281                                        getSkinElement("controlbar", 'unmuteButton').visible = true;
282                                } catch (err:Error) {
283                                }
284                                try {
285                                        getSkinElement("controlbar", 'volumeSlider').getChildByName('mark').visible = false;
286                                        getSkinElement("controlbar", 'volumeSlider').getChildByName('icon').x = getSkinElement("controlbar", 'volumeSlider').getChildByName('rail').x;
287                                } catch (err:Error) {
288                                }
289                        } else {
290                                try {
291                                        getSkinElement("controlbar", 'muteButton').visible = true;
292                                        getSkinElement("controlbar", 'unmuteButton').visible = false;
293                                } catch (err:Error) {
294                                }
295                                try {
296                                        getSkinElement("controlbar", 'volumeSlider').getChildByName('mark').visible = true;
297                                        volumeHandler();
298                                } catch (err:Error) {
299                                }
300                        }
301                }
302               
303               
304                /** Handle mouseouts from all buttons **/
305                private function outHandler(evt:MouseEvent):void {
306                        if (front && evt.target['icon']) {
307                                evt.target['icon'].transform.colorTransform = front;
308                        } else {
309                                evt.target.gotoAndPlay('out');
310                        }
311                }
312               
313               
314                /** Handle clicks from all buttons **/
315                private function overHandler(evt:MouseEvent):void {
316                        if (front && evt.target['icon']) {
317                                evt.target['icon'].transform.colorTransform = light;
318                        } else {
319                                evt.target.gotoAndPlay('over');
320                        }
321                }
322               
323               
324                /** Clickhandler for all buttons. **/
325                private function setButtons():void {
326                        for (var btn:String in BUTTONS) {
327                                if (getSkinElement("controlbar", btn)) {
328                                        (getSkinElement("controlbar", btn) as MovieClip).mouseChildren = false;
329                                        (getSkinElement("controlbar", btn) as MovieClip).buttonMode = true;
330                                        getSkinElement("controlbar", btn).addEventListener(MouseEvent.CLICK, clickHandler);
331                                        getSkinElement("controlbar", btn).addEventListener(MouseEvent.MOUSE_OVER, overHandler);
332                                        getSkinElement("controlbar", btn).addEventListener(MouseEvent.MOUSE_OUT, outHandler);
333                                }
334                        }
335                        for (var sld:String in SLIDERS) {
336                                if (getSkinElement("controlbar", sld)) {
337                                        (getSkinElement("controlbar", sld) as MovieClip).mouseChildren = false;
338                                        (getSkinElement("controlbar", sld) as MovieClip).buttonMode = true;
339                                        getSkinElement("controlbar", sld).addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
340                                        getSkinElement("controlbar", sld).addEventListener(MouseEvent.MOUSE_OVER, overHandler);
341                                        getSkinElement("controlbar", sld).addEventListener(MouseEvent.MOUSE_OUT, outHandler);
342                                }
343                        }
344                }
345               
346               
347                /** Init the colors. **/
348                private function setColors():void {
349                        if (player.config.backcolor && getSkinElement("controlbar", 'playButton').getChildByName('icon')) {
350                                var clr:ColorTransform = new ColorTransform();
351                                clr.color = player.config.backcolor;
352                                getSkinElement("controlbar", 'back').transform.colorTransform = clr;
353                        }
354                        if (player.config.frontcolor) {
355                                try {
356                                        front = new ColorTransform();
357                                        front.color = player.config.frontcolor;
358                                        for (var btn:String in BUTTONS) {
359                                                if (getSkinElement("controlbar", btn)) {
360                                                        getSkinElement("controlbar", btn).getChildByName('icon').transform.colorTransform = front;
361                                                }
362                                        }
363                                        for (var sld:String in SLIDERS) {
364                                                if (getSkinElement("controlbar", sld)) {
365                                                        getSkinElement("controlbar", sld).getChildByName('icon').transform.colorTransform = front;
366                                                        getSkinElement("controlbar", sld).getChildByName('mark').transform.colorTransform = front;
367                                                        getSkinElement("controlbar", sld).getChildByName('rail').transform.colorTransform = front;
368                                                }
369                                        }
370                                        (getSkinElement("controlbar", 'elapsedText') as TextField).textColor = front.color;
371                                        (getSkinElement("controlbar", 'totalText') as TextField).textColor = front.color;
372                                } catch (err:Error) {
373                                }
374                        }
375                        if (player.config.lightcolor) {
376                                light = new ColorTransform();
377                                light.color = player.config.lightcolor;
378                        } else {
379                                light = front;
380                        }
381                        if (light) {
382                                try {
383                                        getSkinElement("controlbar", 'timeSlider').getChildByName('done').transform.colorTransform = light;
384                                        getSkinElement("controlbar", 'volumeSlider').getChildByName('mark').transform.colorTransform = light;
385                                } catch (err:Error) {
386                                }
387                        }
388                }
389               
390               
391                /** Process state changes **/
392                private function stateHandler(evt:PlayerEvent = undefined):void {
393                        clearTimeout(hiding);
394                        player.skin.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
395                        try {
396                                var dps:String = stage['displayState'];
397                        } catch (err:Error) {
398                        }
399                        switch (player.config.state) {
400                                case PlayerState.PLAYING:
401                                case PlayerState.BUFFERING:
402                                        try {
403                                                getSkinElement("controlbar", 'playButton').visible = false;
404                                                getSkinElement("controlbar", 'pauseButton').visible = true;
405                                        } catch (err:Error) {
406                                        }
407                                        if (player.config.position == 'over' || (dps == 'fullScreen' && player.config.position != 'none')) {
408                                                hiding = setTimeout(moveTimeout, 2000);
409                                                player.skin.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
410                                        } else {
411                                                var fade1:Fade = new Fade(this);
412                                                fade1.alphaTo = 1;
413                                                fade1.play();
414                                        }
415                                        break;
416                                default:
417                                        try {
418                                                getSkinElement("controlbar", 'playButton').visible = true;
419                                                getSkinElement("controlbar", 'pauseButton').visible = false;
420                                        } catch (err:Error) {
421                                        }
422                                        if (player.config.position == 'over' || dps == 'fullScreen') {
423                                                Mouse.show();
424                                                var fade2:Fade = new Fade(this);
425                                                fade2.alphaTo = 1;
426                                                fade2.play();
427                                        }
428                        }
429                }
430               
431               
432                /** Process time updates given by the model. **/
433                private function timeHandler(evt:MediaEvent = null):void {
434                        var dur:Number = 0;
435                        var pos:Number = 0;
436                        if (evt) {
437                                dur = evt.duration;
438                                pos = evt.position;
439                        } else if (player.playlist.length > 0) {
440                                dur = player.playlist.currentItem.duration;
441                                pos = 0;
442                        }
443                        var pct:Number = pos / dur;
444                        if (isNaN(pct)) {
445                                pct = 1;
446                        }
447                        try {
448                                (getSkinElement("controlbar", 'elapsedText') as TextField).text = Strings.digits(pos);
449                                (getSkinElement("controlbar", 'totalText') as TextField).text = Strings.digits(dur);
450                        } catch (err:Error) {
451                        }
452                        try {
453                                var tsl:MovieClip = getSkinElement("controlbar", 'timeSlider') as MovieClip;
454                                var xps:Number = Math.round(pct * (tsl.rail.width - tsl.icon.width));
455                                if (dur > 0) {
456                                        getSkinElement("controlbar", 'timeSlider').getChildByName('icon').visible = true;
457                                        getSkinElement("controlbar", 'timeSlider').getChildByName('mark').visible = true;
458                                        if (!scrubber) {
459                                                getSkinElement("controlbar", 'timeSlider').getChildByName('icon').x = xps;
460                                                getSkinElement("controlbar", 'timeSlider').getChildByName('done').width = xps;
461                                        }
462                                        getSkinElement("controlbar", 'timeSlider').getChildByName('done').visible = true;
463                                } else {
464                                        getSkinElement("controlbar", 'timeSlider').getChildByName('icon').visible = false;
465                                        getSkinElement("controlbar", 'timeSlider').getChildByName('mark').visible = false;
466                                        getSkinElement("controlbar", 'timeSlider').getChildByName('done').visible = false;
467                                }
468                        } catch (err:Error) {
469                        }
470                }
471               
472               
473                /** Handle mouse releases on sliders. **/
474                private function upHandler(evt:MouseEvent):void {
475                        var mpl:Number = 0;
476                        stage.removeEventListener(MouseEvent.MOUSE_UP, upHandler);
477                        scrubber.icon.stopDrag();
478                        if (scrubber.name == 'timeSlider' && player.playlist) {
479                                mpl = player.playlist.currentItem.duration;
480                        } else if (scrubber.name == 'volumeSlider') {
481                                mpl = 100;
482                        }
483                        var pct:Number = (scrubber.icon.x - scrubber.rail.x) / (scrubber.rail.width - scrubber.icon.width) * mpl;
484                        dispatchEvent(new ViewEvent(SLIDERS[scrubber.name], Math.round(pct)));
485                        scrubber = undefined;
486                }
487               
488               
489                /** Reflect the new volume in the controlbar **/
490                private function volumeHandler(evt:MediaEvent = null):void {
491                        try {
492                                var vsl:MovieClip = getSkinElement("controlbar", 'volumeSlider') as MovieClip;
493                                vsl.mark.width = player.config.volume * (vsl.rail.width - vsl.icon.width / 2) / 100;
494                                vsl.icon.x = vsl.mark.x + player.config.volume * (vsl.rail.width - vsl.icon.width) / 100;
495                        } catch (err:Error) {
496                        }
497                }
498               
499                private function getSkinElement(component:String, element:String):MovieClip {
500                        return skin.getChildByName(element) as MovieClip;
501                }
502        }
503}
Note: See TracBrowser for help on using the repository browser.