<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: TreeMap code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 03:31:32 GMT</pubDate>
    <description>DZone Snippets: TreeMap code</description>
    <item>
      <title>DeclarativeDescriptor an example of writing a custom DataDescriptor</title>
      <link>http://snippets.dzone.com/posts/show/5673</link>
      <description>&lt;br /&gt;Sometimes it becomes necessary to write a custom DataDescriptor for certain Flex controls (i.e. Tree, TreeMap, etc).  This is a generic data descriptor that allows you to declare a single field name to be used for the children of the given node.  This makes it easy to simple tell Flex to use any field instead of the default "children" field.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package {&lt;br /&gt;	&lt;br /&gt;	import mx.collections.ArrayCollection;&lt;br /&gt;	import mx.collections.CursorBookmark;&lt;br /&gt;	import mx.collections.ICollectionView;&lt;br /&gt;	import mx.collections.IViewCursor;&lt;br /&gt;	import mx.controls.treeClasses.ITreeDataDescriptor;&lt;br /&gt;	import mx.events.CollectionEvent;&lt;br /&gt;	import mx.events.CollectionEventKind;&lt;br /&gt;	&lt;br /&gt;	public class DeclarativeDescriptor implements ITreeDataDescriptor {&lt;br /&gt;		&lt;br /&gt;		private var _fieldname : String;&lt;br /&gt;		&lt;br /&gt;		public function DeclarativeDescriptor( fieldname : String ) {&lt;br /&gt;			_fieldname = fieldname;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public function getChildren(node:Object, model:Object=null) : ICollectionView {&lt;br /&gt;			if( node.hasOwnProperty( _fieldname ) ) {&lt;br /&gt;				return node[_fieldname] is ICollectionView ? node[_fieldname] as ICollectionView : new ArrayCollection( node[_fieldname] );&lt;br /&gt;			} else {&lt;br /&gt;				return null;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public function hasChildren(node:Object, model:Object=null) : Boolean {&lt;br /&gt;			if( isBranch( node, model ) ) {&lt;br /&gt;				var children : ICollectionView = getChildren( node, model );&lt;br /&gt;				return children.length &gt; 0;&lt;br /&gt;			} else {&lt;br /&gt;				return false;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public function isBranch(node:Object, model:Object=null) : Boolean {&lt;br /&gt;			return node.hasOwnProperty(_fieldname);&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public function getData(node:Object, model:Object=null) : Object {&lt;br /&gt;			return node;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public function addChildAt(parent:Object, child:Object, index:int, model:Object=null) : Boolean {&lt;br /&gt;	        var event:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);&lt;br /&gt;	        event.kind = CollectionEventKind.ADD;&lt;br /&gt;	        event.items = [child];&lt;br /&gt;	        event.location = index;&lt;br /&gt;	        if (!parent) {&lt;br /&gt;	            var iterator:IViewCursor = model.createCursor();&lt;br /&gt;	            iterator.seek(CursorBookmark.FIRST, index);&lt;br /&gt;	            iterator.insert(child);&lt;br /&gt;	        } else if (parent is Object) {&lt;br /&gt;	            if (isBranch(parent) ) {&lt;br /&gt;	            	var children : Object = parent[_fieldname];&lt;br /&gt;	                if( children is ArrayCollection) {&lt;br /&gt;	                    children.addItemAt(child, index);&lt;br /&gt;	                    if (model) {&lt;br /&gt;	                        model.dispatchEvent(event);&lt;br /&gt;	                        model.itemUpdated(parent);&lt;br /&gt;	                    }&lt;br /&gt;	                    return true;&lt;br /&gt;	                } else {&lt;br /&gt;	                    children.splice(index, 0, child);&lt;br /&gt;	                    if (model)&lt;br /&gt;	                        model.dispatchEvent(event);&lt;br /&gt;	                    return true;&lt;br /&gt;	                }&lt;br /&gt;	            }&lt;br /&gt;	        }&lt;br /&gt;	        return false;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public function removeChildAt(parent:Object, child:Object, index:int, model:Object=null) : Boolean {&lt;br /&gt;	        var event:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);&lt;br /&gt;	        event.kind = CollectionEventKind.REMOVE;&lt;br /&gt;		    event.items = [child];&lt;br /&gt;		    event.location = index;&lt;br /&gt;		&lt;br /&gt;		    //handle top level where there is no parent&lt;br /&gt;		    if (!parent) {&lt;br /&gt;		        var iterator:IViewCursor = model.createCursor();&lt;br /&gt;		        iterator.seek(CursorBookmark.FIRST, index);&lt;br /&gt;		        iterator.remove();&lt;br /&gt;		        if (model)&lt;br /&gt;		            model.dispatchEvent(event);&lt;br /&gt;		        return true;&lt;br /&gt;		    } else if (parent is Object) {&lt;br /&gt;		    	var children : Object = parent[_fieldname];&lt;br /&gt;		        if (children) {&lt;br /&gt;		            children.splice(index, 1);&lt;br /&gt;		            if (model) &lt;br /&gt;		                model.dispatchEvent(event);&lt;br /&gt;		            return true;&lt;br /&gt;		        }&lt;br /&gt;		    }&lt;br /&gt;		    return false;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 19 Jun 2008 20:05:07 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5673</guid>
      <author>middlec (Charlie)</author>
    </item>
    <item>
      <title>Example of a TreeMap using Objects Instead of XML</title>
      <link>http://snippets.dzone.com/posts/show/5670</link>
      <description>&lt;br /&gt;This is an example of how to use &lt;a href="http://code.google.com/p/flex2treemap/"&gt;Flex2TreeMap&lt;/a&gt; with plain old ActionScript (POASO) objects instead of XML.  You have to declare a dataDescriptor of the TreeMap so you can map companies field to the children of the sector node.&lt;br /&gt;&lt;br /&gt;This class depends on &lt;a href="http://snippets.dzone.com/posts/show/5673"&gt;DeclarativeDescriptor&lt;/a&gt; in order to compile.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:toolbox="http://www.flextoolbox.com/2006/mxml"&gt;&lt;br /&gt;&lt;br /&gt;	&lt;mx:Script&gt;&lt;br /&gt;		&lt;![CDATA[&lt;br /&gt;		&lt;br /&gt;			private const MIN_COLOR:uint = 0xcc0000;&lt;br /&gt;			private const ZERO_COLOR:uint = 0;&lt;br /&gt;			private const MAX_COLOR:uint = 0x00cc00;&lt;br /&gt;			&lt;br /&gt;			private var _maxAbsoluteChange:Number;&lt;br /&gt;			private var __descriptor : DeclarativeDescriptor = new DeclarativeDescriptor("companies");&lt;br /&gt;			&lt;br /&gt;			[Bindable]&lt;br /&gt;			private var marketData : Array = [&lt;br /&gt;				{ name: "Technology",&lt;br /&gt;				  companies: [&lt;br /&gt;					{ name: "WidgetCorp", marketCap: "4200000000", value: 42.01, change: -2.03 },&lt;br /&gt;					{ name: "Sprocket Systems", marketCap: "2100000000", value: 24.87, change: 4.45 },&lt;br /&gt;					{ name: "Gizmodyne", marketCap: "10500000000", value: 106.52, change: 1.01 },&lt;br /&gt;					{ name: "GadgetSoft", marketCap: "1200000000", value: 12.98, change: -0.82 }&lt;br /&gt;				  ]&lt;br /&gt;				},&lt;br /&gt;				{ name: "Financial",&lt;br /&gt;				  companies: [&lt;br /&gt;					{ name: "Parker-Hayes", marketCap: "4550000000", value: 36.74, change: 3.56},&lt;br /&gt;					{ name: "G.A. Harvard", marketCap: "12800000000", value: 21.61, change: -1.71},&lt;br /&gt;					{ name: "P. Royal Trust", marketCap: "8700000000", value: 25.22, change: 2.09},&lt;br /&gt;					{ name: "Houndsworth Bank", marketCap: "1900000000", value: 33.71, change: 0.2}&lt;br /&gt;				  ]&lt;br /&gt;			 	},&lt;br /&gt;				{ name: "Communication",&lt;br /&gt;				  companies: [&lt;br /&gt;				     { name: "Richtel Networks", marketCap: "2400000000", value: 34.93, change: -1.94},&lt;br /&gt;				     { name: "TCI", marketCap: "9600000000", value: 45.82, change: 0.22},&lt;br /&gt;				     { name: "Norizon", marketCap: "1400000000", value: 27.46, change: 1.68}&lt;br /&gt;				  ]&lt;br /&gt;			 	},&lt;br /&gt;			 	{ name: "Energy",&lt;br /&gt;			 	  companies: [&lt;br /&gt;				     { name: "Axxom Monopocorp", marketCap: "3200000000", value: 36.18, change: 5.46},&lt;br /&gt;				     { name: "RP Petrol", marketCap: "7500000000", value: 26.74, change: -3.25},&lt;br /&gt;				     { name: "Lexaco", marketCap: "3900000000", value: 15.96, change: -2.08}&lt;br /&gt;			 	  ]&lt;br /&gt;			 	}&lt;br /&gt;			];&lt;br /&gt;			&lt;br /&gt;			/**&lt;br /&gt;			 * For each item, determines the tooltip text.&lt;br /&gt;			 */&lt;br /&gt;			private function itemToToolTip(item:Object):String&lt;br /&gt;			{&lt;br /&gt;				//one tooltip for branches and one for leaves&lt;br /&gt;				if(this.treeMap.dataDescriptor.isBranch(item))&lt;br /&gt;				{&lt;br /&gt;					return null;&lt;br /&gt;				}&lt;br /&gt;				var capInBillions:Number = Number(item.marketCap) / 1000000000;&lt;br /&gt;				return "Value: " + this.formatter.format(item.value) + "\n" +&lt;br /&gt;					"Change: " + item.change + "%\n" +&lt;br /&gt;					"Market Cap: $" + capInBillions + "B";&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			/**&lt;br /&gt;			 * Takes the absolute value of each change value and determines the maximum.&lt;br /&gt;			 */&lt;br /&gt;			private function calculateMaxAbsoluteChange():void&lt;br /&gt;			{&lt;br /&gt;				var companies:Array = this.marketData.companies;&lt;br /&gt;				this._maxAbsoluteChange = 0;&lt;br /&gt;				for each(var company:Object in companies)&lt;br /&gt;				{&lt;br /&gt;					var change:Number = Number(company.change);&lt;br /&gt;					this._maxAbsoluteChange = Math.max(this._maxAbsoluteChange, Math.abs(change));&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;			/**&lt;br /&gt;			 * For each item, determines the background color.&lt;br /&gt;			 */&lt;br /&gt;			private function itemToColor(item:Object):uint&lt;br /&gt;			{&lt;br /&gt;				var change:Number = Number(item.change);&lt;br /&gt;				if(change &lt; 0)&lt;br /&gt;				{&lt;br /&gt;					return this.blendColors(MIN_COLOR, ZERO_COLOR, Math.abs(change) / this._maxAbsoluteChange);&lt;br /&gt;				}&lt;br /&gt;				else if(change &gt; 0)&lt;br /&gt;				{&lt;br /&gt;					return this.blendColors(ZERO_COLOR, MAX_COLOR, 1 - (Math.abs(change) / this._maxAbsoluteChange));&lt;br /&gt;				}&lt;br /&gt;				return ZERO_COLOR;&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;			/**&lt;br /&gt;			 * Determines the blended color between two separate colors using a range from 0 to 1.&lt;br /&gt;			 */&lt;br /&gt;			private function blendColors(color1:uint, color2:uint, percent:Number = 0.5):uint&lt;br /&gt;			{&lt;br /&gt;				var remaining:Number = 1 - percent;&lt;br /&gt;				&lt;br /&gt;				var red1:uint = (color1 &gt;&gt; 16) &amp; 0xff;&lt;br /&gt;				var green1:uint = (color1 &gt;&gt; 8) &amp; 0xff;&lt;br /&gt;				var blue1:uint = color1 &amp; 0xff;&lt;br /&gt;				&lt;br /&gt;				var red2:uint = (color2 &gt;&gt; 16) &amp; 0xff;&lt;br /&gt;				var green2:uint = (color2 &gt;&gt; 8) &amp; 0xff;&lt;br /&gt;				var blue2:uint = color2 &amp; 0xff;&lt;br /&gt;				 &lt;br /&gt;				color1 = ((red1 * percent) &lt;&lt; 16) + ((green1 * percent) &lt;&lt; 8) + blue1 * percent;&lt;br /&gt;				color2 = ((red2 * remaining) &lt;&lt; 16) + ((green2 * remaining) &lt;&lt; 8) + blue2 * remaining;&lt;br /&gt;	&lt;br /&gt;				return color1 + color2;&lt;br /&gt;	&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;		]]&gt;&lt;br /&gt;	&lt;/mx:Script&gt;&lt;br /&gt;&lt;br /&gt;	&lt;toolbox:TreeMap id="treeMap" width="400" height="300"&lt;br /&gt;		dataProvider="{marketData}" labelField="name" weightField="marketCap"&lt;br /&gt;		colorFunction="{itemToColor}" dataTipFunction="{itemToToolTip}" dataDescriptor="{__descriptor}"/&gt;&lt;br /&gt;	&lt;br /&gt;	&lt;mx:CurrencyFormatter id="formatter"/&gt;&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;&lt;/mx:Application&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 18 Jun 2008 21:44:05 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5670</guid>
      <author>middlec (Charlie)</author>
    </item>
    <item>
      <title>Printing out a Map in sorted order</title>
      <link>http://snippets.dzone.com/posts/show/5283</link>
      <description>// print out a Map in sorted order of its keys&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    public static String dumpToString(Map&lt;String, Object&gt; map) {&lt;br /&gt;        if (map == null) {&lt;br /&gt;            return Constants.EMPTY_STRING;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        StringBuffer strbuf = new StringBuffer();&lt;br /&gt;&lt;br /&gt;        SortedMap&lt;String, Object&gt; sMap = new TreeMap&lt;String, Object&gt;(map);&lt;br /&gt;        Set&lt;Map.Entry&lt;String, Object&gt;&gt; s = sMap.entrySet();&lt;br /&gt;&lt;br /&gt;        for (Map.Entry&lt;String, Object&gt; elem : s) {&lt;br /&gt;            String key = elem.getKey();&lt;br /&gt;            Object value = elem.getValue();&lt;br /&gt;            strbuf.append(key);&lt;br /&gt;            strbuf.append("=");&lt;br /&gt;            strbuf.append(value == null ? Constants.EMPTY_STRING : value);&lt;br /&gt;            strbuf.append("\r\n");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return strbuf.toString();&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 27 Mar 2008 09:09:50 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5283</guid>
      <author>Archanciel (Jean-Pierre Schnyder)</author>
    </item>
  </channel>
</rss>
