Walking the Tree

Table of contents
/**
 * This method will traverse a Tree's model independent of it's
 * type.
 * 
 * <p>Note :: This method may look long and arduous but, rest assured
 * it has all the checks to perform like a champ. Also, you 'could'
 * refactor part of this method but, for the sake of explanation, I
 * kept it all in one place.</p>
 * 
 * <p>Remember, I had coupled the model to this method by tracing
 * @label, obviously you do not need to do this. The intention of
 * this example is to show you that the dataDescriptor seperates
 * the models type and is awesome. It enables you to create a tight 
 * method like this without type checks on the model.</p>
 *
 * @param tree The Tree instance that will be examined by the method.
 * @param item An item found in the dataProvider of the Tree passed in.
 * @param startAtParent A boolean that determines if the method upon
 * initialization will back up one leve3l to the item passed in and
 * start it's recursion at the item's parent node. 
 */
public function walkTree(tree:Tree, item:Object, startAtParent:Boolean = false):void
{
	// get the Tree's data descriptor
	var descriptor:ITreeDataDescriptor = tree.dataDescriptor;
	var cursor:IViewCursor;
 
	var parentItem:Object;
	var childItem:Object;
	var childItems:Object;
 
	// if the item is null, stop
	if (item == null)
		return;
 
	// do we back up one level to the item's parent
	if (startAtParent)
	{
		// get the parent
		parentItem = tree.getParentItem(item);
		// is the parent real
		if (parentItem)
		{
			trace("|-- Parent Node ", parentItem[tree.labelField]);
			// if the parent is a branch
			if (descriptor.isBranch(parentItem))
			{
				// if the branch has children to run through
				if (descriptor.hasChildren(parentItem)) 
				{
					// get the children of the branch
					// this part of the algorithm contains the item
					// passed
					childItems = descriptor.getChildren(parentItem);
				}
			}
			// if the branch has valid child items
			if (childItems)
			{
				// create our back step cursor
				cursor = childItems.createCursor();
				// loop through the items parent's children (item)
				while (!cursor.afterLast)
				{
					// get the current child item
					childItem = cursor.current;
 
					var label:String = childItem[tree.labelField];
					var branch:Boolean = descriptor.isBranch(childItem);
 
					// good place for a custom method()
					trace("Sibling Nodes :: ", label, "Is Branch :: ", branch); 
 
					// if the child item is a branch
					if (descriptor.isBranch(childItem))
						// traverse the childs branch all the way down 
						// before returning
						walkTree(tree, childItem);
					// do it again!
					cursor.moveNext();
				}
			}
		}
	}
	else // we don't want the parent OR this is the second iteration
	{
		// if we are a branch
		if (descriptor.isBranch(item))
		{
			// if the branch has children to run through
			if (descriptor.hasChildren(item)) 
			{
				// get the children of the branch
				childItems = descriptor.getChildren(item);
			}
 
			// if the child items exist
			if (childItems)
			{
				// create our cursor pointer
				cursor = childItems.createCursor();
				// loop through all of the children
				// if one of these children are a branch we will recurse
				while (!cursor.afterLast)
				{
					// get the current child item
					childItem = cursor.current;
 
					var label:String =  childItem[tree.labelField];
					var branch:Boolean = descriptor.isBranch(childItem);
 
					// good place for a custom method()
					trace("-- Sub Node :: ", label, "Is Branch :: ", branch); 
 
					// if the child item is a branch
					if (descriptor.isBranch(childItem))
						// traverse the childs branch all the way down 
						// before returning
						walkTree(tree, childItem);
					// check the next child
					cursor.moveNext();
				}
			}
		}
	}
}
Comments

Thank you for sharing! I

Thank you for sharing! I will use this code in my prooject!

Privacy Policy | Copyright Notice| Disclaimer| Product EULA
©2003-2008 Teoti Graphix, LLC - All rights reserved.