source: trunk/fl5/src/com/longtailvideo/jwplayer/view/components/ControlbarComponent.as @ 1282

Revision 1282, 24.9 KB checked in by pablo, 3 years ago (diff)
  • Returns some missing accessibility features - tabbing buttons, accessibility naming - into PNG-skinned players (1047)
  • Fixes player config issue for v4 plugins (1043)
  • Addresses an issue where a closed NetConnection in RTMP doesn't halt the player
Line 
1package com.longtailvideo.jwplayer.view.components {
2        import com.longtailvideo.jwplayer.events.MediaEvent;
3        import com.longtailvideo.jwplayer.events.PlayerEvent;
4        import com.longtailvideo.jwplayer.events.PlayerStateEvent;
5        import com.longtailvideo.jwplayer.events.PlaylistEvent;
6        import com.longtailvideo.jwplayer.events.ViewEvent;
7        import com.longtailvideo.jwplayer.model.Color;
8        import com.longtailvideo.jwplayer.player.IPlayer;
9        import com.longtailvideo.jwplayer.player.PlayerState;
10        import com.longtailvideo.jwplayer.plugins.PluginConfig;
11        import com.longtailvideo.jwplayer.utils.Animations;
12        import com.longtailvideo.jwplayer.utils.Logger;
13        import com.longtailvideo.jwplayer.utils.RootReference;
14        import com.longtailvideo.jwplayer.utils.Strings;
15        import com.longtailvideo.jwplayer.view.interfaces.IControlbarComponent;
16       
17        import flash.accessibility.AccessibilityProperties;
18        import flash.display.DisplayObject;
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.text.StyleSheet;
25        import flash.text.TextField;
26        import flash.text.TextFieldAutoSize;
27        import flash.text.TextFormat;
28        import flash.ui.Mouse;
29        import flash.utils.clearTimeout;
30        import flash.utils.setTimeout;
31
32
33        /**
34         * Sent when the user interface requests that the player play the currently loaded media
35         *
36         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_PLAY
37         */
38        [Event(name="jwPlayerViewPlay", type="com.longtailvideo.jwplayer.events.ViewEvent")]
39        /**
40         * Sent when the user interface requests that the player pause the currently playing media
41         *
42         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_PAUSE
43         */
44        [Event(name="jwPlayerViewPause", type="com.longtailvideo.jwplayer.events.ViewEvent")]
45        /**
46         * Sent when the user interface requests that the player stop the currently playing media
47         *
48         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_STOP
49         */
50        [Event(name="jwPlayerViewStop", type="com.longtailvideo.jwplayer.events.ViewEvent")]
51        /**
52         * Sent when the user interface requests that the player play the next item in its playlist
53         *
54         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_NEXT
55         */
56        [Event(name="jwPlayerViewNext", type="com.longtailvideo.jwplayer.events.ViewEvent")]
57        /**
58         * Sent when the user interface requests that the player play the previous item in its playlist
59         *
60         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_PREV
61         */
62        [Event(name="jwPlayerViewPrev", type="com.longtailvideo.jwplayer.events.ViewEvent")]
63        /**
64         * Sent when the user interface requests that the player navigate to the playlist item's <code>link</code> property
65         *
66         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_LINK
67         */
68        [Event(name="jwPlayerViewLink", type="com.longtailvideo.jwplayer.events.ViewEvent")]
69        /**
70         *
71         *
72         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_MUTE
73         */
74        [Event(name="jwPlayerViewMute", type="com.longtailvideo.jwplayer.events.ViewEvent")]
75        /**
76         *
77         *
78         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_FULLSCREEN
79         */
80        [Event(name="jwPlayerViewFullscreen", type="com.longtailvideo.jwplayer.events.ViewEvent")]
81        /**
82         *
83         *
84         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_VOLUME
85         */
86        [Event(name="jwPlayerViewVolume", type="com.longtailvideo.jwplayer.events.ViewEvent")]
87        /**
88         *
89         *
90         * @eventType com.longtailvideo.jwplayer.events.ViewEvent.JWPLAYER_VIEW_SEEK
91         */
92        [Event(name="jwPlayerViewSeek", type="com.longtailvideo.jwplayer.events.ViewEvent")]
93        public class ControlbarComponent extends CoreComponent implements IControlbarComponent {
94                protected var _buttons:Object = {};
95                protected var _customButtons:Array = [];
96                protected var _removedButtons:Array = [];
97                protected var _dividers:Array;
98                protected var _dividerElements:Object;
99                protected var _defaultLayout:String = "[play|stop|prev|next|elapsed][time][duration|blank|fullscreen|mute volume]";
100                protected var _currentLayout:String;
101                protected var _layoutManager:ControlbarLayoutManager;
102                protected var _width:Number;
103                protected var _height:Number;
104                protected var _timeSlider:Slider;
105                protected var _volSlider:Slider;
106
107                protected var _bgColorSheet:Sprite;
108               
109                protected var _fullscreen:Boolean = false;
110               
111                protected var controlbarConfig:PluginConfig;
112                protected var animations:Animations;
113                protected var hiding:Number;
114               
115                public function ControlbarComponent(player:IPlayer) {
116                        super(player, "controlbar");
117                        controlbarConfig = _player.config.pluginConfig(_name);
118                        animations = new Animations(this);
119                        if (controlbarConfig['position'] == "over" && hideOnIdle) {
120                                alpha = 0;
121                        }
122                       
123                        _layoutManager = new ControlbarLayoutManager(this);
124                        _dividers = [];
125                        _dividerElements = {'divider': true};
126                        setupBackground();
127                        setupDefaultButtons();
128                        addEventListeners();
129                        updateControlbarState();
130                        setTime(0, 0);
131                        updateVolumeSlider();
132                }
133
134                private function addEventListeners():void {
135                        player.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler);
136                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, playlistHandler);
137                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_UPDATED, playlistHandler);
138                        player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, playlistHandler);
139                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_MUTE, stateHandler);
140                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_VOLUME, updateVolumeSlider);
141                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_BUFFER, mediaHandler);
142                        player.addEventListener(MediaEvent.JWPLAYER_MEDIA_TIME, mediaHandler);
143                        player.addEventListener(PlayerEvent.JWPLAYER_LOCKED, lockHandler);
144                        player.addEventListener(PlayerEvent.JWPLAYER_UNLOCKED, lockHandler);
145                        RootReference.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeftStage);
146                        RootReference.stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
147                }
148
149
150                private function lockHandler(evt:PlayerEvent):void {
151                        if (_player.locked) {
152                                if (_timeSlider) _timeSlider.lock();
153                                if (_volSlider) _volSlider.lock();
154                        } else {
155                                if (_timeSlider) _timeSlider.unlock();
156                                if (_volSlider) _volSlider.unlock();
157                        }
158                }
159
160
161                private function playlistHandler(evt:PlaylistEvent):void {
162                        if (_timeSlider) _timeSlider.reset();
163                        updateControlbarState();
164                        redraw();
165                }
166
167                private function get fadeOnTimeout():Boolean {
168                        return controlbarConfig['position'] == 'over' || (_player.config.fullscreen && controlbarConfig['position'] != 'none');
169                }
170               
171                private function get hideOnIdle():Boolean {
172                        return String(controlbarConfig['idlehide']) == "true";
173                }
174               
175                private function startFader():void {
176                        if (fadeOnTimeout) {
177                                if (!isNaN(hiding)) {
178                                        clearTimeout(hiding);
179                                }
180                                hiding = setTimeout(moveTimeout, 2000);
181                        }
182                }
183               
184                private function stopFader():void {
185                        if (alpha == 0) {
186                                animations.fade(1, 0.5);
187                        }
188                        if (!isNaN(hiding)) {
189                                clearTimeout(hiding);
190                                Mouse.show();
191                        }
192                }
193               
194                /** Show above controlbar on mousemove and restart the countdown. **/
195                private function moveHandler(evt:MouseEvent=null):void {
196                        stopFader();
197                        if (_player.state == PlayerState.BUFFERING || _player.state == PlayerState.PLAYING || hideOnIdle) {
198                                startFader();
199                        }
200                }
201               
202                /** Hide above controlbar again when move has timed out. **/
203                private function moveTimeout(evt:Event=null):void {
204                        animations.fade(0, 0.5);
205                        Mouse.hide();
206                }
207               
208                /** If the mouse leaves the stage, hide the controlbar if position is 'over' **/
209                private function mouseLeftStage(evt:Event=null):void {
210                        if (fadeOnTimeout) {
211                                if (_player.state == PlayerState.BUFFERING || _player.state == PlayerState.PLAYING || hideOnIdle) {
212                                        animations.fade(0);
213                                }
214                        }
215                }
216               
217                private function stateHandler(evt:PlayerEvent=null):void {
218                        switch(_player.state) {
219                                case PlayerState.BUFFERING:
220                                case PlayerState.PLAYING:
221                                        startFader();
222                                        break;
223                                case PlayerState.PAUSED:
224                                case PlayerState.IDLE:
225                                        if (hideOnIdle) {
226                                                mouseLeftStage();
227                                        } else {
228                                                stopFader();
229                                        }
230                                        break;
231                        }
232                        updateControlbarState();
233                        redraw();
234                }
235
236               
237                private function parseStructuredLayout(structuredLayout:Object):String {
238                        var layoutString:String = "";
239                        getTextField('elapsed').visible = false;
240                        getTextField('duration').visible = false;
241                        for each (var position:String in ['left','center','right']) {
242                                layoutString += "[";
243                                var layout:Array = structuredLayout[position] as Array;
244                                if (layout) {
245                                        var lastWasDivider:Boolean = true;                                     
246                                        for each (var item:Object in layout) {
247                                                if (item['type'] == "divider") {
248                                                        if (item['element']) {
249                                                                layoutString += "<" + item['element'] + ">";
250                                                                _dividerElements[item['element']] = true;
251                                                        } else if (item['width'] > 0) {
252                                                                layoutString += "<"+item['width']+">";
253                                                        } else {
254                                                                layoutString += "|";
255                                                        }
256                                                        lastWasDivider = true;
257                                                } else {
258                                                        if (item['type'] == "text") {
259                                                                getTextField(item['name']).visible = true;
260                                                        }
261                                                        if (!lastWasDivider) layoutString += " ";
262                                                        layoutString += item['name'];
263                                                        lastWasDivider = false;
264                                                }
265                                        }
266                                }
267                                layoutString += "]";
268                        }
269                        return layoutString;
270                }
271               
272
273                private function updateControlbarState():void {
274                        var newLayout:String = _defaultLayout;
275                        var controlbarLayout:Object = _player.skin.getSkinProperties().layout['controlbar'];
276                        if (controlbarLayout) {
277                                newLayout = parseStructuredLayout(controlbarLayout);
278                        }
279                        removeInactive(newLayout);
280                        newLayout = newLayout.replace("blank", _customButtons.join("|"));
281                        newLayout = removeButtonFromLayout("blank", newLayout);
282                        for each (var removed:String in _removedButtons) {
283                                newLayout = removeButtonFromLayout(removed, newLayout);
284                        }
285                        if (player.state == PlayerState.PLAYING) {
286                                newLayout = newLayout.replace('play', 'pause');
287                                hideButton('play');
288                        } else if (player.state == PlayerState.IDLE) {
289                                if (_timeSlider) {
290                                        _timeSlider.reset();
291                                        _timeSlider.thumbVisible = false;
292                                        if (_player.playlist.currentItem) {
293                                                setTime(0, _player.playlist.currentItem.duration);
294                                        }
295                                }
296                                hideButton('pause');
297                        } else {
298                                hideButton('pause');
299                        }
300                        if (player.playlist.length <= 1) {
301                                newLayout = newLayout.replace("|prev|next", "");
302                                hideButton('prev');
303                                hideButton('next');
304                        }
305                        if (player.config.mute) {
306                                newLayout = newLayout.replace("mute", "unmute");
307                                hideButton("mute");
308                        } else {
309                                hideButton("unmute");
310                        }
311                        if (player.config.fullscreen) {
312                                newLayout = newLayout.replace("fullscreen", "normalscreen");
313                                hideButton("fullscreen");
314                        } else {
315                                hideButton("normalscreen");
316                        }
317                        _currentLayout = removeInactive(newLayout);
318                }
319
320
321                private function removeInactive(layout:String):String {
322                        var buttons:Array = _defaultLayout.match(/\W*([A-Za-z0-9]+?)\W/g);
323                        for (var i:Number = 0; i < buttons.length; i++) {
324                                var button:String = (buttons[i] as String).replace(/\W/g, "");
325                                if (!_buttons[button]) {
326                                        layout = removeButtonFromLayout(button, layout);
327                                }
328                        }
329                        return layout;
330                }
331
332
333                private function removeButtonFromLayout(button:String, layout:String):String {
334                        layout = layout.replace(button, "");
335                        layout = layout.replace(/\|\|/g, "|");
336                        layout = layout.replace(/\[\|/g, "[");
337                        layout = layout.replace(/\|\]/g, "]");
338                        layout = layout.replace(/\[\]/g, "");
339                        return layout;
340                }
341
342
343                private function mediaHandler(evt:MediaEvent):void {
344                        var scrubber:Slider = _timeSlider;
345                        switch (evt.type) {
346                                case MediaEvent.JWPLAYER_MEDIA_BUFFER:
347                                case MediaEvent.JWPLAYER_MEDIA_TIME:
348                                        if (scrubber) {
349                                                scrubber.setProgress(evt.position / evt.duration *100);
350                                                scrubber.thumbVisible = (evt.duration > 0);
351                                                if (evt.bufferPercent > 0) {
352                                                        scrubber.setBuffer(evt.bufferPercent);
353                                                        scrubber.setBufferOffset(evt.offset / evt.duration * 100);
354                                                }
355                                                if (evt.position > 0) { setTime(evt.position, evt.duration); }
356                                        }
357                                        break;
358                                default:
359                                        scrubber.reset();
360                                        break;
361                        }
362                }
363
364
365                private function updateVolumeSlider(evt:MediaEvent=null):void {
366                        var volume:Slider = _volSlider;
367                        if (volume) {
368                                var volumeWidth:Number = getSkinElement("volumeSliderRail").width + volume.capsWidth;
369
370                                if (!_player.config.mute) {
371                                        volume.setBuffer(100);
372                                        volume.setProgress(_player.config.volume);
373                                        volume.thumbVisible = true;
374                                        volume.resize(volumeWidth, volume.height);
375                                } else {
376                                        volume.reset();
377                                        volume.thumbVisible = false;
378                                        volume.resize(volumeWidth, volume.height);
379                                }
380                        }
381                }
382
383
384                private function setTime(position:Number, duration:Number):void {
385                        if (position < 0) {
386                                position = 0;
387                        }
388                        if (duration < 0) {
389                                duration = 0;
390                        }
391                        var elapsedText:TextField = getTextField('elapsed');
392                        if (elapsedText) elapsedText.text = Strings.digits(position);
393                        var durationField:TextField = getTextField('duration');
394                        if (durationField) durationField.text = Strings.digits(duration);
395                        redraw();
396                }
397
398
399                private function setupBackground():void {
400                        var back:DisplayObject = getSkinElement("background");
401                        var capLeft:DisplayObject = getSkinElement("capLeft");
402                        var capRight:DisplayObject = getSkinElement("capRight");
403                        //var shade:DisplayObject = getSkinElement("shade");
404
405                        if (!back) {
406                                var newBackground:Sprite = new Sprite();
407                                newBackground.name = "background";
408                                newBackground.graphics.beginFill(0, 0);
409                                newBackground.graphics.drawRect(0, 0, 1, 1);
410                                newBackground.graphics.endFill();
411                                back = newBackground as DisplayObject;
412                        }
413
414                        if (!capLeft) { capLeft = new Sprite(); }
415                        if (!capRight) { capRight = new Sprite(); }
416                       
417                        _bgColorSheet = new Sprite();
418                        if (backgroundColor) {
419                                _bgColorSheet.graphics.beginFill(backgroundColor.color, 1);
420                                _bgColorSheet.graphics.drawRect(0, 0, 1, 1);
421                                _bgColorSheet.graphics.endFill();
422                        }
423                        addChildAt(_bgColorSheet, 0);
424                       
425                       
426                        _buttons['background'] = back;
427                        addChild(back);
428                        _height = back.height;
429                        player.config.pluginConfig("controlbar")['size'] = back.height;
430
431                        if (capLeft) {
432                                _buttons['capLeft'] = capLeft;
433                                addChild(capLeft);
434                        }
435
436                        if (capRight) {
437                                _buttons['capRight'] = capRight;
438                                addChild(capRight);
439                        }
440
441                /*if (shade) {
442                   _buttons['shade'] = shade;
443                   addChild(shade);
444                 }*/
445                }
446
447
448                private function setupDefaultButtons():void {
449                        addComponentButton('play', ViewEvent.JWPLAYER_VIEW_PLAY);
450                        addComponentButton('pause', ViewEvent.JWPLAYER_VIEW_PAUSE);
451                        addComponentButton('prev', ViewEvent.JWPLAYER_VIEW_PREV);
452                        addComponentButton('next', ViewEvent.JWPLAYER_VIEW_NEXT);
453                        addComponentButton('stop', ViewEvent.JWPLAYER_VIEW_STOP);
454                        addComponentButton('fullscreen', ViewEvent.JWPLAYER_VIEW_FULLSCREEN, true);
455                        addComponentButton('normalscreen', ViewEvent.JWPLAYER_VIEW_FULLSCREEN, false);
456                        addComponentButton('unmute', ViewEvent.JWPLAYER_VIEW_MUTE, false);
457                        addComponentButton('mute', ViewEvent.JWPLAYER_VIEW_MUTE, true);
458                        addTextField('elapsed');
459                        addTextField('duration');
460                        addSlider('time', ViewEvent.JWPLAYER_VIEW_CLICK, seekHandler);
461                        _timeSlider = getSlider('time');
462                        addSlider('volume', ViewEvent.JWPLAYER_VIEW_CLICK, volumeHandler);
463                        _volSlider = getSlider('volume');
464                }
465
466
467                private function addComponentButton(name:String, event:String, eventData:*=null):void {
468                        var button:ComponentButton = new ComponentButton();
469                        button.name = name;
470                        button.setOutIcon(getSkinElement(name + "Button"));
471                        button.setOverIcon(getSkinElement(name + "ButtonOver"));
472                        button.setBackground(getSkinElement(name + "ButtonBack"));
473                        button.clickFunction = function():void {
474                                forward(new ViewEvent(event, eventData));
475                        }
476                        if (getSkinElement(name + "Button") || getSkinElement(name + "ButtonOver") || getSkinElement(name + "ButtonBack")) {
477                                button.init();
478                                addButtonDisplayObject(button, name);
479                        }
480                }
481
482
483                private function addSlider(name:String, event:String, callback:Function, margin:Number=0):void {
484                        try {
485                                var slider:Slider = new Slider(
486                                        getSkinElement(name + "SliderRail"),
487                                        getSkinElement(name + "SliderBuffer"),
488                                        getSkinElement(name + "SliderProgress"),
489                                        getSkinElement(name + "SliderThumb"),
490                                        getSkinElement(name + "SliderCapLeft"),
491                                        getSkinElement(name + "SliderCapRight")
492                                );
493                                slider.addEventListener(event, callback);
494                                slider.name = name;
495                                slider.tabEnabled = false;
496                                _buttons[name] = slider;
497                        } catch (e:Error) {
498                                Logger.log("Could not create " + name + "slider");
499                        }
500                }
501
502
503                private function addTextField(name:String):void {
504                        var textFormat:TextFormat = new TextFormat();
505                       
506                        if (fontColor) {
507                                textFormat.color = fontColor.color;
508                        } else if (_player.config.frontcolor) {
509                                textFormat.color = _player.config.frontcolor.color;
510                        }
511                       
512                        textFormat.size = fontSize ? fontSize : 10;
513                        textFormat.font = fontFace ? fontFace : "_sans";
514                        textFormat.bold = (!fontWeight || fontWeight == "bold");
515                        textFormat.italic = (fontStyle && fontStyle == "italic");
516                       
517                        var textField:TextField = new TextField();
518                        textField.defaultTextFormat = textFormat;
519                        textField.selectable = false;
520                        textField.autoSize = TextFieldAutoSize.LEFT;
521                        textField.name = 'text';
522
523                        var textContainer:Sprite = new Sprite();
524                        textContainer.name = name;
525                       
526                        var textBackground:DisplayObject = getSkinElement(name + 'Background');
527                        if (textBackground) {
528                                textBackground.name = 'back';
529                                textBackground.x = textBackground.y = 0;
530                                textContainer.addChild(textBackground);
531                        }
532                        textContainer.addChild(textField);
533                        addChild(textContainer);
534                        _buttons[name] = textContainer;
535                }
536
537
538                private function forward(evt:ViewEvent):void {
539                        dispatchEvent(evt);
540                }
541
542
543                private function volumeHandler(evt:ViewEvent):void {
544                        var volume:Number = Math.round(evt.data * 100);
545                        if (!_player.locked) {
546                                var volumeEvent:MediaEvent = new MediaEvent(MediaEvent.JWPLAYER_MEDIA_VOLUME);
547                                volumeEvent.volume = volume;
548                                updateVolumeSlider(volumeEvent);
549                        }
550                        dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_VOLUME, volume));
551                }
552
553
554                private function seekHandler(evt:ViewEvent):void {
555                        var duration:Number = 0;
556                        try {
557                                duration = player.playlist.currentItem.duration;
558                        } catch (err:Error) {
559                        }
560                        var percent:Number = Math.round(duration * evt.data);
561                        dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_SEEK, percent));
562                }
563
564
565                private function addButtonDisplayObject(icon:DisplayObject, name:String, handler:Function=null):MovieClip {
566                        var acs:AccessibilityProperties = new AccessibilityProperties();
567                        acs.name = name + 'Button';
568                        if (icon is ComponentButton) {
569                                icon.name = name;
570                                _buttons[name] = icon;
571                                icon.accessibilityProperties = acs;
572                                return icon as ComponentButton;
573                        } else if (icon) {
574                                var clipMC:MovieClip = new MovieClip();
575                                if (handler != null) {
576                                        clipMC.addEventListener(MouseEvent.CLICK, handler);
577                                }
578                                clipMC.name = name;
579                                clipMC.accessibilityProperties = acs;
580                                clipMC.addChild(icon);
581                                _buttons[name] = clipMC;
582                                return clipMC;
583                        }
584                        return null;
585                }
586
587                protected function get buttonColor():Color {
588                        return getConfigParam("buttoncolor") ? new Color(String(getConfigParam("buttoncolor"))) : null;
589                }
590               
591                public function addButton(icon:DisplayObject, name:String, handler:Function=null):MovieClip {
592                        if (_customButtons.indexOf(name) < 0) {
593                                _customButtons.push(name);
594                        }
595                        if (_removedButtons.indexOf(name) >= 0) {
596                                _removedButtons.splice(_removedButtons.indexOf(name), 1);
597                        }
598                        icon.x = icon.y = 0;
599                        var button:ComponentButton = new ComponentButton();
600                        button.name = name;
601                        button.clickFunction = handler;
602                        var outBackground:DisplayObject = getSkinElement("blankButton");
603                        if (outBackground) {
604                                var outImage:Sprite = new Sprite();
605                                var outIcon:DisplayObject = icon;
606                                if (buttonColor || _player.config.frontcolor){
607                                        var outTransform:ColorTransform = new ColorTransform();
608                                        outTransform.color = buttonColor ? buttonColor.color : _player.config.frontcolor.color;
609                                        outIcon.transform.colorTransform = outTransform;
610                                }
611                                var outOffset:Number = Math.round((outBackground.height - outIcon.height) / 2);
612                                outBackground.width = outIcon.width + 2 * outOffset;
613                                outImage.addChild(outBackground);
614                                outImage.addChild(outIcon);
615                                outIcon.x = outIcon.y = outOffset;
616                                button.setOutIcon(outImage);
617
618                                button.init();
619                                return addButtonDisplayObject(button, name);
620                        }
621                        return null;
622                }
623
624
625                public function removeButton(name:String):void {
626                        if (_buttons[name] is DisplayObject && this.contains(_buttons[name] as DisplayObject)) {
627                                removeChild(_buttons[name]);
628                                _buttons[name] = null;
629                                _defaultLayout = removeButtonFromLayout(name, _defaultLayout);
630                                _currentLayout = removeButtonFromLayout(name, _currentLayout);
631                                if (_removedButtons.indexOf(name) < 0) {
632                                        _removedButtons.push(name);
633                                }
634                                redraw();
635                        }
636                }
637
638
639                private function hideButton(name:String):void {
640                        if (_buttons[name]) {
641                                _buttons[name].visible = false;
642                        }
643                }
644
645
646                public function getButton(buttonName:String):DisplayObject {
647                        if (_dividerElements[buttonName]) {
648                                var divider:DisplayObject = getSkinElement(buttonName);
649                                if (divider) {
650                                        _dividers.push(divider);
651                                }
652                                return divider;
653                        }
654                        return _buttons[buttonName];
655                }
656               
657                private function getTextField(textName:String):TextField {
658                        var textContainer:Sprite = getButton(textName) as Sprite;
659                        if (textContainer) {
660                                return textContainer.getChildByName('text') as TextField;
661                        }
662                        return null;
663                }
664
665
666                public function getSlider(sliderName:String):Slider {
667                        return getButton(sliderName) as Slider;
668                }
669
670
671                public function resize(width:Number, height:Number):void {
672                        if (getConfigParam('position') == "none") {
673                                visible = false;
674                                return;
675                        }
676                       
677                        _width = width;
678
679                        if (getConfigParam('position') == 'over' || _player.config.fullscreen == true) {
680                                x = getConfigParam('margin') + player.config.pluginConfig('display')['x'];
681                                y = height - background.height - getConfigParam('margin') + player.config.pluginConfig('display')['y'];
682                                _width = width - 2 * getConfigParam('margin');
683                        }
684
685                        //shade.width = _width;
686
687                        var backgroundWidth:Number = _width;
688
689                        backgroundWidth -= capLeft.width;
690                        capLeft.x = 0;
691
692                        backgroundWidth -= capRight.width;
693                        capRight.x = _width - capRight.width;
694
695                        background.width = backgroundWidth;
696                        background.x = capLeft.width;
697                        setChildIndex(capLeft, numChildren - 1);
698                        setChildIndex(capRight, numChildren - 1);
699                       
700                        _bgColorSheet.width = _width;
701                        _bgColorSheet.height = background.height;
702
703                        if (_fullscreen && !_player.config.fullscreen) {
704                                stopFader();
705                        }
706                        _fullscreen = _player.config.fullscreen;
707                        stateHandler();
708                        redraw();
709                }
710
711
712                private function redraw():void {
713                        clearDividers();
714                        alignTextFields();
715                        _layoutManager.resize(_width, _height);
716                }
717
718
719                private function clearDividers():void {
720                        for (var i:Number = 0; i < _dividers.length; i++) {
721                                _dividers[i].visible = false;
722                                _dividers[i] = null;
723                        }
724                        _dividers = [];
725                }
726               
727                private function alignTextFields():void {
728                        for each(var fieldName:String in ['elapsed','duration']) {
729                                var textContainer:Sprite = getButton(fieldName) as Sprite;
730                                textContainer.tabEnabled = false;
731                                textContainer.buttonMode = false;
732                                var textField:DisplayObject = textContainer.getChildByName('text');
733                                var textBackground:DisplayObject = textContainer.getChildByName('back');
734                               
735                                if (textField && textBackground) {
736                                        if (textField.width > textBackground.width) {
737                                                textField.x = 0;
738                                                textBackground.x = (textField.width - textBackground.width) / 2;
739                                        } else {
740                                                textBackground.x = 0;
741                                                textField.x = (textBackground.width - textField.width) / 2;
742                                        }
743
744                                        if (textField.height > textBackground.height) {
745                                                textField.y = 0;
746                                                textBackground.y = (textField.height - textBackground.height) / 2;
747                                        } else {
748                                                textBackground.y = 0;
749                                                textField.y = (textBackground.height - textField.height) / 2;
750                                        }
751                                }
752                        }
753                }
754
755
756                public function get layout():String {
757                        return _currentLayout.replace(/\|/g, "<divider>");
758                }
759
760
761                private function get background():DisplayObject {
762                        if (_buttons['background']) {
763                                return _buttons['background'];
764                        }
765                        return (new Sprite());
766                }
767
768
769                private function get capLeft():DisplayObject {
770                        if (_buttons['capLeft']) {
771                                return _buttons['capLeft'];
772                        }
773                        return (new Sprite());
774                }
775
776
777                private function get capRight():DisplayObject {
778                        if (_buttons['capRight']) {
779                                return _buttons['capRight'];
780                        }
781                        return (new Sprite());
782                }
783        }
784}
Note: See TracBrowser for help on using the repository browser.