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

Revision 1009, 26.7 KB checked in by pablo, 3 years ago (diff)

Vertical endcaps for PNG skinned playlists (785)

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.events.ViewEvent;
5        import com.longtailvideo.jwplayer.model.Color;
6        import com.longtailvideo.jwplayer.model.PlaylistItem;
7        import com.longtailvideo.jwplayer.player.IPlayer;
8        import com.longtailvideo.jwplayer.player.PlayerState;
9        import com.longtailvideo.jwplayer.utils.Draw;
10        import com.longtailvideo.jwplayer.utils.Logger;
11        import com.longtailvideo.jwplayer.utils.RootReference;
12        import com.longtailvideo.jwplayer.utils.Stacker;
13        import com.longtailvideo.jwplayer.utils.Stretcher;
14        import com.longtailvideo.jwplayer.utils.Strings;
15        import com.longtailvideo.jwplayer.view.PlayerLayoutManager;
16        import com.longtailvideo.jwplayer.view.interfaces.IPlaylistComponent;
17        import com.longtailvideo.jwplayer.view.interfaces.ISkin;
18        import com.longtailvideo.jwplayer.view.skins.DefaultSkin;
19        import com.longtailvideo.jwplayer.view.skins.PNGSkin;
20        import com.longtailvideo.jwplayer.view.skins.SWFSkin;
21       
22        import flash.display.Bitmap;
23        import flash.display.DisplayObject;
24        import flash.display.DisplayObjectContainer;
25        import flash.display.Loader;
26        import flash.display.LoaderInfo;
27        import flash.display.MovieClip;
28        import flash.display.Sprite;
29        import flash.events.Event;
30        import flash.events.IOErrorEvent;
31        import flash.events.MouseEvent;
32        import flash.geom.ColorTransform;
33        import flash.geom.Rectangle;
34        import flash.net.URLRequest;
35        import flash.system.LoaderContext;
36        import flash.text.TextField;
37        import flash.text.TextFormat;
38        import flash.utils.Dictionary;
39        import flash.utils.clearInterval;
40        import flash.utils.setInterval;
41       
42       
43        public class PlaylistComponent extends CoreComponent implements IPlaylistComponent {
44                /** Array with all button instances **/
45                private var buttons:Array;
46                /** Height of a button (to calculate scrolling) **/
47                private var buttonheight:Number;
48                /** Currently active button. **/
49                private var active:Number;
50                /** Proportion between clip and mask. **/
51                private var proportion:Number;
52                /** Interval ID for scrolling **/
53                private var scrollInterval:Number;
54                /** Image dimensions. **/
55                private var image:Array;
56                /** Color object for backcolor. **/
57                private var back:ColorTransform;
58                /** Color object for frontcolor. **/
59                private var front:ColorTransform;
60                /** Color object for lightcolor. **/
61                private var light:ColorTransform;
62                /** Visual representation of a the playlist **/
63                private var list:Sprite;
64                /** Visual representation of a playlist item **/
65                private var button:Sprite;
66                /** The playlist mask **/
67                private var listmask:Sprite;
68                /** The playlist slider **/
69                private var slider:Sprite;
70                /** The playlist background **/
71                private var background:Sprite;
72                /** Internal reference to the skin **/
73                private var skin:ISkin;
74                private var skinLoaded:Boolean = false;
75                private var pendingResize:Rectangle;
76                private var pendingBuild:Boolean = false;
77                /** Map of images and loaders **/
78                private var imageLoaderMap:Dictionary;
79                /** Which field element can be colorized **/           
80                private var colorizableFields:Array = ["title", "duration", "description", "author", "tags"];
81               
82                public function PlaylistComponent(player:IPlayer) {
83                        super(player, "playlist");
84                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, itemHandler);
85                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, playlistHandler);
86                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_UPDATED, playlistHandler);
87                        player.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler);
88                       
89                        if (_player.skin is SWFSkin && !_player.skin.hasComponent('playlist')) {
90                                var defaultSkin:DefaultSkin = new DefaultSkin();
91                                defaultSkin.addEventListener(Event.COMPLETE, continueSetup);
92                                skin = defaultSkin;
93                                defaultSkin.load();
94                        } else {
95                                skinLoaded = true;
96                                skin = _player.skin;
97                                continueSetup();
98                        }
99                }
100               
101                protected function continueSetup(evt:Event=null):void {
102                        skinLoaded = true;
103                       
104                        background = getSkinElement("background") as Sprite;
105                        if (!background) {
106                                var backColor:Color = getConfigParam("backgroundcolor") ? new Color(String(getConfigParam("backgroundcolor"))) : player.config.screencolor;
107                                background = new Sprite();
108                                background.name = "background";
109                                background.graphics.beginFill(backColor ? backColor.color : 0, 1);
110                                background.graphics.drawRect(0, 0, 1, 1);
111                                background.graphics.endFill();
112                        }
113                        addElement(background);
114                       
115                        slider = buildSlider();
116                        slider.buttonMode = true;
117                        slider.mouseChildren = false;
118                        slider.addEventListener(MouseEvent.MOUSE_DOWN, sdownHandler);
119                        slider.addEventListener(MouseEvent.MOUSE_OVER, soverHandler);
120                        slider.addEventListener(MouseEvent.MOUSE_OUT, soutHandler);
121                        slider.visible = false;
122                        addElement(slider);
123                       
124                        listmask = getSkinElement("masker") as Sprite;
125                        if (!listmask) {
126                                listmask = new Sprite();
127                                listmask.graphics.beginFill(0xff0000, 1);
128                                listmask.graphics.drawRect(0, 0, 1, 1);
129                                listmask.graphics.endFill();
130                        }
131                        addElement(listmask);
132                       
133                        list = getSkinElement("list") as Sprite;
134                        if (!list) {
135                                list = new Sprite();
136                                button = buildButton() as Sprite;
137                                addElement(button, list);
138                        } else {
139                                button = list.getChildByName("button") as Sprite;
140                        }
141                        buttonheight = button.height;
142                        button.visible = false;
143                        list.mask = listmask;
144                        list.addEventListener(MouseEvent.CLICK, clickHandler);
145                        list.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
146                        list.addEventListener(MouseEvent.MOUSE_OUT, outHandler);
147                        addElement(list);
148                       
149                        buttons = new Array();
150                        this.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);
151                        try {
152                                image = new Array(button.getChildByName("image").width, button.getChildByName("image").height);
153                        } catch (err:Error) {
154                        }
155                        if (button.getChildByName("back")) {
156                                setColors();
157                        }
158                        if (pendingBuild) {
159                                buildPlaylist(true);
160                        }
161                        if (pendingResize) {
162                                resize(pendingResize.width, pendingResize.height);
163                        }
164                }
165               
166                private function buildSlider():Sprite {
167                        var newSlider:Sprite = getSkinElement("slider") as Sprite;
168
169                        if (!newSlider) {
170                                newSlider = new Sprite();
171                                var sliderBack:Sprite = buildSliderElement('back', 'sliderBackground', 1, 1);
172                                addElement(sliderBack, newSlider);
173                               
174                                var sliderRail:Sprite = buildSliderElement('rail', 'sliderRail', 7, 22);
175                                addElement(sliderRail, newSlider);
176                               
177                                var sliderThumb:Sprite = buildSliderElement('icon', 'sliderThumb', 5, 54);
178                                addElement(sliderThumb, newSlider, (sliderRail.width - sliderThumb.width) / 2);
179                        }
180
181                        /* These elements were never included in the swf skins, so add them even if the slider was in a SWF skin */
182                       
183                        var sliderCapTop:Sprite = buildSliderElement('captop', 'sliderCapTop');
184                        addElement(sliderCapTop, newSlider);
185
186                        var sliderCapBottom:Sprite = buildSliderElement('capbottom', 'sliderCapBottom');
187                        addElement(sliderCapBottom, newSlider);
188                       
189                        return newSlider;
190                }
191               
192                private function buildSliderElement(name:String, skinElementName:String, width:Number=0, height:Number=0):Sprite {
193                        var newElement:Sprite = getSkinElement(skinElementName) as Sprite;
194                        if (!newElement) {
195                                newElement = new Sprite();
196                                if (width * height > 0) {
197                                        newElement.graphics.beginFill(0, 1);
198                                        newElement.graphics.drawRect(0, 0, width, height);
199                                        newElement.graphics.endFill();
200                                }
201                        }
202                        try {
203                                newElement.name = name;
204                        } catch(e:Error) {} //This is not possible if the element was created and named from an FLA
205                       
206                        return newElement;
207                }
208               
209               
210                private function buildButton():MovieClip {
211                        var btn:MovieClip = new MovieClip();
212                       
213                        var backActive:Sprite = getSkinElement("itemActive") as Sprite;
214                        if (!backActive) {
215                                backActive = new Sprite();
216                        }
217                        backActive.name = "backActive";
218                        addElement(backActive, btn, 0, 0);
219
220                        var backOver:Sprite = getSkinElement("itemOver") as Sprite;
221                        if (!backOver) {
222                                backOver = new Sprite();
223                                backOver.graphics.beginFill(0, 1);
224                                backOver.graphics.drawRect(0, 0, 1, 1);
225                                backOver.graphics.endFill();
226                        }
227                        backOver.name = "backOver";
228                        addElement(backOver, btn, 0, 0);
229                       
230                        var back:Sprite = getSkinElement("item") as Sprite;
231                        if (!back) {
232                                back = new Sprite();
233                                back.graphics.beginFill(0, 1);
234                                back.graphics.drawRect(0, 0, 100, 100);
235                                back.graphics.endFill();
236                        }
237                        back.name = "back";
238                        addElement(back, btn, 0, 0);
239                       
240                        var img:Sprite = new Sprite();
241                        img.name = "image";
242                        img.graphics.beginFill(0, 1);
243                        img.graphics.drawRect(0, 0, 80, back.height);
244                        img.graphics.endFill();
245                        addElement(img, btn, 0, 0);
246                       
247                        var titleTextFormat:TextFormat = new TextFormat();
248                        titleTextFormat.size = fontSize ? fontSize : 13;
249                        titleTextFormat.font = fontFace ? fontFace : "_sans";
250                        titleTextFormat.bold = (!fontWeight || fontWeight == "bold");
251                        titleTextFormat.italic = (fontStyle == "italic");
252                        var title:TextField = new TextField();
253                        title.name = "title";
254                        //title.autoSize = TextFieldAutoSize.LEFT;
255                        title.defaultTextFormat = titleTextFormat;
256                        title.wordWrap = true;
257                        title.multiline = true;
258                        title.width = 250;
259                        title.height = 20;
260                        addElement(title, btn, 85, 2);
261                       
262                        var descriptionTextFormat:TextFormat = new TextFormat();
263                        descriptionTextFormat.size = fontSize ? fontSize : 11;
264                        descriptionTextFormat.font = fontFace ? fontFace : "_sans";
265                        descriptionTextFormat.bold = (fontWeight == "bold");
266                        descriptionTextFormat.italic = (fontStyle == "italic");
267                        var description:TextField = new TextField();
268                        description.name = "description";
269                        //description.autoSize = TextFieldAutoSize.LEFT;
270                        description.wordWrap = true;
271                        description.multiline = true;
272                        description.width= 290;
273                        description.height = back.height - 20;
274                        description.defaultTextFormat = descriptionTextFormat;
275                        addElement(description, btn, 86, 20);
276                       
277                        var duration:TextField = new TextField();
278                        duration.name = "duration";
279                        duration.width = 40;
280                        duration.height = 20;
281                        titleTextFormat.size = fontSize ? fontSize : 11;
282                        duration.defaultTextFormat = titleTextFormat;
283                        addElement(duration, btn, 335, 4);
284                       
285                        backOver.width = backActive.width = back.width = btn.width;                     
286                       
287                        return btn;
288                }
289               
290                private function addElement(doc:DisplayObject, parent:DisplayObjectContainer = null, x:Number = 0, y:Number = 0):void {
291                        if (!parent) {
292                                parent = this;
293                        }
294                        doc.x = x;
295                        parent.addChild(doc);
296                        doc.y = y;
297                }
298               
299                private function get overColor():Color {
300                        return getConfigParam("overcolor") ? new Color(String(getConfigParam("overcolor"))) : null;
301                }
302               
303                private function get activeColor():Color {
304                        return getConfigParam("activecolor") ? new Color(String(getConfigParam("activecolor"))) : null;
305                }
306               
307                /** Handle a button rollover. **/
308                private function overHandler(evt:MouseEvent):void {
309                        var idx:Number = Number(evt.target.name);
310
311                        if (fontColor && overColor) {
312                                for each (var itm:String in colorizableFields) {
313                                        if (getButton(idx).getChildByName(itm) && getButton(idx).getChildByName(itm) is TextField) {
314                                                (getButton(idx).getChildByName(itm) as TextField).textColor = overColor.color;
315                                        }
316                                }
317                        } else if (front && back) {
318                                for each (itm in colorizableFields) {
319                                        if (getButton(idx).getChildByName(itm) && getButton(idx).getChildByName(itm) is TextField) {
320                                                (getButton(idx).getChildByName(itm) as TextField).textColor = back.color;
321                                        }
322                                }
323                        }
324                        if (swfSkinned) {
325                                if (light) {
326                                        getButton(idx).getChildByName("back").transform.colorTransform = light;
327                                }
328                        } else {
329                                getButton(idx).setChildIndex(getButton(idx).getChildByName("backActive"), 0);
330                                getButton(idx).setChildIndex(getButton(idx).getChildByName("back"), 1);
331                                getButton(idx).setChildIndex(getButton(idx).getChildByName("backOver"), 2);
332                        }
333                }
334               
335               
336                /** Handle a button rollover. **/
337                private function outHandler(evt:MouseEvent):void {
338                        var idx:Number = Number(evt.target.name);
339                        for each (var itm:String in colorizableFields) {
340                                var button:Sprite = getButton(idx);
341                                if (button && button.getChildByName(itm)) {
342                                        var field:TextField = (getButton(idx).getChildByName(itm) as TextField)
343                                        if (field) {
344                                                if (idx == active && ((activeColor && fontColor) || light)) {
345                                                        field.textColor = activeColor ? activeColor.color : (fontColor ? fontColor.color : light.color);
346                                                } else {
347                                                        if (fontColor && overColor) {
348                                                                field.textColor =  fontColor.color;
349                                                        } else if (front && back) {
350                                                                field.textColor =  front.color;
351                                                        }
352                                                }
353                                        }
354                                       
355                                        if (front && back) {
356                                                if (swfSkinned) {
357                                                        button.getChildByName("back").transform.colorTransform = back;
358                                                } else {
359                                                        button.setChildIndex(getButton(idx).getChildByName("backActive"), (idx == active ? 2 : 0));
360                                                        button.setChildIndex(getButton(idx).getChildByName("back"), 1);
361                                                        button.setChildIndex(getButton(idx).getChildByName("backOver"), 0);
362                                                }
363                                        }
364                                }
365                        }
366                       
367                }
368               
369               
370                /** Setup all buttons in the playlist **/
371                private function buildPlaylist(clr:Boolean):void {
372                        if (!_player.playlist || player.playlist.length < 1) {
373                                return;
374                        }
375                        if (!skinLoaded) {
376                                pendingBuild = true;
377                                return
378                        }
379
380                        var wid:Number = getConfigParam("width");
381                        var hei:Number = getConfigParam("height");
382                        listmask.height = hei;
383                        listmask.width = wid;
384                        proportion = _player.playlist.length * buttonheight / hei;
385                        if (proportion > 1.01) {
386                                wid -= slider.width;
387                                layoutSlider();
388                        } else {
389                                slider.visible = false;
390                        }
391                        if (clr) {
392                                list.y = listmask.y;
393                                for (var j:Number = 0; j < buttons.length; j++) {
394                                        list.removeChild(getButton(j));
395                                }
396                                buttons = new Array();
397                                imageLoaderMap = new Dictionary();
398                        } else {
399                                if (proportion > 1) {
400                                        scrollEase();
401                                }
402                        }
403                        for (var i:Number = 0; i < _player.playlist.length; i++) {
404                                if (clr) {
405                                        var btn:MovieClip;
406                                        if (swfSkinned) {
407                                                btn = Draw.clone(button, true) as MovieClip;
408                                        } else {
409                                                btn = buildButton();
410                                                list.addChild(btn);
411                                        }
412                                        var stc:Stacker = new Stacker(btn);
413                                        btn.y = i * buttonheight;
414                                        btn.buttonMode = true;
415                                        btn.mouseChildren = false;
416                                        btn.name = i.toString();
417                                        buttons.push({c: btn, s: stc});
418                                        setContents(i);
419                                }
420                                if (buttons[i]) {
421                                        (buttons[i].s as Stacker).rearrange(wid);
422                                }
423                        }
424                }
425               
426               
427                /** Setup the scrollbar component **/
428                private function layoutSlider():void {
429                        slider.visible = true;
430                        slider.x = getConfigParam("width") - slider.width;
431                        if (player.skin is PNGSkin) {
432                                var capTop:DisplayObject = slider.getChildByName("captop");
433                                var capBottom:DisplayObject = slider.getChildByName("capbottom");
434                                slider.getChildByName("back").y = capTop.height;
435                                slider.getChildByName("rail").y = capTop.height;
436                                slider.getChildByName("icon").y = capTop.height;
437                                slider.getChildByName("back").height = getConfigParam('height') - capBottom.height - capTop.height;
438                                slider.getChildByName("rail").height = getConfigParam('height') - capBottom.height - capTop.height;
439                                slider.getChildByName("icon").height = Math.round(slider.getChildByName("rail").height / proportion);
440                                capBottom.y = getConfigParam('height') - capBottom.height;
441                        } else {
442                                var dif:Number = getConfigParam("height") - slider.height - slider.y;
443                                slider.getChildByName("back").height += dif;
444                                slider.getChildByName("rail").height += dif;
445                                slider.getChildByName("icon").height = Math.round(slider.getChildByName("rail").height / proportion);
446                        }
447                }
448               
449               
450                /** Make sure the playlist is not out of range. **/
451                private function scrollEase(ips:Number = -1, cps:Number = -1):void {
452                        if (ips != -1) {
453                                slider.getChildByName("icon").y = Math.round(ips - (ips - slider.getChildByName("icon").y) / 1.5);
454                                list.y = Math.round((cps - (cps - list.y) / 1.5));
455                        }
456                        if (list.y > 0 || slider.getChildByName("icon").y < slider.getChildByName("rail").y) {
457                                list.y = listmask.y;
458                                slider.getChildByName("icon").y = slider.getChildByName("rail").y;
459                        } else if (list.y < listmask.height - list.height || slider.getChildByName("icon").y > slider.getChildByName("rail").y + slider.getChildByName("rail").height - slider.getChildByName("icon").height) {
460                                slider.getChildByName("icon").y = slider.getChildByName("rail").y + slider.getChildByName("rail").height - slider.getChildByName("icon").height;
461                                list.y = listmask.y + listmask.height - list.height;
462                        }
463                }
464               
465               
466                /** Scrolling handler. **/
467                private function scrollHandler():void {
468                        var yps:Number = slider.mouseY - slider.getChildByName("rail").y;
469                        var ips:Number = yps - slider.getChildByName("icon").height / 2;
470                        var cps:Number = listmask.y + listmask.height / 2 - proportion * yps;
471                        scrollEase(ips, cps);
472                }
473               
474               
475                /** Init the colors. **/
476                private function setColors():void {
477                        if (_player.config.backcolor) {
478                                back = new ColorTransform();
479                                back.color = _player.config.backcolor.color;
480                                if (swfSkinned) {
481                                        background.transform.colorTransform = back;
482                                        slider.getChildByName("back").transform.colorTransform = back;
483                                }
484                        }
485                        if (_player.config.frontcolor) {
486                                front = new ColorTransform();
487                                front.color = _player.config.frontcolor.color;
488                                try {
489                                        if (swfSkinned) {
490                                                slider.getChildByName("icon").transform.colorTransform = front;
491                                                slider.getChildByName("rail").transform.colorTransform = front;
492                                        }
493                                } catch (err:Error) {
494                                }
495                                if (_player.config.lightcolor && swfSkinned) {
496                                        light = new ColorTransform();
497                                        light.color = _player.config.lightcolor.color;
498                                } else {
499                                        light = front;
500                                }
501                        }
502                }
503               
504               
505                /** Setup button elements **/
506                private function setContents(idx:Number):void {
507                        var playlistItem:PlaylistItem = _player.playlist.getItemAt(idx);
508                        var title:TextField = getButton(idx).getChildByName("title") as TextField;
509                        var description:TextField = getButton(idx).getChildByName("description") as TextField;
510                        var duration:TextField = getButton(idx).getChildByName("duration") as TextField;
511                        var author:TextField = getButton(idx).getChildByName("author") as TextField;
512                        var tags:TextField = getButton(idx).getChildByName("tags") as TextField;
513                        if (playlistItem.image || playlistItem['playlist.image']) {
514                                var imageFile:String = playlistItem['playlist.image'] ? playlistItem['playlist.image'] : playlistItem.image;
515                                if (getConfigParam('thumbs') != false && _player.config.playlist != 'none') {
516                                        var img:Sprite = getButton(idx).getChildByName("image") as Sprite;
517                                        if (img) {
518                                                img.alpha = 0;
519                                                var ldr:Loader = new Loader();
520                                                imageLoaderMap[ldr] = idx;
521                                                ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderHandler);
522                                                ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
523                                                ldr.load(new URLRequest(encodeURI(imageFile)), new LoaderContext(true));
524                                        }
525                                }
526                        }
527                        if (duration && playlistItem.duration) {
528                                if (playlistItem.duration > 0) {
529                                        duration.text = Strings.digits(playlistItem.duration);
530                                        if (fontColor) {
531                                                duration.textColor = fontColor.color;
532                                        } else if (front) {
533                                                duration.textColor = front.color;
534                                        }
535                                }
536                        }
537                        try {
538                                if (description) {
539                                        description.htmlText = playlistItem.description;
540                                }
541                                if (title) {
542                                        title.htmlText = "<b>" + playlistItem.title + "</b>";
543                                }
544                                if (author) {
545                                        author.htmlText = playlistItem.author;
546                                }
547                                if (tags) {
548                                        tags.htmlText = playlistItem.tags;
549                                }
550                                if (fontColor) {
551                                        if (description) { description.textColor = fontColor.color; }
552                                        if (title) { title.textColor = fontColor.color; }
553                                } else if (front) {
554                                        if (description) { description.textColor = front.color; }
555                                        if (title) { title.textColor = front.color; }
556                                }
557                        } catch (e:Error) {
558                        }
559                        if (getButton(idx).getChildByName("image") && (!(playlistItem.image || playlistItem['playlist.image']) || getConfigParam('thumbs') == false)) {
560                                getButton(idx).getChildByName("image").visible = false;
561                        }
562                        if (back && swfSkinned) {
563                                getButton(idx).getChildByName("back").transform.colorTransform = back;
564                        }
565                }
566               
567               
568                /** Loading of image completed; resume loading **/
569                private function loaderHandler(evt:Event):void {
570                        try {
571                                var ldr:Loader = (evt.target as LoaderInfo).loader;
572                                if (ldr in imageLoaderMap) {
573                                        var button:Sprite = getButton(imageLoaderMap[ldr]);
574                                        delete imageLoaderMap[ldr];
575                                        var img:Sprite = button.getChildByName("image") as Sprite;
576                                        img.alpha = 1;
577                                        var msk:Sprite = Draw.rect(button, '0xFF0000', img.width, img.height, img.x, img.y);
578                                        img.mask = msk;
579                                        img.addChild(ldr);
580                                        try {
581                                                Draw.smooth(ldr.content as Bitmap);
582                                        } catch (e:Error) {
583                                                Logger.log('Could not smooth thumbnail image: ' + e.message);
584                                        }
585                                        Stretcher.stretch(ldr, image[0], image[1], Stretcher.FILL);
586                                }
587                        } catch (err:Error) {
588                                Logger.log('Error loading playlist image: '+err.message);
589                        }
590                }
591               
592               
593                /** Loading of image failed; hide image **/
594                private function errorHandler(evt:Event):void {
595                        try {
596                                var ldr:Loader = (evt.target as LoaderInfo).loader;
597                                var button:Sprite = getButton(imageLoaderMap[ldr]);
598                                var img:Sprite = button.getChildByName("image") as Sprite;
599                                img.visible = false;
600                                if (proportion > 1.01) {
601                                        (buttons[imageLoaderMap[ldr]].s as Stacker).rearrange(getConfigParam("width")-slider.width);
602                                } else {
603                                        (buttons[imageLoaderMap[ldr]].s as Stacker).rearrange(getConfigParam("width"));
604                                }
605                        } catch (err:Error) {
606                                Logger.log('Error loading playlist image '+ ldr.loaderInfo.url+': '+err.message);
607                        }
608                }
609               
610               
611                private function wheelHandler(evt:MouseEvent):void {
612                        //scrollEase(evt.delta * -1, getConfigParam("height"));
613                }
614               
615               
616                /** Start scrolling the playlist on mousedown. **/
617                private function sdownHandler(evt:MouseEvent):void {
618                        clearInterval(scrollInterval);
619                        RootReference.stage.addEventListener(MouseEvent.MOUSE_UP, supHandler);
620                        scrollHandler();
621                        scrollInterval = setInterval(scrollHandler, 50);
622                }
623               
624               
625                /** Revert the highlight on mouseout. **/
626                private function soutHandler(evt:MouseEvent):void {
627                        if (front && swfSkinned) {
628                                slider.getChildByName("icon").transform.colorTransform = front;
629                        } else {
630                                //slider.getChildByName("icon").gotoAndStop('out');
631                        }
632                }
633               
634               
635                /** Highlight the icon on rollover. **/
636                private function soverHandler(evt:MouseEvent):void {
637                        if (front && swfSkinned) {
638                                slider.getChildByName("icon").transform.colorTransform = light;
639                        } else {
640                                //slider.getChildByName("icon").gotoAndStop('over');
641                        }
642                }
643               
644               
645                /** Stop scrolling the playlist on mouseout. **/
646                private function supHandler(evt:MouseEvent):void {
647                        clearInterval(scrollInterval);
648                        RootReference.stage.removeEventListener(MouseEvent.MOUSE_UP, supHandler);
649                }
650               
651               
652                /** Handle a click on a button. **/
653                private function clickHandler(evt:MouseEvent):void {
654                        var itemNumber:Number = Number(evt.target.name);
655                        dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_ITEM, itemNumber));
656                        _player.playlistItem(itemNumber);
657                }
658               
659               
660                /** Process resizing requests **/
661                public function resize(width:Number, height:Number):void {
662                        if (skinLoaded) {
663                                setConfigParam("width", width);
664                                setConfigParam("height", height);
665                                background.width = width;
666                                background.height = height;
667                                buildPlaylist(false);
668                                if (PlayerLayoutManager.testPosition(getConfigParam('position'))) {
669                                        visible = true;
670                                } else if (getConfigParam('position') == "over") {
671                                        stateHandler();
672                                } else {
673                                        visible = false;
674                                }
675                                if (visible && getConfigParam('visible') === false) {
676                                        visible = false;
677                                }
678                        } else {
679                                pendingResize = new Rectangle(0,0,width,height);
680                        }
681                }
682               
683               
684                /** Switch the currently active item */
685                protected function itemHandler(evt:PlaylistEvent = null):void {
686                        var idx:Number = _player.playlist.currentIndex;
687                        clearInterval(scrollInterval);
688                        if (proportion > 1.01) {
689                                scrollInterval = setInterval(scrollEase, 50, idx * buttonheight / proportion, -idx * buttonheight + listmask.y);
690                        }
691                        if (light || activeColor) {
692                                for each (var itm:String in colorizableFields) {
693                                        if (getButton(idx).getChildByName(itm)) {
694                                                try {
695                                                        (getButton(idx).getChildByName(itm) as TextField).textColor = activeColor ? activeColor.color : light.color;
696                                                } catch (err:Error) {
697                                                }
698                                        }
699                                }
700                        }
701                        if (!isNaN(active)) {
702                                if (front || fontColor) {
703                                        for each (var act:String in colorizableFields) {
704                                                if (getButton(active).getChildByName(act)) {
705                                                        try {
706                                                                (getButton(active).getChildByName(act) as TextField).textColor = fontColor ? fontColor.color : front.color;
707                                                        } catch (err:Error) {
708                                                        }
709                                                }
710                                        }
711                                }
712
713                                if (swfSkinned) {
714                                        if (back) {
715                                                getButton(idx).getChildByName("back").transform.colorTransform = back;
716                                        }
717                                } else {
718                                        getButton(active).setChildIndex(getButton(active).getChildByName("back"), 2);
719                                        getButton(active).setChildIndex(getButton(active).getChildByName("backOver"), 1);
720                                        getButton(active).setChildIndex(getButton(active).getChildByName("backActive"), 0);
721                                }
722                        }
723                        active = idx;
724
725                        if (swfSkinned) {
726                               
727                        } else {
728                                getButton(active).setChildIndex(getButton(active).getChildByName("backActive"), 2);
729                                getButton(active).setChildIndex(getButton(active).getChildByName("back"), 1);
730                                getButton(active).setChildIndex(getButton(active).getChildByName("backOver"), 0);
731                        }
732                       
733                       
734
735                }
736               
737               
738                /** New playlist loaded: rebuild the playclip. **/
739                protected function playlistHandler(evt:PlaylistEvent = null):void {
740                        clearInterval(scrollInterval);
741                        active = undefined;
742                        buildPlaylist(true);
743                        if (background) {
744                                resize(background.width, background.height);
745                        }
746                }
747               
748               
749                /** Process state changes **/
750                protected function stateHandler(evt:PlayerStateEvent = null):void {
751                        if (getConfigParam('position') == "over") {
752                                if (player.state == PlayerState.PLAYING || player.state == PlayerState.PAUSED || player.state == PlayerState.BUFFERING) {
753                                        visible = false;
754                                } else {
755                                        visible = true;
756                                }
757                        }
758                }
759               
760               
761                private function getButton(id:Number):Sprite {
762                        return buttons[id].c as Sprite;
763                }
764               
765                private function get swfSkinned():Boolean {
766                        if (skin is SWFSkin) {
767                                return (skin.hasComponent('playlist'));
768                        }
769                        return false;
770                }
771               
772                protected override function getSkinElement(element:String):DisplayObject {
773                        return skin.getSkinElement(_name,element);
774                }
775               
776        }
777}
778
Note: See TracBrowser for help on using the repository browser.