/* Free for non-commercial use. Copyright 2006 Positive BLue, LLC <info@positiveblue.com> Example: import sScroll; target_text_txt.multiline = true; target_text_txt.autoSize = true; var ssc = new sScroll(); ssc.__horizontal = true; ssc.__hideable = true; ssc.__useTween = true; ssc.__tweenFrames = 10; ssc.__target = target_text_txt; ssc.__mask = mask_mc; ssc.__scroller = scroller_mc; ssc.__dragger = scroller_mc.dragger_mc; ssc.initScroller(); */ import mx.transitions.Tween; import mx.transitions.easing.*; class sScroll { // horizontal - true; vertical - false public var isHorizontal:Boolean = false; public var mask_mc:Object; public var target_mc:Object; public var scroller_mc:Object; public var dragger_mc:Object; // mask position and size public var maskHeight:Number; public var maskPositionTop:Number; public var maskWidth:Number; public var maskPositionLeft:Number; // scroller position and size public var scrollerTop:Number; public var scrollerLeft:Number; public var scrollerHeight:Number; public var scrollerWidth:Number; public var draggerMinSize:Number = 30; // 30 pixels minimum dragger size public var draggerMaxSize:Number = 70; // 70 pixels maximum dragger size public var hideable:Boolean = false; public var useTween:Boolean = false; public var tweenTime:Number = 0; public var tweenFrames:Number = 0; public var tweenType:Object = Strong.easeOut; public function set __horizontal(h:Boolean):Void { isHorizontal = h; }; public function set __target(target:Object):Void { target_mc = target; }; public function set __mask(mask:Object):Void { mask_mc = mask; }; public function set __scroller(scroller:Object):Void { scroller_mc = scroller; }; public function set __dragger(dragger:Object):Void { dragger_mc = dragger; }; public function set __maskY(y:Number):Void { maskPositionTop = y; }; public function set __maskX(x:Number):Void { maskPositionLeft = x; }; public function set __scrollerY(y:Number):Void { scrollerTop = y; }; public function set __scrollerX(x:Number):Void { scrollerLeft = x; }; public function set __draggerMinSize(s:Number):Void { draggerMinSize = s; }; public function set __draggerMaxSize(s:Number):Void { draggerMaxSize = s; }; public function set __hideable(s:Boolean):Void { hideable = s; }; public function set __useTween(s:Boolean):Void { useTween = s; }; public function set __tweenTime(s:Number):Void { tweenTime = s; }; public function set __tweenFrames(s:Number):Void { tweenFrames = s; }; public function set __tweenType(s:Object):Void { tweenType = s; }; public function initScroller():Void { maskPositionLeft = mask_mc._x; maskPositionTop = mask_mc._y; target_mc._x = maskPositionLeft; target_mc._y = maskPositionTop; maskHeight = mask_mc._height; maskWidth = mask_mc._width; scrollerHeight = scroller_mc._height; scrollerWidth = scroller_mc._width; if (isHorizontal) { dragger_mc._x = 0; dragger_mc._width = scrollerWidth; dragger_mc._width *= target_mc._width / maskWidth; if (dragger_mc._width < draggerMinSize) { dragger_mc._width = draggerMinSize; } else if (dragger_mc._width > draggerMaxSize) { dragger_mc._width = draggerMaxSize; } var shouldHide:Boolean = target_mc._width / maskWidth <= 1; dragger_mc.myY = dragger_mc._y; dragger_mc.myLeft = dragger_mc._x; dragger_mc.myRight = Math.round((dragger_mc._x + scrollerWidth) - dragger_mc._width); } else { dragger_mc._y = 0; dragger_mc._height = scrollerHeight; dragger_mc._height *= maskHeight / target_mc._height; if (dragger_mc._height < draggerMinSize) { dragger_mc._height = draggerMinSize; } else if (dragger_mc._height > draggerMaxSize) { dragger_mc._height = draggerMaxSize; } var shouldHide:Boolean = target_mc._height / maskHeight <= 1; dragger_mc.myX = dragger_mc._x; dragger_mc.myTop = dragger_mc._y; dragger_mc.myBottom = Math.round((dragger_mc._y + scrollerHeight) - dragger_mc._height); } if (hideable && shouldHide) { scroller_mc._visible = false; } else { scroller_mc._visible = true; dragger_mc.ssc = this; dragger_mc.onMouseDown = function():Void { this.dragging = true; if (this.ssc.isHorizontal) { this.startDrag(false, this.myLeft, this.myY, this.myRight, this.myY); } else { this.startDrag(false, this.myX, this.myTop, this.myX, this.myBottom); } }; dragger_mc.onMouseUp = function():Void { this.dragging = false; this.stopDrag(); }; dragger_mc.onMouseMove = function():Void { if (this.dragging) { if (this.ssc.isHorizontal) { var onePerc:Number = (this.ssc.target_mc._width - this.ssc.maskWidth) / 100 + .1; var vWidth:Number = this.ssc.scrollerWidth - this._width; var percPos:Number = Math.round(this._x / vWidth * 100); var rPos:Number = onePerc * percPos; if (this.ssc.useTween) { var t:Number = this.ssc.tweenTime > 0 ? this.ssc.tweenTime : this.ssc.tweenFrames; new Tween(this.ssc.target_mc, '_x', this.ssc.tweenType, this.ssc.target_mc._x, this.ssc.maskPositionLeft - rPos, t, this.ssc.tweenTime > 0); } else { this.ssc.target_mc._x = this.ssc.maskPositionLeft - rPos; } } else { var onePerc:Number = (this.ssc.target_mc._height - this.ssc.maskHeight) / 100 + .1; var vHeight:Number = this.ssc.scrollerHeight - this._height; var percPos:Number = Math.round(this._y / vHeight * 100); var rPos:Number = onePerc * percPos; if (this.ssc.useTween) { var t:Number = this.ssc.tweenTime > 0 ? this.ssc.tweenTime : this.ssc.tweenFrames; new Tween(this.ssc.target_mc, '_y', this.ssc.tweenType, this.ssc.target_mc._y, this.ssc.maskPositionTop - rPos, t, this.ssc.tweenTime > 0); } else { this.ssc.target_mc._y = this.ssc.maskPositionTop - rPos; } } } }; } }; }