source: trunk/fl5/src/com/longtailvideo/jwplayer/view/components/PlaylistComponent.as @ 594

Revision 594, 19.1 KB checked in by zach, 4 years ago (diff)
  • PNG Playlist and Dock no longer colorize
  • PNG Playlist is using correctly named elements
  • Removing clone method from BaseSkin
Line 
1package com.longtailvideo.jwplayer.view.components {
2        import com.longtailvideo.jwplayer.events.PlayerStateEvent;
3        import com.longtailvideo.jwplayer.events.PlaylistEvent;
4        import com.longtailvideo.jwplayer.model.PlaylistItem;
5        import com.longtailvideo.jwplayer.player.IPlayer;
6        import com.longtailvideo.jwplayer.player.PlayerState;
7        import com.longtailvideo.jwplayer.utils.Draw;
8        import com.longtailvideo.jwplayer.utils.RootReference;
9        import com.longtailvideo.jwplayer.utils.Stacker;
10        import com.longtailvideo.jwplayer.utils.Stretcher;
11        import com.longtailvideo.jwplayer.utils.Strings;
12        import com.longtailvideo.jwplayer.view.PlayerLayoutManager;
13        import com.longtailvideo.jwplayer.view.interfaces.IPlaylistComponent;
14        import com.longtailvideo.jwplayer.view.skins.SWFSkin;
15       
16        import flash.display.DisplayObject;
17        import flash.display.DisplayObjectContainer;
18        import flash.display.Loader;
19        import flash.display.MovieClip;
20        import flash.display.Sprite;
21        import flash.events.Event;
22        import flash.events.MouseEvent;
23        import flash.geom.ColorTransform;
24        import flash.net.URLRequest;
25        import flash.text.TextField;
26        import flash.text.TextFormat;
27        import flash.utils.clearInterval;
28        import flash.utils.setInterval;
29       
30       
31        public class PlaylistComponent extends CoreComponent implements IPlaylistComponent {
32                /** Array with all button instances **/
33                private var buttons:Array;
34                /** Height of a button (to calculate scrolling) **/
35                private var buttonheight:Number;
36                /** Currently active button. **/
37                private var active:Number;
38                /** Proportion between clip and mask. **/
39                private var proportion:Number;
40                /** Interval ID for scrolling **/
41                private var scrollInterval:Number;
42                /** Image dimensions. **/
43                private var image:Array;
44                /** Color object for backcolor. **/
45                private var back:ColorTransform;
46                /** Color object for frontcolor. **/
47                private var front:ColorTransform;
48                /** Color object for lightcolor. **/
49                private var light:ColorTransform;
50                /** Visual representation of a the playlist **/
51                private var list:Sprite;
52                /** Visual representation of a playlist item **/
53                private var button:Sprite;
54                /** The playlist mask **/
55                private var listmask:Sprite;
56                /** The playlist slider **/
57                private var slider:Sprite;
58                /** The playlist background **/
59                private var background:Sprite;
60               
61               
62                public function PlaylistComponent(player:IPlayer) {
63                        super(player, "playlist");
64                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, itemHandler);
65                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, playlistHandler);
66                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_UPDATED, playlistHandler);
67                        player.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler);
68                        background = getSkinElement("background") as Sprite;
69                        if (!background) {
70                                background = new Sprite();
71                                background.name = "background";
72                                background.graphics.beginFill(0, 1);
73                                background.graphics.drawRect(0, 0, 1, 1);
74                                background.graphics.endFill();
75                        }
76                        addElement(background);
77                        slider = getSkinElement("slider") as Sprite;
78                        if (!slider) {
79                                slider = new Sprite();
80                               
81                               
82                                var sliderBack:Sprite = getSkinElement("sliderBackground") as Sprite;
83                                if (!sliderBack) {
84                                        sliderBack = new Sprite();
85                                        sliderBack.graphics.beginFill(0, 1);
86                                        sliderBack.graphics.drawRect(0, 0, 1, 1);
87                                        sliderBack.graphics.endFill();
88                                }
89                                sliderBack.name = "back";
90                                addElement(sliderBack,slider);
91                               
92                                var sliderRail:Sprite = getSkinElement("sliderRail") as Sprite;
93                                if (!sliderRail){
94                                        sliderRail = new Sprite();
95                                        sliderRail.graphics.beginFill(0, 1);
96                                        sliderRail.graphics.drawRect(0, 0, 7, 22);
97                                        sliderRail.graphics.endFill();
98                                }
99                                sliderRail.name = "rail";
100                                addElement(sliderRail,slider);
101                               
102                                var sliderThumb:Sprite = getSkinElement("sliderThumb") as Sprite;
103                                if (!sliderThumb) {
104                                        sliderThumb = new Sprite();
105                                        sliderThumb.graphics.beginFill(0, 1);
106                                        sliderThumb.graphics.drawRect(0, 0, 5, 54);
107                                        sliderThumb.graphics.endFill();
108                                }
109                                sliderThumb.name = "icon";
110                                addElement(sliderThumb,slider,(sliderRail.width - sliderThumb.width)/2);
111                        }
112                        addElement(slider);
113                        slider.buttonMode = true;
114                        slider.mouseChildren = false;
115                        slider.addEventListener(MouseEvent.MOUSE_DOWN, sdownHandler);
116                        slider.addEventListener(MouseEvent.MOUSE_OVER, soverHandler);
117                        slider.addEventListener(MouseEvent.MOUSE_OUT, soutHandler);
118                        slider.visible = false;
119                        listmask = getSkinElement("masker") as Sprite;
120                        if (!listmask) {
121                                listmask = new Sprite();
122                                listmask.graphics.beginFill(0, 0);
123                                listmask.graphics.drawRect(0, 0, 1, 1);
124                                listmask.graphics.endFill();
125                        }
126                        addElement(listmask);
127                        list = getSkinElement("list") as Sprite;
128                        if (!list) {
129                                list = new Sprite();
130                                button = buildButton() as Sprite;
131                                addElement(button, list);
132                        } else {
133                                button = list.getChildByName("button") as Sprite;
134                        }
135                        buttonheight = button.height;
136                        button.visible = false;
137                        list.mask = listmask;
138                        list.addEventListener(MouseEvent.CLICK, clickHandler);
139                        list.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
140                        list.addEventListener(MouseEvent.MOUSE_OUT, outHandler);
141                        addElement(list);
142                        buttons = new Array();
143                        this.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);
144                        try {
145                                image = new Array(button.getChildByName("image").width, button.getChildByName("image").height);
146                        } catch (err:Error) {
147                        }
148                        if (button.getChildByName("back")) {
149                                setColors();
150                        }
151                }
152               
153               
154                private function buildButton():MovieClip {
155                        var btn:MovieClip = new MovieClip();
156                       
157                        var backOver:Sprite = getSkinElement("itemOver") as Sprite;
158                        if (!backOver) {
159                                backOver = new Sprite();
160                                backOver.graphics.beginFill(0, 1);
161                                backOver.graphics.drawRect(0, 0, 1, 1);
162                                backOver.graphics.endFill();
163                        }
164                        backOver.name = "backOver";
165                        addElement(backOver, btn, 0, 0);
166                       
167                        var back:Sprite = getSkinElement("item") as Sprite;
168                        if (!back) {
169                                back = new Sprite();
170                                back.graphics.beginFill(0, 1);
171                                back.graphics.drawRect(0, 0, 1, 1);
172                                back.graphics.endFill();
173                        }
174                        back.name = "back";
175                        addElement(back, btn, 0, 0);
176                       
177                        var img:Sprite = new Sprite();
178                        img.name = "image";
179                        img.graphics.beginFill(0, 1);
180                        img.graphics.drawRect(0, 0, 80, back.height);
181                        img.graphics.endFill();
182                        addElement(img, btn, 1, 1);
183                       
184                        var titleTextFormat:TextFormat = new TextFormat();
185                        titleTextFormat.size = 13;
186                        titleTextFormat.font = "_sans";
187                        titleTextFormat.bold = true;
188                        var title:TextField = new TextField();
189                        title.name = "title";
190                        //title.autoSize = TextFieldAutoSize.LEFT;
191                        title.defaultTextFormat = titleTextFormat;
192                        title.wordWrap = true;
193                        title.multiline = true;
194                        title.width = 250;
195                        title.height = 20;
196                        addElement(title, btn, 85, 2);
197                       
198                        var descriptionTextFormat:TextFormat = new TextFormat();
199                        descriptionTextFormat.size = 11;
200                        descriptionTextFormat.font = "_sans";
201                        var description:TextField = new TextField();
202                        description.name = "description";
203                        //description.autoSize = TextFieldAutoSize.LEFT;
204                        description.wordWrap = true;
205                        description.multiline = true;
206                        description.width= 290;
207                        description.height = back.height - 20;
208                        description.defaultTextFormat = descriptionTextFormat;
209                        addElement(description, btn, 86, 20);
210                       
211                        var duration:TextField = new TextField();
212                        duration.name = "duration";
213                        duration.width = 40;
214                        duration.height = 20;
215                        addElement(duration, btn, 335, 4);
216                       
217                        backOver.width = btn.width;                     
218                        back.width = btn.width;
219                       
220                        return btn;
221                }
222               
223                private function addElement(doc:DisplayObject, parent:DisplayObjectContainer = null, x:Number = 0, y:Number = 0):void {
224                        if (!parent) {
225                                parent = this;
226                        }
227                        parent.addChild(doc);
228                        doc.x = x;
229                        doc.y = y;
230                }
231               
232               
233                /** Handle a button rollover. **/
234                private function overHandler(evt:MouseEvent):void {
235                        var idx:Number = Number(evt.target.name);
236                        if (front && back) {
237                                for (var itm:String in _player.playlist.getItemAt(idx)) {
238                                        if (getButton(idx).getChildByName(itm) && getButton(idx).getChildByName(itm) is TextField) {
239                                                (getButton(idx).getChildByName(itm) as TextField).textColor = back.color;
240                                        }
241                                }
242                                if (_player.skin is SWFSkin) {
243                                        getButton(idx).getChildByName("back").transform.colorTransform = light;
244                                } else {
245                                        getButton(idx).setChildIndex(getButton(idx).getChildByName("back"), 0);
246                                        getButton(idx).setChildIndex(getButton(idx).getChildByName("backOver"), 1);
247                                }
248                        }
249                }
250               
251               
252                /** Handle a button rollover. **/
253                private function outHandler(evt:MouseEvent):void {
254                        var idx:Number = Number(evt.target.name);
255                        if (front && back) {
256                                for (var itm:String in _player.playlist.getItemAt(idx)) {
257                                        if (getButton(idx).getChildByName(itm) && getButton(idx).getChildByName(itm) is TextField) {
258                                                if (idx == active) {
259                                                        (getButton(idx).getChildByName(itm) as TextField).textColor = light.color;
260                                                } else {
261                                                        (getButton(idx).getChildByName(itm) as TextField).textColor = front.color;
262                                                }
263                                        }
264                                }
265                                if (_player.skin is SWFSkin) {
266                                        getButton(idx).getChildByName("back").transform.colorTransform = back;
267                                } else {
268                                        getButton(idx).setChildIndex(getButton(idx).getChildByName("backOver"), 0);
269                                        getButton(idx).setChildIndex(getButton(idx).getChildByName("back"), 1);
270                                }
271                        }
272                }
273               
274               
275                /** Setup all buttons in the playlist **/
276                private function buildPlaylist(clr:Boolean):void {
277                        if (!_player.playlist || player.playlist.length < 1) {
278                                return;
279                        }
280                        var wid:Number = getConfigParam("width");
281                        var hei:Number = getConfigParam("height");
282                        listmask.height = hei;
283                        listmask.width = wid;
284                        proportion = _player.playlist.length * buttonheight / hei;
285                        if (proportion > 1.01) {
286                                wid -= slider.width;
287                                buildSlider();
288                        } else {
289                                slider.visible = false;
290                        }
291                        if (clr) {
292                                list.y = listmask.y;
293                                for (var j:Number = 0; j < buttons.length; j++) {
294                                        list.removeChild(getButton(j));
295                                }
296                                buttons = new Array();
297                        } else {
298                                if (proportion > 1) {
299                                        scrollEase();
300                                }
301                        }
302                        for (var i:Number = 0; i < _player.playlist.length; i++) {
303                                if (clr) {
304                                        var btn:MovieClip;
305                                        if (_player.skin is SWFSkin) {
306                                                btn = Draw.clone(button, true) as MovieClip;
307                                        } else {
308                                                btn = buildButton();
309                                                list.addChild(btn);
310                                        }
311                                        var stc:Stacker = new Stacker(btn);
312                                        btn.y = i * buttonheight;
313                                        btn.buttonMode = true;
314                                        btn.mouseChildren = false;
315                                        btn.name = i.toString();
316                                        buttons.push({c: btn, s: stc});
317                                        setContents(i);
318                                }
319                                if (buttons[i]) {
320                                        (buttons[i].s as Stacker).rearrange(wid);
321                                }
322                        }
323                }
324               
325               
326                /** Setup the scrollbar component **/
327                private function buildSlider():void {
328                        slider.visible = true;
329                        slider.x = getConfigParam("width") - slider.width;
330                        var dif:Number = getConfigParam("height") - slider.height - slider.y;
331                        slider.getChildByName("back").height += dif;
332                        slider.getChildByName("rail").height += dif;
333                        slider.getChildByName("icon").height = Math.round(slider.getChildByName("rail").height / proportion);
334                }
335               
336               
337                /** Make sure the playlist is not out of range. **/
338                private function scrollEase(ips:Number = -1, cps:Number = -1):void {
339                        if (ips != -1) {
340                                slider.getChildByName("icon").y = Math.round(ips - (ips - slider.getChildByName("icon").y) / 1.5);
341                                list.y = Math.round((cps - (cps - list.y) / 1.5));
342                        }
343                        if (list.y > 0 || slider.getChildByName("icon").y < slider.getChildByName("rail").y) {
344                                list.y = listmask.y;
345                                slider.getChildByName("icon").y = slider.getChildByName("rail").y;
346                        } else if (list.y < listmask.height - list.height || slider.getChildByName("icon").y > slider.getChildByName("rail").y + slider.getChildByName("rail").height - slider.getChildByName("icon").height) {
347                                slider.getChildByName("icon").y = slider.getChildByName("rail").y + slider.getChildByName("rail").height - slider.getChildByName("icon").height;
348                                list.y = listmask.y + listmask.height - list.height;
349                        }
350                }
351               
352               
353                /** Scrolling handler. **/
354                private function scrollHandler():void {
355                        var yps:Number = slider.mouseY - slider.getChildByName("rail").y;
356                        var ips:Number = yps - slider.getChildByName("icon").height / 2;
357                        var cps:Number = listmask.y + listmask.height / 2 - proportion * yps;
358                        scrollEase(ips, cps);
359                }
360               
361               
362                /** Init the colors. **/
363                private function setColors():void {
364                        if (_player.config.backcolor) {
365                                back = new ColorTransform();
366                                back.color = _player.config.backcolor.color;
367                                if (_player.skin is SWFSkin) {
368                                        background.transform.colorTransform = back;
369                                        slider.getChildByName("back").transform.colorTransform = back;
370                                }
371                        }
372                        if (_player.config.frontcolor) {
373                                front = new ColorTransform();
374                                front.color = _player.config.frontcolor.color;
375                                try {
376                                        if (_player.skin is SWFSkin) {
377                                                slider.getChildByName("icon").transform.colorTransform = front;
378                                                slider.getChildByName("rail").transform.colorTransform = front;
379                                        }
380                                } catch (err:Error) {
381                                }
382                                if (_player.config.lightcolor) {
383                                        light = new ColorTransform();
384                                        light.color = _player.config.lightcolor.color;
385                                } else {
386                                        light = front;
387                                }
388                        }
389                }
390               
391               
392                /** Setup button elements **/
393                private function setContents(idx:Number):void {
394                        var playlistItem:PlaylistItem = _player.playlist.getItemAt(idx);
395                        var title:TextField = getButton(idx).getChildByName("title") as TextField;
396                        var description:TextField = getButton(idx).getChildByName("description") as TextField;
397                        var duration:TextField = getButton(idx).getChildByName("duration") as TextField;
398                        if (playlistItem.image) {
399                                if (getConfigParam('thumbs') != false && _player.config.playlist != 'none' && playlistItem.image) {
400                                        var img:Sprite = getButton(idx).getChildByName("image") as Sprite;
401                                        if (img) {
402                                                var msk:Sprite = Draw.rect(getButton(idx), '0xFF0000', img.width, img.height, img.x, img.y);
403                                                var ldr:Loader = new Loader();
404                                                img.mask = msk;
405                                                img.addChild(ldr);
406                                                ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderHandler);
407                                                if (playlistItem.image) {
408                                                        ldr.load(new URLRequest(playlistItem.image));
409                                                }
410                                        }
411                                }
412                        }
413                        if (playlistItem.duration) {
414                                if (playlistItem.duration > 0) {
415                                        duration.text = Strings.digits(playlistItem.duration);
416                                        if (front) {
417                                                duration.textColor = front.color;
418                                        }
419                                }
420                        }
421                        try {
422                                if (description) {
423                                        description.htmlText = playlistItem.description;
424                                }
425                                if (title) {
426                                        title.htmlText = "<b>" + playlistItem.title + "</b>";
427                                }
428                                if (front) {
429                                        description.textColor = front.color;
430                                        title.textColor = front.color;
431                                }
432                        } catch (e:Error) {
433                        }
434                        if (getButton(idx).getChildByName("image") && (!playlistItem.image || getConfigParam('thumbs') == false)) {
435                                getButton(idx).getChildByName("image").visible = false;
436                        }
437                        if (back && (_player.skin is SWFSkin)) {
438                                getButton(idx).getChildByName("back").transform.colorTransform = back;
439                        }
440                }
441               
442               
443                /** Loading of image completed; resume loading **/
444                private function loaderHandler(evt:Event):void {
445                        var ldr:Loader = Loader(evt.target.loader);
446                        Stretcher.stretch(ldr, image[0], image[1], Stretcher.FILL);
447                }
448               
449               
450                private function wheelHandler(evt:MouseEvent):void {
451                        //scrollEase(evt.delta * -1, getConfigParam("height"));
452                }
453               
454               
455                /** Start scrolling the playlist on mousedown. **/
456                private function sdownHandler(evt:MouseEvent):void {
457                        clearInterval(scrollInterval);
458                        RootReference.stage.addEventListener(MouseEvent.MOUSE_UP, supHandler);
459                        scrollHandler();
460                        scrollInterval = setInterval(scrollHandler, 50);
461                }
462               
463               
464                /** Revert the highlight on mouseout. **/
465                private function soutHandler(evt:MouseEvent):void {
466                        if (front && (_player.skin is SWFSkin)) {
467                                slider.getChildByName("icon").transform.colorTransform = front;
468                        } else {
469                                //slider.getChildByName("icon").gotoAndStop('out');
470                        }
471                }
472               
473               
474                /** Highlight the icon on rollover. **/
475                private function soverHandler(evt:MouseEvent):void {
476                        if (front && (_player.skin is SWFSkin)) {
477                                slider.getChildByName("icon").transform.colorTransform = light;
478                        } else {
479                                //slider.getChildByName("icon").gotoAndStop('over');
480                        }
481                }
482               
483               
484                /** Stop scrolling the playlist on mouseout. **/
485                private function supHandler(evt:MouseEvent):void {
486                        clearInterval(scrollInterval);
487                        RootReference.stage.removeEventListener(MouseEvent.MOUSE_UP, supHandler);
488                }
489               
490               
491                /** Handle a click on a button. **/
492                private function clickHandler(evt:MouseEvent):void {
493                        _player.playlistItem(Number(evt.target.name));
494                }
495               
496               
497                /** Process resizing requests **/
498                public function resize(width:Number, height:Number):void {
499                        x = 0;
500                        y = 0;
501                        setConfigParam("width", width);
502                        setConfigParam("height", height);
503                        background.width = width;
504                        background.height = height;
505                        buildPlaylist(false);
506                        if (PlayerLayoutManager.testPosition(getConfigParam('position'))) {
507                                visible = true;
508                        } else if (getConfigParam('position') == "over") {
509                                stateHandler();
510                        } else {
511                                visible = false;
512                        }
513                        if (visible && getConfigParam('visible') === false) {
514                                visible = false;
515                        }
516                }
517               
518               
519                /** Switch the currently active item */
520                protected function itemHandler(evt:PlaylistEvent = null):void {
521                        var idx:Number = _player.playlist.currentIndex;
522                        clearInterval(scrollInterval);
523                        if (proportion > 1.01) {
524                                scrollInterval = setInterval(scrollEase, 50, idx * buttonheight / proportion, -idx * buttonheight + listmask.y);
525                        }
526                        if (light) {
527                                for (var itm:String in _player.playlist.getItemAt(idx)) {
528                                        if (getButton(idx).getChildByName(itm)) {
529                                                try {
530                                                        (getButton(idx).getChildByName(itm) as TextField).textColor = light.color;
531                                                } catch (err:Error) {
532                                                }
533                                        }
534                                }
535                        }
536                        if (back && (_player.skin is SWFSkin)) {
537                                getButton(idx).getChildByName("back").transform.colorTransform = back;
538                        }
539                        if (!isNaN(active)) {
540                                if (front) {
541                                        for (var act:String in _player.playlist.getItemAt(active)) {
542                                                if (getButton(active).getChildByName(act)) {
543                                                        try {
544                                                                (getButton(active).getChildByName(act) as TextField).textColor = front.color;
545                                                        } catch (err:Error) {
546                                                        }
547                                                }
548                                        }
549                                }
550                        }
551                        active = idx;
552                }
553               
554               
555                /** New playlist loaded: rebuild the playclip. **/
556                protected function playlistHandler(evt:PlaylistEvent = null):void {
557                        clearInterval(scrollInterval);
558                        active = undefined;
559                        buildPlaylist(true);
560                        resize(width, height);
561                }
562               
563               
564                /** Process state changes **/
565                protected function stateHandler(evt:PlayerStateEvent = null):void {
566                        if (getConfigParam('position') == "over") {
567                                if (player.state == PlayerState.PLAYING || player.state == PlayerState.PAUSED || player.state == PlayerState.BUFFERING) {
568                                        visible = false;
569                                } else {
570                                        visible = true;
571                                }
572                        }
573                }
574               
575               
576                private function getButton(id:Number):Sprite {
577                        return buttons[id].c as Sprite;
578                }
579        }
580}
581
Note: See TracBrowser for help on using the repository browser.