blob: 2883fe7fc82eafcc92e1f1121118fa6d3378304a [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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;
}
}
}