package { import flash.display.DisplayObject; import flash.display.StageDisplayState; import flash.events.FullScreenEvent; import mx.controls.VideoDisplay; import mx.core.UIComponent; import mx.core.mx_internal; [DefaultProperty("displayState")] /** * Description: Custom video display with fullscreen abilities. Optional a video control can be set and
* Flash Video mipmapping capabilities (aka smoothing & deblocking) can be enabled.
* Based on FSVideoDisplay by Manish Jethani (manish.jethani@gmail.com). * The MIT License * * Copyright (c) 2008 Jonas Schulz (j.schulz@cromac-services.de) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ public class student_mashup_youtube_components_VideoFSDisplay extends VideoDisplay { private var _videoControl:UIComponent; private var _vcParentChildPos:int = 1; private var _vcXPos:Number; private var _vcYPos:Number; private var _vcWidth:Number; private var _vcHeight:Number; private var _displayState:String = StageDisplayState.NORMAL; private var _enableSmoothing:Boolean = false; private var _setDeblocking:int = 0; [Inspectable(category="Other", enumeration="normal,fullScreen", defaultValue="normal")] public function get displayState():String { return _displayState; } public function set displayState(value:String):void { if (value != _displayState) { _displayState = value; if (_displayState == StageDisplayState.FULL_SCREEN) { stage.addEventListener(FullScreenEvent.FULL_SCREEN, handleFullScreen); // Move video player to stage this.mx_internal::videoPlayer.visible = false; stage.addChild(this.mx_internal::videoPlayer); } stage.displayState = _displayState; } } [Inspectable(category="Other", defaultValue="false")] public function get enableSmoothing():Boolean { return _enableSmoothing; } public function set enableSmoothing(value:Boolean):void { if (value != _enableSmoothing) { _enableSmoothing = value; invalidateProperties(); trace("smoothing"); } } [Inspectable(category="Other", enumeration="0,1,2,3,4,5", defaultValue="0")] public function get setDeblocking():int { return _setDeblocking; } public function set setDeblocking(value:int):void { if (value >=0 && value <=5) { _setDeblocking = value; invalidateProperties(); } } public function set videoControl(value:UIComponent):void { if (value != _videoControl) { _videoControl = value; _vcXPos = _videoControl.x; _vcYPos = _videoControl.y; _vcWidth = _videoControl.width; _vcHeight = _videoControl.height; } } [Inspectable(category="Other", defaultValue="1")] public function get vcParentChildPos():int { return _vcParentChildPos; } public function set vcParentChildPos(value:int):void { if(_videoControl) _vcParentChildPos = value; } public function student_mashup_youtube_components_VideoFSDisplay() { super(); } override protected function commitProperties():void { super.commitProperties(); this.mx_internal::videoPlayer.deblocking = _setDeblocking; this.mx_internal::videoPlayer.smoothing = _enableSmoothing; } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { if (displayState == StageDisplayState.NORMAL) { if (_videoControl) { _videoControl.x = _vcXPos; _videoControl.y = _vcYPos; _videoControl.width = _vcWidth; _videoControl.height = _vcHeight; } super.updateDisplayList(unscaledWidth, unscaledHeight); } else { // In full-screen mode, run layout with stage co-ordinates if (_videoControl) { _videoControl.width = stage.stageWidth; _videoControl.x = 0; _videoControl.y = stage.stageHeight - _vcHeight; } super.updateDisplayList(stage.stageWidth, stage.stageHeight); } } private function handleFullScreen(event:FullScreenEvent):void { if (stage.displayState == StageDisplayState.NORMAL) { stage.removeEventListener(FullScreenEvent.FULL_SCREEN, handleFullScreen); if (border) addChild(DisplayObject(border)); addChild(this.mx_internal::videoPlayer); if (_videoControl) parent.addChildAt(_videoControl, _vcParentChildPos); invalidateDisplayList(); } else { if (border) { // Move border to stage, just behind video player stage.addChildAt(DisplayObject(border), stage.getChildIndex(this.mx_internal::videoPlayer)); } if (_videoControl) { if (parent.contains(_videoControl)) parent.removeChild(_videoControl); stage.addChild(_videoControl); } invalidateDisplayList(); this.mx_internal::videoPlayer.visible = true; } _displayState = stage.displayState; } } }