| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright ownership. |
| // The ASF licenses this file to You under the Apache License, Version 2.0 |
| // (the "License"); you may not use this file except in compliance with |
| // the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| |
| package spark.components.mediaClasses |
| { |
| |
| import flash.display.DisplayObject; |
| import flash.display.DisplayObjectContainer; |
| import flash.display.InteractiveObject; |
| import flash.events.Event; |
| |
| import mx.core.IVisualElement; |
| |
| import spark.components.HSlider; |
| |
| /** |
| * The VideoScrubBar class defines a video timeline that shows the |
| * current play head location in the video, the amount of the video previously played, |
| * and the loaded in part of the video. |
| * The timeline appears at the bottom of the VideoPlayer control. |
| * |
| * @see spark.components.VideoPlayer |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| public class ScrubBar extends HSlider |
| { |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Constructor |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Constructor. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| public function ScrubBar() |
| { |
| super(); |
| |
| dataTipFormatFunction = formatTimeValue; |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Skin Parts |
| // |
| //-------------------------------------------------------------------------- |
| |
| [SkinPart(required="false")] |
| |
| /** |
| * An optional skin part for the area on the track |
| * representing the video that's been played. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| public var playedArea:IVisualElement; |
| |
| [SkinPart(required="false")] |
| |
| /** |
| * An optional skin part for the area on the track |
| * representing the currently loaded in part of the video. |
| * |
| * <p>For a progressive download video, this will correspond |
| * to the number of bytes downloaded. For a streaming video, |
| * the whole video is "loaded in" as it's quick to seek to |
| * any spot in the video.</p> |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| public var loadedRangeArea:IVisualElement; |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Properties |
| // |
| //-------------------------------------------------------------------------- |
| |
| //--------------------------------- |
| // loadedRangeEnd |
| //--------------------------------- |
| |
| private var _loadedRangeEnd:Number; |
| |
| /** |
| * The range of currently loaded in values. This |
| * property corresponds to the end of that range. |
| * |
| * <p>For a progressive download video, this will correspond |
| * to the number of bytes downloaded. For a streaming video, |
| * the whole video is "loaded in" as it's quick to seek to |
| * any spot in the video.</p> |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| public function get loadedRangeEnd():Number |
| { |
| return _loadedRangeEnd; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set loadedRangeEnd(value:Number):void |
| { |
| if (value == _loadedRangeEnd) |
| return; |
| |
| _loadedRangeEnd = value; |
| invalidateDisplayList(); |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * @private |
| */ |
| override protected function partAdded(partName:String, instance:Object):void |
| { |
| super.partAdded(partName, instance); |
| |
| if (instance == playedArea) |
| { |
| if (playedArea is InteractiveObject) |
| InteractiveObject(playedArea).mouseEnabled = false; |
| if (playedArea is DisplayObjectContainer) |
| DisplayObjectContainer(playedArea).mouseChildren = false; |
| |
| invalidateDisplayList(); |
| } |
| else if (instance == loadedRangeArea) |
| { |
| if (loadedRangeArea is InteractiveObject) |
| InteractiveObject(loadedRangeArea).mouseEnabled = false; |
| if (loadedRangeArea is DisplayObjectContainer) |
| DisplayObjectContainer(loadedRangeArea).mouseChildren = false; |
| |
| invalidateDisplayList(); |
| } |
| } |
| |
| /** |
| * @private |
| */ |
| private function calculateAreaSize(value:Number):Number |
| { |
| var trackPos:Number = track.getLayoutBoundsX(); |
| var trackSize:Number = track.getLayoutBoundsWidth(); |
| var thumbSize:Number = thumb.getLayoutBoundsWidth(); |
| var range:Number = maximum - minimum; |
| var thumbPos:Number = (range > 0) ? (value - minimum) * ((trackSize - thumbSize) / range) : 0; |
| return thumbSize + thumbPos; |
| } |
| |
| /** |
| * @private |
| */ |
| override protected function updateSkinDisplayList():void |
| { |
| super.updateSkinDisplayList(); |
| |
| if (!thumb || !track) |
| return; |
| |
| sizeLoadedRangeArea(calculateAreaSize(loadedRangeEnd)); |
| sizePlayedArea(calculateAreaSize(pendingValue)); |
| } |
| |
| /** |
| * Sets the size of the loaded range area. |
| * The loaded range area defines the area on the timeline that represents |
| * the currently loaded portion of the video. |
| * |
| * @param loadedRangeAreaSize The new size of the loaded in range area. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| protected function sizeLoadedRangeArea(loadedRangeAreaSize:Number):void |
| { |
| if (loadedRangeArea) |
| loadedRangeArea.setLayoutBoundsSize(Math.round(loadedRangeAreaSize), NaN); |
| } |
| |
| /** |
| * Sets the size of the played area. |
| * The played area defines the area on the timeline that represents |
| * the part of the video that has been played. |
| * |
| * @param playedAreaSize The new size of the played area. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 1.5 |
| * @productversion Flex 4 |
| */ |
| protected function sizePlayedArea(playedAreaSize:Number):void |
| { |
| if (playedArea) |
| playedArea.setLayoutBoundsSize(Math.round(playedAreaSize), NaN); |
| } |
| |
| /** |
| * @private |
| */ |
| private function formatTimeValue(value:Number):String |
| { |
| // default format: hours:minutes:seconds |
| var hours:uint = Math.floor(value/3600) % 24; |
| var minutes:uint = Math.floor(value/60) % 60; |
| var seconds:uint = Math.round(value) % 60; |
| |
| var result:String = ""; |
| if (hours != 0) |
| result = hours + ":"; |
| |
| if (result && minutes < 10) |
| result += "0" + minutes + ":"; |
| else |
| result += minutes + ":"; |
| |
| if (seconds < 10) |
| result += "0" + seconds; |
| else |
| result += seconds; |
| |
| return result; |
| } |
| } |
| } |