AppController
| Kind of class: | class |
|---|---|
| Inherits from: | LocalController |
| Classpath: | controllers.AppController |
| File last modified: | Monday, 06 November 2006, 08:09:08 |
// Adobe classes
import org.asapframework.data.array.ArrayEnumerator;
import org.asapframework.data.filedatatransform.TextFile2Array;
import org.asapframework.data.filedatatransform.TextFile2ArrayEvent;
import org.asapframework.events.EventDelegate;
import org.asapframework.management.movie.LocalController;
import org.asapframework.util.loader.Loader;
import org.asapframework.util.loader.LoaderEvent;
import org.asapframework.util.MovieClipUtils;
import org.asapframework.util.RectangleUtils;
import org.asapframework.util.types.Point;
import org.asapframework.util.types.Rectangle;
import controllers.MenuController;
import data.AppData;
import data.DataManager;
import data.DataMapper;
import data.ProjectData;
import events.ProjectEvent;
import flash.external.ExternalInterface;
import ui.Image;
import util.BWAMovieClipUtils;
/**
The Application controller
*/
class controllers.AppController extends LocalController {
private var mMenuController:MenuController;
private var mDataManager:DataManager;
/**
Project id of the selected project (shown after button release).
*/
private var mSelectedProjectId:String = null;
/**
Project id of the highlighted project (shown on button rollover).
*/
private var mHighlightedProjectId:String = null;
/**
Quick lookup reference of the {@link Image} that belongs to a project id.
*/
private var mProjectIdToImageHash:Object = new Object();
/**
The stage area used for the images.
*/
private var mImageStageBoundaries:Rectangle;
private var mImageLoader:Loader;
private var image_area_mc:MovieClip; /**< Clip to quickly adjust size and position of, much like a drawing tool. The Rectangle mImageStageBoundaries are set to the dimensions of this clip. */
private var images_mc:MovieClip;
private var menu_mc:MovieClip;
/**
*/
public static function main (inTimeline:MovieClip) : Void {
// create new controller
var controller:AppController = new AppController(inTimeline);
// store controller on timeline
inTimeline.localController = controller;
}
// PRIVATE METHODS
/**
*/
private function AppController (inTimeline:MovieClip) {
super(inTimeline);
init();
}
/**
*/
private function init () : Void {
image_area_mc = mTimeline.image_area_mc;
images_mc = mTimeline.images_mc;
menu_mc = mTimeline.menu_mc;
mMenuController = new MenuController(menu_mc);
mImageStageBoundaries = RectangleUtils.boundsOfMovieClip(image_area_mc);
mImageLoader = new Loader();
mImageLoader.addEventListener(LoaderEvent.ON_DONE, EventDelegate.create(this, handleImageLoaded));
mDataManager = new DataManager();
new TextFile2Array(AppData.PROJECT_DATA_URL, this).load();
}
/**
Called after project data has been fetched. Feeds the DataManager with parsed ProjectData objects;
@param inProjectsList : list of project data lines
*/
private function setup (inProjectsList:Array) : Void {
mDataManager.setProjects(parseProjectData(inProjectsList));
var projects:Array = mDataManager.getProjects();
mMenuController.createButtons(projects);
mMenuController.addEventListener(
ProjectEvent.PROJECT_SHOW,
EventDelegate.create(this, showProject));
mMenuController.addEventListener(
ProjectEvent.PROJECT_HIDE,
EventDelegate.create(this, hideProject));
mMenuController.addEventListener(
ProjectEvent.PROJECT_SELECT,
EventDelegate.create(this, selectProject));
mMenuController.addEventListener(
ProjectEvent.PROJECT_VISITSITE,
EventDelegate.create(this, gotoProjectSite));
createImages(projects);
// load all images
var project:ProjectData = null;
var e:ArrayEnumerator = new ArrayEnumerator(projects);
while (project = e.getNextObject()) {
loadProjectImage(project);
}
// select first project
selectProject(new ProjectEvent(ProjectEvent.PROJECT_SHOW, this, projects[0].id));
}
/**
Creates ProjectData objects by mapping the eky-values from each data line to a new ProjectData object.
@param inProjectsList : a list of data lines (text)
@return A list of objects of type ProjectData.
*/
private function parseProjectData (inProjectsList:Array) : Array {
var projects:Array = new Array();
var e:ArrayEnumerator = new ArrayEnumerator(inProjectsList);
var line:String = null;
var id:Number = 0;
while (line = e.getNextObject()) {
var projectData:ProjectData = new ProjectData(String(id));
DataMapper.map(line, projectData);
projects.push(projectData);
id++;
}
return projects;
}
/**
Creates {@link Image} objects by attaching them to the timeline.
@param inProjectData : list of {@link ProjectData} objects
*/
private function createImages (inProjectData:Array) : Void {
var e:ArrayEnumerator = new ArrayEnumerator(inProjectData);
var project:ProjectData = null;
var count:Number = 0;
while (project = e.getNextObject()) {
var id:String = project.id;
var imageClip:MovieClip = images_mc.attachMovie("image", "image_" + id, images_mc.getNextHighestDepth());
var image:Image = Image(imageClip);
image.setId(id);
mProjectIdToImageHash[id] = image;
}
}
/**
Loads the first image of project inProject.
@param inProject : the project data to load the image of
*/
private function loadProjectImage (inProject:ProjectData) : Void {
// for now just take the first image url
var imageName:String = inProject.imageUrls[0];
if (!imageName) {
//trace("loadProjectImage - no image name for Project " + inProject.client);
return;
}
var id:String = inProject.id;
var image:Image = mProjectIdToImageHash[id];
var imageUrl:String = AppData.IMAGE_DIR + imageName;
mImageLoader.load(image.getLoadImageContainer(), imageUrl, imageUrl, true);
}
/**
Shows the project image in the image area.
*/
private function showProject (e:ProjectEvent) : Void {
var id:String = e.projectId;
if (id == mSelectedProjectId) {
return;
}
if (id != mHighlightedProjectId) {
var highlightedImage:Image = mProjectIdToImageHash[mHighlightedProjectId];
if (highlightedImage) {
highlightedImage.hide();
}
}
var image:Image = mProjectIdToImageHash[id];
if (image) {
image.show();
}
}
/**
Removes the project image from the image area.
*/
private function hideProject (e:ProjectEvent) : Void {
var id:String = e.projectId;
if (id == mSelectedProjectId) {
return;
}
var image:Image = mProjectIdToImageHash[id];
if (image) {
image.hide();
}
}
/**
Permanently shows the project image in the image area.
*/
private function selectProject (e:ProjectEvent) : Void {
var id:String = e.projectId;
if (id == mSelectedProjectId) {
return;
}
var selectedImage:Image = mProjectIdToImageHash[mSelectedProjectId];
if (selectedImage) {
selectedImage.setSelected(false);
selectedImage.hide();
}
var image:Image = mProjectIdToImageHash[id];
mSelectedProjectId = id;
if (image.isInited()) {
image.select();
}
mMenuController.setSelectedProject(mSelectedProjectId);
}
/**
Tell the browser to go to the project url. Uses <code>ExternalInterface</code> to access JavaScript function <code>openSite</code>.
*/
private function gotoProjectSite (e:ProjectEvent) : Void {
var id:String = e.projectId;
var project:ProjectData = mDataManager.getProjectWithId(id);
var url:String = project.url;
var name:String = project.name;
var isAvailable:Boolean = ExternalInterface.available;
if (isAvailable) {
ExternalInterface.call("openSite", url, name);
}
}
// EVENTS
/**
Gets called when text file with tree data has been parsed.
*/
private function onTextFile2ArrayFinished (inEvent:TextFile2ArrayEvent) : Void {
var projectsList:Array = inEvent.array;
setup(projectsList);
}
/**
Smoothes the loaded image and put it onto the stage.
*/
private function handleImageLoaded (e:LoaderEvent) : Void {
var clip:MovieClip = MovieClip(e.targetClip);
var smoothedClip:MovieClip = BWAMovieClipUtils.smoothMovieClip(clip);
var image:Image = Image(smoothedClip._parent);
// tell Image to use the new smoothed clip
image.setImageClip(smoothedClip);
setImageToStage(image);
}
/**
Fits the image to available stage area and centers horizontally.
If the image is selected tell it to present itself.
@param inImage : the Image to set the stage properties of
*/
private function setImageToStage (inImage:Image) : Void {
var imageSize:Point = new Point(inImage._width, inImage._height);
var stageSize:Point = mImageStageBoundaries.size;
var maxSize:Point = stageSize;
// image should not become larger than image
if (imageSize.x < stageSize.x || imageSize.y < stageSize.y) {
maxSize = imageSize;
}
var scale:Number = MovieClipUtils.getNormalizedScale(inImage, maxSize);
var imageRect:Rectangle = RectangleUtils.rectOfMovieClip(inImage);
RectangleUtils.centerToRectangle(imageRect, mImageStageBoundaries);
inImage.setFrame(imageRect);
inImage.initWithScale(scale);
var selectedImage:Image = mProjectIdToImageHash[mSelectedProjectId];
if (inImage == selectedImage) {
inImage.presentFirstTime();
}
}
}
The Application controller
Summary
Constructor
Instance properties
Class methods
Instance methods
Event handlers
Constructor
AppController
private function AppController (
inTimeline:MovieClip)
Instance properties
image_area_mc
private image_area_mc:MovieClip
(read,write)
Clip to quickly adjust size and position of, much like a drawing tool. The Rectangle mImageStageBoundaries are set to the dimensions of this clip.
images_mc
private images_mc:MovieClip
(read,write)
mDataManager
private mDataManager:DataManager
(read,write)
menu_mc
private menu_mc:MovieClip
(read,write)
mHighlightedProjectId
private mHighlightedProjectId:String = null
(read,write)
Project id of the highlighted project (shown on button rollover).
mImageLoader
private mImageLoader:Loader
(read,write)
mImageStageBoundaries
private mImageStageBoundaries:Rectangle
(read,write)
The stage area used for the images.
mMenuController
private mMenuController:MenuController
(read,write)
mProjectIdToImageHash
private mProjectIdToImageHash:Object = new Object()
(read,write)
Quick lookup reference of the ui.Image that belongs to a project id.
mSelectedProjectId
private mSelectedProjectId:String = null
(read,write)
Project id of the selected project (shown after button release).
Class methods
main
static function main (
inTimeline:MovieClip) : Void
Instance methods
createImages
private function createImages (
inProjectData:Array) : Void
Creates ui.Image objects by attaching them to the timeline.
Parameters:
inProjectData:
list of data.ProjectData objects
gotoProjectSite
private function gotoProjectSite (
e:ProjectEvent) : Void
Tell the browser to go to the project url. Uses
ExternalInterface to access JavaScript function openSite.handleImageLoaded
private function handleImageLoaded (
e:LoaderEvent) : Void
Smoothes the loaded image and put it onto the stage.
hideProject
private function hideProject (
e:ProjectEvent) : Void
Removes the project image from the image area.
init
private function init (
) : Void
loadProjectImage
private function loadProjectImage (
inProject:ProjectData) : Void
Loads the first image of project inProject.
Parameters:
inProject:
the project data to load the image of
parseProjectData
private function parseProjectData (
inProjectsList:Array) : Array
Creates ProjectData objects by mapping the eky-values from each data line to a new ProjectData object.
Parameters:
inProjectsList:
a list of data lines (text)
Returns:
A list of objects of type ProjectData.
selectProject
private function selectProject (
e:ProjectEvent) : Void
Permanently shows the project image in the image area.
setImageToStage
private function setImageToStage (
inImage:Image) : Void
Fits the image to available stage area and centers horizontally.
If the image is selected tell it to present itself.
If the image is selected tell it to present itself.
Parameters:
inImage:
the Image to set the stage properties of
setup
private function setup (
inProjectsList:Array) : Void
Called after project data has been fetched. Feeds the DataManager with parsed ProjectData objects;
Parameters:
inProjectsList:
list of project data lines
showProject
private function showProject (
e:ProjectEvent) : Void
Shows the project image in the image area.
Event handlers
onTextFile2ArrayFinished
private function onTextFile2ArrayFinished (
inEvent:TextFile2ArrayEvent) : Void
Gets called when text file with tree data has been parsed.
© the authors of ASAP Framework|Created with VisDoc|Thursday, 09 November 2006, 16:17:03|show TOChide TOC|show private members|hide private members© the authors of ASAP Framework|hide TOC