// Adobe classes
import mx.transitions.easing.Regular;
import org.asapframework.data.array.ArrayEnumerator;
import org.asapframework.data.array.TraverseArrayEnumerator;
import org.asapframework.data.array.TraverseArrayEnumeratorEvent;
import org.asapframework.events.EventDelegate;
import org.asapframework.management.movie.LocalController;
import org.asapframework.ui.buttons.EventButtonEvent;
import org.asapframework.util.actionqueue.ActionQueue;
import org.asapframework.util.actionqueue.AQFade;
import org.asapframework.util.loader.Loader;
import org.asapframework.util.loader.LoaderEvent;
import data.AppData;
import ui.NextButton;
import ui.ThumbImage;
/**
This demo illustrates the use of a TraverseArrayEnumerator as a "thumb pager". The enumerator traverses a list of image ids, to be fetched with <code>getCurrentObject</code>, <code>getNextObject</code> and <code>getPreviousObject</code>. The "previous" and "next" buttons are activated when there is a "previous object" and "next object", respectively, otherwise they are deactivated.
@author Arthur Clemens
*/
class controller.ThumbController extends LocalController {
private static var IMAGE_WIDTH:Number = 320;
private static var IMAGE_HEIGHT:Number = 200;
private static var FADE_IN_DURATION:Number = 1.2;
private static var THUMB_WIDTH:Number = 32;
private static var THUMB_HEIGHT:Number = 20;
private static var THUMB_OFFSET:Number = 5; // pixels between thumbs
private var image_mc:MovieClip;
private var previous_btn:NextButton;
private var next_btn:NextButton;
private var mLoader:Loader;
private var mThumbPager:TraverseArrayEnumerator;
private var mFadeQueue:ActionQueue;
/**
Main entry point, called from the Flash mTimeline.
*/
public static function main (inTimeline:MovieClip) : Void {
// create new controller
var controller:ThumbController = new ThumbController(inTimeline);
// store controller on mTimeline
inTimeline.localController = controller;
}
/**
Creates a new controller.ThumbController. Calls {@link #init} to initialize variables.
*/
public function ThumbController (inTimeline:MovieClip) {
super(inTimeline);
initUI();
}
// PRIVATE METHODS
/**
Initializes variables. Selects the first thumb and loads the corresponding big image.
*/
private function initUI () : Void {
image_mc = mTimeline.image_mc.holder_mc;
previous_btn = mTimeline.previous_btn;
next_btn = mTimeline.next_btn;
mLoader = new Loader();
mLoader.addEventListener(LoaderEvent.ON_DONE, EventDelegate.create(this, handleImageLoadDone));
// create a thumb enumerator
var thumbList:Array = createThumbs();
mThumbPager = new TraverseArrayEnumerator(thumbList);
// listen for update events
mThumbPager.addEventListener(TraverseArrayEnumeratorEvent.UPDATE, EventDelegate.create(this, handleThumbUpdate));
// select first thumb and load corresponding big image
activateThumb(mThumbPager.getNextObject());
}
/**
Activates a new thumb and orders to load the corresponding image.
@param inThumb : the new thumb
@param inOldThumb : (optional) the old thumb
*/
private function activateThumb (inThumb:ThumbImage, inOldThumb:ThumbImage) : Void {
if (inOldThumb) {
inOldThumb.deselect();
}
inThumb.select();
loadImage(inThumb.getId());
}
/**
Loads a new image.
*/
private function loadImage (inId:String) : Void {
mLoader.load(image_mc, AppData.IMAGE_URL_FOLDER + inId, "", false);
}
/**
Fades in the image.
*/
private function handleImageLoadDone (e:LoaderEvent) : Void {
var image:MovieClip = MovieClip(e.targetClip);
image._alpha = 0;
image._visible = true;
mFadeQueue.quit();
mFadeQueue = new ActionQueue();
mFadeQueue.addAction(AQFade.fade, image, FADE_IN_DURATION, null, 100, Regular.easeOut);
mFadeQueue.run();
}
/**
Disables the next button if there is a 'next' object, otherwise it is enabled.
Disables the previous button if there is a 'previous' object, otherwise it is enabled.
*/
private function handleThumbUpdate (e:TraverseArrayEnumeratorEvent) : Void {
next_btn.setEnabled(mThumbPager.hasNextObject());
previous_btn.setEnabled(mThumbPager.hasPreviousObject());
}
/**
Creates the thumbs. If there are more thumbs than fit on one row, the thumbs list is extended below.
*/
private function createThumbs () : Array {
var thumbList:Array = new Array();
var x:Number = mTimeline.thumb._x;
var y:Number = mTimeline.thumb._y;
var e:ArrayEnumerator = new ArrayEnumerator(AppData.IMAGES);
var imgName:String;
var order:Number = 0;
var relOffsetX:Number = 0;
var relOffsetY:Number = 0;
while (imgName = e.getNextObject()) {
var thumb:ThumbImage = ThumbImage(mTimeline.attachMovie("thumb image", "thumb_image_" + order, mTimeline.getNextHighestDepth()));
thumb.setSize(THUMB_WIDTH, THUMB_HEIGHT);
thumb.setPosition(x + relOffsetX, y + relOffsetY);
relOffsetX += THUMB_WIDTH + THUMB_OFFSET;
if ((relOffsetX + THUMB_WIDTH) > IMAGE_WIDTH) {
relOffsetY += THUMB_HEIGHT + THUMB_OFFSET;
relOffsetX = 0;
}
thumb.setId(imgName);
thumb.loadImage(AppData.THUMB_URL_FOLDER + imgName, mLoader);
thumbList.push(thumb);
order++;
}
return thumbList;
}
// EVENTS
/**
Called either by the thumbs or the previous/next buttons.
*/
public function onEventButtonPress ( e:EventButtonEvent ) : Void {
if (e.target instanceof ThumbImage) {
var thumb:ThumbImage = ThumbImage(e.target);
var oldThumb:ThumbImage = mThumbPager.getCurrentObject();
mThumbPager.setCurrentObject(thumb); // will update the enumerator
activateThumb(thumb, oldThumb);
}
if (e.target instanceof NextButton) {
var oldThumb:ThumbImage = mThumbPager.getCurrentObject();
var newThumb:ThumbImage;
if (e.target._name == "next_btn") {
newThumb = mThumbPager.getNextObject();
}
if (e.target._name == "previous_btn") {
newThumb = mThumbPager.getPreviousObject();
}
activateThumb(newThumb, oldThumb);
}
}
}