3

MXNAAppController.as

 3 years ago
source link: http://www.mikechambers.com/blog/2004/01/27/mxnaappcontrolleras/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MXNAAppController.as

Tuesday, January 27, 2004

I am going to post the class files for the MXNA WebService App I put together over the weekend. I will post them as I add the comments.

I will eventually post all of the source, but I want to work out all of the kinks first.

The first class I am posting, MXNAAppController is the controller for the application. It handles all communication with the web services on the server, and contains a single view class, that contains most of the UI elements for the app.

So, if you find any bugs, or have any suggestions, post them in the comments.

import mx.containers.Window;
import com.macromedia.mxna.MXNAWebService;
import com.macromedia.mxna.app.MXNAFeedView;
import mx.controls.Alert;
import mx.controls.ProgressBar;

/* Associated with the main app controller clip */
class com.macromedia.mxna.app.MXNAAppController extends MovieClip
{
	/*Window Component for Background*/
	private var bgWindow:Window; 
    
	/*MXNA WebService Class to Load Data*/
    private var ws:MXNAWebService;
	/*Main App View*/
    private var feedView:MXNAFeedView;
    
	/*clip to block window component interaction*/
    private var blocker:MovieClip;

	/*Progress Bar Component*/
    private var pBar:ProgressBar;
    
	/*Used to cache category data*/
    private var feedCache:Object;
    private var so:SharedObject;

	/*
		Constructor. We do everything in onLoad to be sure
		everything has initialized
	*/
    public function MXNAAppController()
    {
    }
    
	/*
		Called by Flash when the clip is laoded on stage. We do a bunch of
		initialization here.
	*/
    private function onLoad():Void
    {
        feedCache = new Object();
    
		//set the clip to catch mouse events to the Window Component title bar.
		//we jsut want to use it for the background
        blocker._alpha = 0;
        blocker.onRelease = function(){};
        blocker.useHandCursor = false;
    
        bgWindow.title = "MXNA WebService Example";
    
		//braodcast when the user selects a category
        feedView.addEventListener("onSelectCategory", this);
    
		//Custom class that provides an interface / API to the MXNA webservices
        ws = new MXNAWebService();
		//event when categories load from server
        ws.addEventListener("onGetCategories", this);
		//event when posts load from server
        ws.addEventListener("onGetPostsByCategory", this);
		//event when an error occurs
		ws.addEventListener("onFault", this);
    
		//see if categories have been laoded before. If so, use them.
        so = SharedObject.getLocal("MXNAWebServiceExample");
        var categories = so.data.categories;
        
        if(categories != undefined)
        {
            setCategories(categories);
        }
        else
        {
            enableProgress(true, "Loading Categories...");
			//if categories not saved from before, then load them from the server.
            ws.getCategories();        
        }
    }
    
    public function onActivate(Void):Void
    {
    }
    
	//utility methods that takes an array of categories and sets them in the UI
	//passing them to the feedView
    private function setCategories(categories:Array):Void
    {
        feedView.setCategories(categories, "CATEGORY");
		
		//when the categories are loaded, lets go get the first batch of posts
		//so the user has something to look at.
        getPostsByCategory("All");
    }
    
	//takes a category, and gets the posts for that category from the server
    private function getPostsByCategory(category:String):Void
    {
        enableProgress(true, "Loading " + category + " Feeds...");
        ws.getPostsByCategory(category);
    }
    
	//method to manage the progress bar.
	//We are usign it in indetermindate mode, so, we need to turn it off when
	//it is not being used (i.e. make it invisible).
    private function enableProgress(enabled:Boolean, label:String):Void
    {
        if(label == undefined)
        {
            label = "";
        }
        
        pBar.indeterminate = enabled;
        pBar.label = label;
        pBar.enabled = enabled;
        pBar._visible = enabled;      
        
		//if something is being loaded, we need to disable the UI in order to
		//keep things in sync
        feedView.enabled = !enabled;
    }
    
	//event listener method, called when categories are loaded from the server.
    private function onGetCategories(eventObj:Object):Void
    {
        enableProgress(false);
        
		//contains an array of string category names
        var results:Array = eventObj.categories;
		
		//we need to add the "All" option since this is not returned from
		//the server
        results.unshift({CATEGORY:"All"});
        
		//lets save the categories in an SO, so we don't have to load them next
		//time
        so.data.categories = results;
        so.flush();
        
        setCategories(results);               
    }
    
	//event listener method, called when the user selects a category from the UI.
    private function onSelectCategory(eventObj:Object):Void
    {        
		//category name
        var category:String = eventObj.category;
        
		//lets see if the feeds are in the cache
        if(feedCache[category] != undefined)
        {
			//if so, use it
            feedView.dataProvider = feedCache[category];
            return;
        }
    
		//otherwise, go to the server to get the feeds for the category
        getPostsByCategory(category);
    }
    
	//event listener method, called when posts are loade from the server
    private function onGetPostsByCategory(eventObj:Object):Void
    {
        enableProgress(false);   
        
		//add them to the cache.
        feedCache[eventObj.category] = eventObj.feeds;
        
		//send them to the feedView to be displayed
        feedView.dataProvider = eventObj.feeds;
    }
    
	//called if an error occurs. only broadcast by MXNA class right now.
    private function onFault(faultObj:Object):Void
    {    

	    var info:Object = faultObj.fault;
	    
		//show an Alert box with some info
	    Alert.show(info.detail, 
	    			info.faultstring, 
				Alert.OK,
				this, 
				null, 
				"errorIcon",
				Alert.OK);
				
		feedView.enabled = false;
		enableProgress(false);
	
    }
}

Btw, big ups to Sean Voisen for the AS 2 support in his MovableType CodeBeautifier.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK