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

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