// Copyright 2007. Adobe Systems Incorporated. All Rights Reserved.
package fl.controls {
import fl.controls.BaseButton;
import fl.controls.LabelButton;
import fl.controls.ScrollBarDirection;
import fl.core.UIComponent;
import fl.core.InvalidationType;
import fl.events.ComponentEvent;
import fl.events.ScrollEvent;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.Timer;
import fl.controls.TextInput;
//--------------------------------------
// Events
//--------------------------------------
/**
* Dispatched when the ScrollBar instance's scrollPosition
property changes.
*
* @eventType fl.events.ScrollEvent.SCROLL
*
* @see #scrollPosition
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Event(name="scroll", type="fl.events.ScrollEvent") ]
//--------------------------------------
// Styles
//--------------------------------------
/**
* Name of the class to use as the skin for the down arrow button of the scroll bar
* when it is disabled. If you change the skin, either graphically or programmatically,
* you should ensure that the new skin is the same height (for horizontal scroll bars)
* or width (for vertical scroll bars) as the track.
*
* @default ScrollArrowDown_disabledSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="downArrowDisabledSkin", type="Class")]
/**
* Name of the class to use as the skin for the down arrow button of the scroll bar
* when you click the arrow button. If you change the skin, either graphically or
* programmatically, you should ensure that the new skin is the same height (for
* horizontal scroll bars) or width (for vertical scroll bars) as the track.
*
* @default ScrollArrowDown_downSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="downArrowDownSkin", type="Class")]
/**
* Name of the class to use as the skin for the down arrow button of the scroll bar
* when the mouse pointer is over the arrow button. If you change the skin, either
* graphically or programmatically, you should ensure that the new skin is the same
* height (for horizontal scroll bars) or width (for vertical scroll bars) as the track.
*
* @default ScrollArrowDown_overSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="downArrowOverSkin", type="Class")]
/**
* Name of the class to use as the skin for the down arrow button of the scroll bar.
* If you change the skin, either graphically or programmatically, you should ensure
* that the new skin is the same height (for horizontal scroll bars) or width (for
* vertical scroll bars) as the track.
*
* @default ScrollArrowDown_upSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="downArrowUpSkin", type="Class")]
/**
* The skin that is used to indicate the disabled state of the thumb.
*
* @default ScrollThumb_disabledSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="thumbDisabledSkin", type="Class")]
/**
* Name of the class to use as the skin for the thumb of the scroll bar when you
* click the thumb.
*
* @default ScrollThumb_downSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="thumbDownSkin", type="Class")]
/**
* Name of the class to use as the skin for the thumb of the scroll bar when the
* mouse pointer is over the thumb.
*
* @default ScrollThumb_overSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="thumbOverSkin", type="Class")]
/**
* Name of the class to use as the skin used for the thumb of the scroll
* bar.
*
* @default ScrollThumb_upSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="thumbUpSkin", type="Class")]
/**
* The skin that is used to indicate a disabled track.
*
* @default ScrollTrack_Skin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="trackDisabledSkin", type="Class")]
/**
* The skin that is used to indicate the down state of a disabled skin.
*
* @default ScrollTrack_Skin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="trackDownSkin", type="Class")]
/**
* The skin that is used to indicate the mouseover state for the scroll track.
*
* @default ScrollTrack_Skin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="trackOverSkin", type="Class")]
/**
* The skin used to indicate the mouse up state for the scroll track.
*
* @default ScrollTrack_Skin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="trackUpSkin", type="Class")]
/**
* Name of the class to use as the skin for the up arrow button of the scroll bar
* when it is disabled. If you change the skin, either graphically or programmatically,
* you should ensure that the new skin is the same height (for horizontal scroll bars)
* or width (for vertical scroll bars) as the track.
*
* @default ScrollArrowUp_disabledSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="upArrowDisabledSkin", type="Class")]
/**
* Name of the class to use as the skin for the up arrow button of the scroll bar when
* you click the arrow button. If you change the skin, either graphically or programmatically,
* you should ensure that the new skin is the same height (for horizontal scroll bars) or width
* (for vertical scroll bars) as the track.
*
* @default ScrollArrowUp_downSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="upArrowDownSkin", type="Class")]
/**
* Name of the class to use as the skin for the up arrow button of the scroll bar when the
* mouse pointer is over the arrow button. If you change the skin, either graphically or
* programmatically, you should ensure that the new skin is the same height (for horizontal
* scroll bars) or width (for vertical scroll bars) as the track.
*
* @default ScrollArrowUp_overSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="upArrowOverSkin", type="Class")]
/**
* Name of the class to use as the skin for the up arrow button of the scroll bar. If you
* change the skin, either graphically or programmatically, you should ensure that the new
* skin is the same height (for horizontal scroll bars) or width (for vertical scroll bars)
* as the track.
*
* @default ScrollArrowUp_upSkin
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="upArrowUpSkin", type="Class")]
/**
* Name of the class to use as the icon for the thumb of the scroll bar.
*
* @default ScrollBar_thumbIcon
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="thumbIcon", type="Class")]
/**
* @copy fl.controls.BaseButton#style:repeatDelay
*
* @default 500
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="repeatDelay", type="Number", format="Time")]
/**
* @copy fl.controls.BaseButton#style:repeatInterval
*
* @default 35
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Style(name="repeatInterval", type="Number", format="Time")]
//--------------------------------------
// Class description
//--------------------------------------
/**
* The ScrollBar component provides the end user with a way to control the
* portion of data that is displayed when there is too much data to
* fit in the display area. The scroll bar consists of four parts:
* two arrow buttons, a track, and a thumb. The position of the
* thumb and display of the buttons depends on the current state of
* the scroll bar. The scroll bar uses four parameters to calculate
* its display state: a minimum range value; a maximum range value;
* a current position that must be within the range values; and a
* viewport size that must be equal to or less than the range and
* represents the number of items in the range that can be
* displayed at the same time.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public class ScrollBar extends UIComponent {
/**
* @private (internal)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public static const WIDTH:Number = 15;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _pageSize:Number = 10;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _pageScrollSize:Number = 0;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _lineScrollSize:Number = 1;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _minScrollPosition:Number = 0;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _maxScrollPosition:Number = 0;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _scrollPosition:Number = 0;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var _direction:String = ScrollBarDirection.VERTICAL;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private var thumbScrollOffset:Number;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var inDrag:Boolean = false;
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var upArrow:BaseButton;
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var downArrow:BaseButton;
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var thumb:LabelButton;
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var track:BaseButton;
// Note that there is currently no disabled state for thumb,
// and track only has one state.
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static var defaultStyles:Object = {downArrowDisabledSkin:"ScrollArrowDown_disabledSkin",downArrowDownSkin:"ScrollArrowDown_downSkin",downArrowOverSkin:"ScrollArrowDown_overSkin",downArrowUpSkin:"ScrollArrowDown_upSkin",
thumbDisabledSkin:"ScrollThumb_upSkin",thumbDownSkin:"ScrollThumb_downSkin",thumbOverSkin:"ScrollThumb_overSkin",thumbUpSkin:"ScrollThumb_upSkin",
trackDisabledSkin:"ScrollTrack_skin",trackDownSkin:"ScrollTrack_skin",trackOverSkin:"ScrollTrack_skin",trackUpSkin:"ScrollTrack_skin",
upArrowDisabledSkin:"ScrollArrowUp_disabledSkin",upArrowDownSkin:"ScrollArrowUp_downSkin",upArrowOverSkin:"ScrollArrowUp_overSkin",upArrowUpSkin:"ScrollArrowUp_upSkin",
thumbIcon:"ScrollBar_thumbIcon",
repeatDelay:500,repeatInterval:35};
/**
* @copy fl.core.UIComponent#getStyleDefinition()
*
* @see fl.core.UIComponent#getStyle()
* @see fl.core.UIComponent#setStyle()
* @see fl.managers.StyleManager
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public static function getStyleDefinition():Object {
return defaultStyles;
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected static const DOWN_ARROW_STYLES:Object = {
disabledSkin:"downArrowDisabledSkin",
downSkin:"downArrowDownSkin",
overSkin:"downArrowOverSkin",
upSkin:"downArrowUpSkin",
repeatDelay:"repeatDelay",
repeatInterval:"repeatInterval"
};
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected static const THUMB_STYLES:Object = {
disabledSkin:"thumbDisabledSkin",
downSkin:"thumbDownSkin",
overSkin:"thumbOverSkin",
upSkin:"thumbUpSkin",
icon:"thumbIcon",
textPadding: 0
};
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected static const TRACK_STYLES:Object = {
disabledSkin:"trackDisabledSkin",
downSkin:"trackDownSkin",
overSkin:"trackOverSkin",
upSkin:"trackUpSkin",
repeatDelay:"repeatDelay",
repeatInterval:"repeatInterval"
};
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected static const UP_ARROW_STYLES:Object = {
disabledSkin:"upArrowDisabledSkin",
downSkin:"upArrowDownSkin",
overSkin:"upArrowOverSkin",
upSkin:"upArrowUpSkin",
repeatDelay:"repeatDelay",
repeatInterval:"repeatInterval"
};
/**
* Creates a new ScrollBar component instance.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function ScrollBar() {
super();
setStyles();
focusEnabled = false;
}
/**
* @copy fl.core.UIComponent#setSize()
*
* @see #height
* @see #width
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function setSize(width:Number, height:Number):void {
if (_direction == ScrollBarDirection.HORIZONTAL) {
super.setSize(height,width);
} else {
super.setSize(width,height);
}
}
/**
* @copy fl.core.UIComponent#width
*
* @see #height
* @see #setSize()
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function get width():Number {
return (_direction == ScrollBarDirection.HORIZONTAL) ? super.height : super.width;
}
/**
* @copy fl.core.UIComponent#height
*
* @see #setSize()
* @see #width
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function get height():Number {
return (_direction == ScrollBarDirection.HORIZONTAL) ? super.width : super.height;
}
/**
* Gets or sets a Boolean value that indicates whether the scroll bar is enabled.
* A value of true
indicates that the scroll bar is enabled; a value of
* false
indicates that it is not.
*
* @default true
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function get enabled():Boolean {
return super.enabled;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function set enabled(value:Boolean):void {
super.enabled = value;
downArrow.enabled = track.enabled = thumb.enabled = upArrow.enabled = (enabled && _maxScrollPosition > _minScrollPosition);
updateThumb();
}
/**
* Sets the range and viewport size of the ScrollBar component. The ScrollBar
* component updates the state of the arrow buttons and size of the scroll
* thumb accordingly. All of the scroll properties are relative to the
* scale of the minScrollPosition
and the maxScrollPosition
.
* Each number between the maximum and minumum values represents one scroll position.
*
* @param pageSize Size of one page. Determines the size of the thumb, and the increment by which the scroll bar moves when the arrows are clicked.
* @param minScrollPosition Bottom of the scrolling range.
* @param maxScrollPosition Top of the scrolling range.
* @param pageScrollSize Increment to move when a track is pressed, in pixels.
*
* @see #maxScrollPosition
* @see #minScrollPosition
* @see #pageScrollSize
* @see #pageSize
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function setScrollProperties(pageSize:Number,minScrollPosition:Number,maxScrollPosition:Number,pageScrollSize:Number=0):void {
this.pageSize = pageSize;
_minScrollPosition = minScrollPosition;
_maxScrollPosition = maxScrollPosition;
if (pageScrollSize >= 0) { _pageScrollSize = pageScrollSize; }
enabled = (_maxScrollPosition > _minScrollPosition);
// ensure our scroll position is still in range:
setScrollPosition(_scrollPosition, false);
updateThumb();
}
/**
* Gets or sets the current scroll position and updates the position
* of the thumb. The scrollPosition
value represents a relative position between
* the minScrollPosition
and maxScrollPosition
values.
*
* @default 0
*
* @see #setScrollProperties()
* @see #minScrollPosition
* @see #maxScrollPosition
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get scrollPosition():Number { return _scrollPosition; }
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set scrollPosition(newScrollPosition:Number):void {
setScrollPosition(newScrollPosition, true);
}
/**
* Gets or sets a number that represents the minimum scroll position. The
* scrollPosition
value represents a relative position between the
* minScrollPosition
and the maxScrollPosition
values.
* This property is set by the component that contains the scroll bar,
* and is usually zero.
*
* @default 0
*
* @see #setScrollProperties()
* @see #maxScrollPosition
* @see #scrollPosition
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get minScrollPosition():Number {
return _minScrollPosition;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set minScrollPosition(value:Number):void {
// This uses setScrollProperties because it needs to update thumb and enabled.
setScrollProperties(_pageSize,value,_maxScrollPosition);
}
/**
* Gets or sets a number that represents the maximum scroll position. The
* scrollPosition
value represents a relative position between the
* minScrollPosition
and the maxScrollPosition
values.
* This property is set by the component that contains the scroll bar,
* and is the maximum value. Usually this property describes the number
* of pixels between the bottom of the component and the bottom of
* the content, but this property is often set to a different value to change the
* behavior of the scrolling. For example, the TextArea component sets this
* property to the maxScrollH
value of the text field, so that the
* scroll bar scrolls appropriately by line of text.
*
* @default 0
*
* @see #setScrollProperties()
* @see #minScrollPosition
* @see #scrollPosition
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get maxScrollPosition():Number {
return _maxScrollPosition;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set maxScrollPosition(value:Number):void {
// This uses setScrollProperties because it needs to update thumb and enabled.
setScrollProperties(_pageSize,_minScrollPosition,value);
}
/**
* Gets or sets the number of lines that a page contains. The lineScrollSize
* is measured in increments between the minScrollPosition
and
* the maxScrollPosition
. If this property is 0, the scroll bar
* will not scroll.
*
* @default 10
*
* @see #maxScrollPosition
* @see #minScrollPosition
* @see #setScrollProperties()
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get pageSize():Number {
return _pageSize;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set pageSize(value:Number):void {
if (value > 0) {
_pageSize = value;
}
}
/**
* Gets or sets a value that represents the increment by which the page is scrolled
* when the scroll bar track is pressed. The pageScrollSize
value is
* measured in increments between the minScrollPosition
and the
* maxScrollPosition
values. If this value is set to 0, the value of the
* pageSize
property is used.
*
* @default 0
*
* @see #maxScrollPosition
* @see #minScrollPosition
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get pageScrollSize():Number {
return (_pageScrollSize == 0) ? _pageSize : _pageScrollSize;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set pageScrollSize(value:Number):void {
if (value>=0) { _pageScrollSize = value; }
}
/**
* Gets or sets a value that represents the increment by which to scroll the page
* when the scroll bar track is pressed. The pageScrollSize
is measured
* in increments between the minScrollPosition
and the maxScrollPosition
* values. If this value is set to 0, the value of the pageSize
property is used.
*
* @default 0
*
* @see #maxScrollPosition
* @see #minScrollPosition
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get lineScrollSize():Number {
return _lineScrollSize;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set lineScrollSize(value:Number):void {
if (value>0) {_lineScrollSize = value; }
}
/**
* Gets or sets a value that indicates whether the scroll bar scrolls horizontally or vertically.
* Valid values are ScrollBarDirection.HORIZONTAL
and
* ScrollBarDirection.VERTICAL
.
*
* @default ScrollBarDirection.VERTICAL
*
* @see fl.controls.ScrollBarDirection ScrollBarDirection
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get direction():String {
return _direction;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set direction(value:String):void {
if (_direction == value) { return; }
_direction = value;
if (isLivePreview) { return; } // Rotation and scaling happens automatically in LivePreview.
//
setScaleY(1);
var horizontal:Boolean = _direction == ScrollBarDirection.HORIZONTAL;
if (horizontal && componentInspectorSetting) {
if (rotation == 90 ) { return; }
setScaleX(-1);
rotation = -90;
}
if (!componentInspectorSetting) {
if (horizontal && rotation == 0) {
rotation = -90;
setScaleX(-1);
} else if (!horizontal && rotation == -90 ) {
rotation = 0;
setScaleX(1);
}
}
invalidate(InvalidationType.SIZE);
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override protected function configUI():void {
super.configUI();
track = new BaseButton();
track.move(0,14);
track.useHandCursor = false;
track.autoRepeat = true;
track.focusEnabled = false;
addChild(track);
thumb = new LabelButton();
thumb.label = "";
thumb.setSize(WIDTH,15);
thumb.move(0,15);
thumb.focusEnabled = false;
addChild(thumb);
downArrow = new BaseButton();
downArrow.setSize(WIDTH,14);
downArrow.autoRepeat = true;
downArrow.focusEnabled = false;
addChild(downArrow);
upArrow = new BaseButton();
upArrow.setSize(WIDTH,14);
upArrow.move(0,0);
upArrow.autoRepeat = true;
upArrow.focusEnabled = false;
addChild(upArrow);
upArrow.addEventListener(ComponentEvent.BUTTON_DOWN,scrollPressHandler,false,0,true);
downArrow.addEventListener(ComponentEvent.BUTTON_DOWN,scrollPressHandler,false,0,true);
track.addEventListener(ComponentEvent.BUTTON_DOWN,scrollPressHandler,false,0,true);
thumb.addEventListener(MouseEvent.MOUSE_DOWN,thumbPressHandler,false,0,true);
enabled = false;
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override protected function draw():void {
if (isInvalid(InvalidationType.SIZE)) {
var h:Number = super.height;
downArrow.move(0, Math.max(upArrow.height, h-downArrow.height));
track.setSize(WIDTH, Math.max(0, h-(downArrow.height + upArrow.height)));
updateThumb();
}
if (isInvalid(InvalidationType.STYLES,InvalidationType.STATE)) {
setStyles();
}
// Call drawNow on nested components to get around problems with nested render events:
downArrow.drawNow();
upArrow.drawNow();
track.drawNow();
thumb.drawNow();
validate();
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected function scrollPressHandler(event:ComponentEvent):void {
event.stopImmediatePropagation();
if (event.currentTarget == upArrow) {
setScrollPosition(_scrollPosition-_lineScrollSize);
} else if (event.currentTarget == downArrow) {
setScrollPosition(_scrollPosition+_lineScrollSize);
} else {
var mousePosition:Number = (track.mouseY)/track.height * (_maxScrollPosition-_minScrollPosition) + _minScrollPosition;
var pgScroll:Number = (pageScrollSize == 0)?pageSize:pageScrollSize;
if (_scrollPosition < mousePosition) {
setScrollPosition(Math.min(mousePosition,_scrollPosition+pgScroll));
} else if (_scrollPosition > mousePosition) {
setScrollPosition(Math.max(mousePosition,_scrollPosition-pgScroll));
}
}
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected function thumbPressHandler(event:MouseEvent):void {
inDrag = true;
thumbScrollOffset = mouseY-thumb.y;
thumb.mouseStateLocked = true;
mouseChildren = false; // Should be able to do stage.mouseChildren, but doesn't seem to work.
stage.addEventListener(MouseEvent.MOUSE_MOVE,handleThumbDrag,false,0,true);
stage.addEventListener(MouseEvent.MOUSE_UP,thumbReleaseHandler,false,0,true);
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected function handleThumbDrag(event:MouseEvent):void {
var pos:Number = Math.max(0, Math.min(track.height-thumb.height, mouseY-track.y-thumbScrollOffset));
setScrollPosition(pos/(track.height-thumb.height) * (_maxScrollPosition-_minScrollPosition) + _minScrollPosition);
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected function thumbReleaseHandler(event:MouseEvent):void {
inDrag = false;
mouseChildren = true;
thumb.mouseStateLocked = false;
stage.removeEventListener(MouseEvent.MOUSE_MOVE,handleThumbDrag);
stage.removeEventListener(MouseEvent.MOUSE_UP,thumbReleaseHandler);
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function setScrollPosition(newScrollPosition:Number, fireEvent:Boolean=true):void {
var oldPosition:Number = scrollPosition;
_scrollPosition = Math.max(_minScrollPosition,Math.min(_maxScrollPosition, newScrollPosition));
if (oldPosition == _scrollPosition) { return; }
if (fireEvent) { dispatchEvent(new ScrollEvent(_direction, scrollPosition-oldPosition, scrollPosition)); }
updateThumb();
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected function setStyles():void {
copyStylesToChild(downArrow,DOWN_ARROW_STYLES);
copyStylesToChild(thumb,THUMB_STYLES);
copyStylesToChild(track,TRACK_STYLES);
copyStylesToChild(upArrow,UP_ARROW_STYLES);
}
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected function updateThumb():void {
var per:Number = _maxScrollPosition - _minScrollPosition + _pageSize;
if (track.height <= 12 || _maxScrollPosition <= _minScrollPosition || (per == 0 || isNaN(per))) {
thumb.height = 12;
thumb.visible = false;
} else {
thumb.height = Math.max(13,_pageSize / per * track.height);
thumb.y = track.y+(track.height-thumb.height)*((_scrollPosition-_minScrollPosition)/(_maxScrollPosition-_minScrollPosition));
thumb.visible = enabled;
}
}
}
}