pickles/static/contrib/mediaplayer-3.15/source/com/jeroenwijering/utils/Scroller.as

188 lines
No EOL
5.7 KiB
ActionScript
Executable file

/**
* Manages scrolling of a designated MovieClip, automatic or with scrollbar.
*
* @example
* var myScroller = new com.jeroenwijering.utils.Scroller(myMovie,myMask);
* myscroller.scrollTo(200);
*
* @author Jeroen Wijering
* @version 1.8
**/
import com.jeroenwijering.utils.Animations;
class com.jeroenwijering.utils.Scroller {
/** Movieclip that should be scrolled **/
private var targetClip:MovieClip;
/** Mask of the movieclip **/
private var maskClip:MovieClip;
/** Use automatic scroling, defaults to false **/
private var autoScroll:Boolean = false;
/** scrollbar front color **/
private var frontColor:Number = 0x000000;
/** scrollbar highlighting color **/
private var lightColor:Number = 0x000000;
/** size ratio clip:mask **/
private var sizeRatio:Number;
/** scroll interval id for autoscroller and dragging of scrollbar **/
private var scrollInterval:Number;
/** corrent scroll index **/
private var currentScroll:Number = 0;
/** autoscroll multiplier **/
private var AUTOSCROLL_SPEED:Number = 0.5;
/** Movieclip the scrollbar is drawn into **/
private var SCROLLER_CLIP:MovieClip;
/** Color object of the scrollbar back **/
private var SCROLLER_BACK_COLOR:Color;
/** Color object of the scrollbar front **/
private var SCROLLER_FRONT_COLOR:Color;
/** Sets up scrolling behaviour and scrollbar **/
function Scroller(tgt:MovieClip,msk:MovieClip,asc:Boolean,
fcl:Number,hcl:Number) {
targetClip = tgt;
maskClip = msk;
arguments.length > 2 ? autoScroll = asc: null;
arguments.length > 3 ? frontColor = fcl: null;
arguments.length > 4 ? lightColor = hcl: null;
sizeRatio = maskClip._height/targetClip._height;
if(autoScroll == false) {
drawScrollbar();
} else {
scrollInterval = setInterval(this,"doAutoscroll",50);
}
if(System.capabilities.os.toLowerCase().indexOf("mac") == -1) {
Mouse.addListener(this);
}
};
/** Draw the scrollbar. **/
private function drawScrollbar() {
targetClip._parent.createEmptyMovieClip("scrollbar",
targetClip._parent.getNextHighestDepth());
SCROLLER_CLIP = targetClip._parent.scrollbar;
SCROLLER_CLIP._x = maskClip._x+maskClip._width - 1;
SCROLLER_CLIP._y = maskClip._y+3;
SCROLLER_CLIP.createEmptyMovieClip("back",0);
SCROLLER_CLIP.back._alpha = 0;
SCROLLER_CLIP.back._y = -3;
drawSquare(SCROLLER_CLIP.back,12,maskClip._height,frontColor);
SCROLLER_CLIP.createEmptyMovieClip("bar",1);
SCROLLER_CLIP.bar._x = 4;
SCROLLER_CLIP.bar._alpha = 50;
drawSquare(SCROLLER_CLIP.bar,4,maskClip._height-5,frontColor);
SCROLLER_CLIP.createEmptyMovieClip("front",2);
SCROLLER_CLIP.front._x = 3;
drawSquare(SCROLLER_CLIP.front,6,
SCROLLER_CLIP.bar._height*sizeRatio,frontColor);
SCROLLER_CLIP.front.createEmptyMovieClip("bg",1);
SCROLLER_CLIP.front.bg._x = -3;
SCROLLER_CLIP.front.bg._alpha = 0;
drawSquare(SCROLLER_CLIP.front.bg,12,
SCROLLER_CLIP.front._height,frontColor);
SCROLLER_FRONT_COLOR = new Color(SCROLLER_CLIP.front);
setScrollbarEvents();
};
/** Set use of mousewheel to scroll playlist. **/
public function onMouseWheel(dta:Number) {
scrollTo(currentScroll-dta*20);
};
/** Set autoscroll events. **/
private function doAutoscroll() {
if (maskClip._xmouse>0 && maskClip._xmouse<maskClip._width/
(maskClip._xscale/100) && maskClip._ymouse>0 &&
maskClip._ymouse<maskClip._height/(maskClip._yscale/100)) {
var dif:Number =
maskClip._ymouse*(maskClip._yscale/100)-maskClip._height/2;
scrollTo(currentScroll+Math.floor(dif*AUTOSCROLL_SPEED));
}
};
/** All scrollbar mouse events grouped together. **/
private function setScrollbarEvents():Void {
var instance:Scroller = this;
SCROLLER_CLIP.front.onRollOver =
SCROLLER_CLIP.back.onRollOver = function() {
instance.SCROLLER_FRONT_COLOR.setRGB(instance.lightColor);
};
SCROLLER_CLIP.front.onRollOut =
SCROLLER_CLIP.back.onRollOut = function() {
instance.SCROLLER_FRONT_COLOR.setRGB(instance.frontColor);
};
SCROLLER_CLIP.back.onRelease = function() {
if(this._ymouse > this._parent.front._y +
this._parent.front._height) {
instance.scrollTo(instance.currentScroll +
instance.maskClip._height/2);
} else if (this._ymouse < this._parent.front._y) {
instance.scrollTo(instance.currentScroll -
instance.maskClip._height/2);
}
};
SCROLLER_CLIP.front.onPress = function() {
this.startDrag(false,3,0,3,instance.SCROLLER_CLIP.bar._height -
this._height);
instance.scrollInterval = setInterval(instance,"scrollTo",100);
};
SCROLLER_CLIP.front.onRelease =
SCROLLER_CLIP.front.onReleaseOutside = function() {
this.stopDrag();
clearInterval(instance.scrollInterval);
};
scrollTo(maskClip._y - targetClip._y);
};
/** Scroll the MovieClip to a given Y position. **/
public function scrollTo(yps:Number):Void {
if(arguments.length == 0 && autoScroll == false) {
yps = SCROLLER_CLIP.front._y*maskClip._height /
SCROLLER_CLIP.front._height;
}
if(yps<5) {
yps=0;
} else if (yps>targetClip._height-maskClip._height-5) {
yps = targetClip._height - maskClip._height;
}
Animations.easeTo(targetClip,targetClip._x,maskClip._y - yps);
SCROLLER_CLIP.front._y = yps*SCROLLER_CLIP.front._height /
maskClip._height;
currentScroll = yps;
};
/** Remove the scrollbar from stage **/
public function purgeScrollbar() {
clearInterval(scrollInterval);
Mouse.removeListener(this);
scrollTo(0);
SCROLLER_CLIP.removeMovieClip();
};
/** Draw a square in a given movieclip. **/
private function drawSquare(tgt:MovieClip,wth:Number,hei:Number,
clr:Number) {
tgt.clear();
tgt.beginFill(clr,100);
tgt.moveTo(0,0);
tgt.lineTo(wth,0);
tgt.lineTo(wth,hei);
tgt.lineTo(0,hei);
tgt.lineTo(0,0);
tgt.endFill();
};
}