1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4  
     5   /**
     6  * @author firdosh
     7  */
     8  
     9  import org.aswing. *;
    10  import org.aswing.geom. *;
    11  import org.aswing.utils.*;
    12  import org.aswing.graphices.Graphics;
    13  
    14  class org.aswing.JPieChart extends Component
    15  {
    16  	private var _dataSet : Array;
    17  	private var _colorSet : Array;
    18  	private var _angles : Array;
    19  	private var _wedges : Array;
    20  	private var _legends : Array;
    21  	private var _legend_txt : Array;
    22  	private var _title : String;
    23  	private var _showLegend : Boolean;
    24  	private var MAX : Number = 0;
    25  	
    26  	public function JPieChart (title : String, dataSet : Array, colorSet : Array)
    27  	{
    28  		_root.DEBUG.text += "In Constructor";
    29  		super ();
    30  		setName ("JPieChart");
    31  		if (title != null)
    32  		{
    33  			_title = title;
    34  		} 
    35  		else
    36  		{
    37  			_title = "JPieChart";
    38  		}
    39  		if (colorSet != null)
    40  		{
    41  			_colorSet = colorSet;
    42  		} 
    43  		else
    44  		{
    45  			_colorSet = new Array ();
    46  			if (dataSet != null)
    47  			{
    48  				for (var i : Number = 0; i < dataSet.length; i ++)
    49  				{
    50  					_colorSet.push (getRandomnColor ());
    51  				}
    52  			}
    53  		}
    54  		if (dataSet != null)
    55  		{
    56  			_dataSet = dataSet;
    57  		} 
    58  		else
    59  		{
    60  			_dataSet = new Array ();
    61  		}
    62  		_angles = new Array ();
    63  		_wedges = new Array ();
    64  		_legend_txt = new Array ();
    65  	}
    66  	
    67  	/**
    68  	 * Calculates the rotation angle for the value
    69  	 */
    70  	
    71  	private function getRotation (val : Number) : Number
    72  	{
    73  		var rot : Number = 0;
    74  		for (var i : Number = 0; i <= val; i ++)
    75  		{
    76  			rot += _angles [i];
    77  		}
    78  		return rot;
    79  	}
    80  	/**
    81  	 * Calculates the sum of the dataset and the angle
    82  	 */
    83  	private function sortAndLoadDataSet (Void) : Void
    84  	{
    85  		MAX = 0;
    86  		_angles = new Array ();
    87  		_dataSet.sort (Array.NUMERIC);
    88  		for (var i : Number = 0; i < _dataSet.length; i ++)
    89  		{
    90  			MAX += _dataSet [i];
    91  		}
    92  		for (var i : Number = 0; i < _dataSet.length; i ++)
    93  		{
    94  			_angles [i] = (360 * _dataSet [i]) / MAX;			
    95  		}
    96  		
    97  	}
    98  	
    99  	/**
   100  	 * Re paints the component
   101  	 */
   102  	private function paint (b : Rectangle) : Void
   103  	{
   104  		_root.DEBUG.text += "\nIn Paint";
   105  		sortAndLoadDataSet ();
   106  		for (var i : Number = 0; i < _wedges.length; i ++)
   107  		{
   108  			_wedges [i].removeMovieClip ();
   109  			_legends [i].removeMovieClip ();
   110  			_legend_txt [i].removeMovieClip ();
   111  		}
   112  		_wedges = new Array ();
   113  		var graphics : Graphics;
   114  		var loactionY : Number = this.getY ();
   115  		//_root.DEBUG.text+="\n" + "Angles -> " + _angles.length;
   116  		for (var i : Number = 0; i < _angles.length; i ++)
   117  		{
   118  			//_root.DEBUG.text+="In for " +_colorSet[i] + "  " + _angles[i]+"\n";
   119  			var wedge : MovieClip = ElementCreater.getInstance ().createMC (root_mc, "wedge" + i);
   120  			wedge.lineStyle (1, 0x000000, 50);
   121  			wedge.beginFill (_colorSet [i] , 100);
   122  			graphics = new Graphics (wedge);
   123  			graphics.wedge (this.getWidth () / 2, this.getWidth () / 2, this.getHeight () / 2, _angles [i] , getRotation (i - 1));
   124  			wedge.onPress=Delegate.create(this,__onPress,i);
   125  			_wedges.push (wedge);
   126  		}
   127  	}
   128  	
   129  	/**
   130  	 * Dispatches the onPress event
   131  	 */
   132  	private function __onPress (index:Number) : Void
   133  	{
   134  		var e:Event = createPieChartEvent(index);
   135  		dispatchEvent(ON_PRESS, e);
   136  	}
   137  	
   138  	/**
   139  	 * Creates a pie chart event object
   140  	 */
   141  	private function createPieChartEvent(index:Number):Event{
   142  	   var e:Event = createEventObj();
   143  	   e.data = _dataSet[index];  
   144     	   return e;
   145  }
   146  	
   147  	/**
   148  	 * Generates a randomn color
   149  	 */
   150  	private function getRandomnColor (Void) : Number
   151  	{
   152  		var col : String = "0x";
   153  		for (var i : Number = 0; i < 6; i ++)
   154  		{
   155  			var digit : Number = Math.floor (Math.random () * 15);
   156  			if (digit == 10)
   157  			{
   158  				col += "A";
   159  			} 
   160  			else if (digit == 11)
   161  			{
   162  				col += "B";
   163  			} 
   164  			else if (digit == 12)
   165  			{
   166  				col += "C";
   167  			} 
   168  			else if (digit == 13)
   169  			{
   170  				col += "D";
   171  			} 
   172  			else if (digit == 14)
   173  			{
   174  				col += "E";
   175  			} 
   176  			else if (digit == 15)
   177  			{
   178  				col += "F";
   179  			} 
   180  			else
   181  			{
   182  				col += digit + "";
   183  			}
   184  		}
   185  		return new Number (col);
   186  	}
   187  	private function getRandomnGreyScaleColor (Void) : Number
   188  	{
   189  		var col : String = "0x";
   190  		var digit : Number = Math.floor (Math.random () * (9 - 3)) + 3;
   191  		for (var i : Number = 0; i < 6; i ++)
   192  		{
   193  			col += digit + "";
   194  		}
   195  		//_root.DEBUG.text += "\nCOLOR = " + col + "\n";
   196  		return new Number (col);
   197  	}
   198  	
   199  	public function setDataSet(val:Array):Void{
   200  		_dataSet=new Array();
   201  		_dataSet=val;
   202  		paint();
   203  	}
   204  	
   205  	public function getDataSet(Void):Array{
   206  		return _dataSet;
   207  	}
   208  	
   209  	public function setColorSet(val:Array):Void{
   210  		_colorSet=new Array();
   211  		_colorSet=val;
   212  		paint();
   213  	}
   214  	
   215  	public function getColorSet(Void):Array{
   216  		return _colorSet;
   217  	}
   218  	
   219  }
   220