added simple graphs into the code history view
This commit is contained in:
		| @ -106,5 +106,6 @@ LICENSE | |||||||
|    JavaScript Creole 1.0 Wiki Markup Parser     See src/js/creole.js |    JavaScript Creole 1.0 Wiki Markup Parser     See src/js/creole.js | ||||||
|    jQuery JavaScript Library v1.4.2             See http://jquery.org/license |    jQuery JavaScript Library v1.4.2             See http://jquery.org/license | ||||||
|    jQuery UI 1.8                                MIT or GPL |    jQuery UI 1.8                                MIT or GPL | ||||||
|  |    PHPGraphLib                                  MIT | ||||||
|    ------------------------------------------------------------------------ |    ------------------------------------------------------------------------ | ||||||
|  |  | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ License: GPL | |||||||
| Group: Applications/Utilities | Group: Applications/Utilities | ||||||
| Source0: %{name}-%{version}.tar.gz | Source0: %{name}-%{version}.tar.gz | ||||||
|  |  | ||||||
| Requires: httpd php php-ldap php-mysql subversion subversion-perl mod_dav_svn mod_perl perl-LDAP perl-Config-Simple perl-URI perl-DBI perl-Digest-SHA1 | Requires: httpd php php-ldap php-mysql php-gd subversion subversion-perl mod_dav_svn mod_perl perl-LDAP perl-Config-Simple perl-URI perl-DBI perl-Digest-SHA1 | ||||||
|  |  | ||||||
| #BuildRequires: | #BuildRequires: | ||||||
| BuildRoot: %{_tmppath}/%{name}-%{version}-root | BuildRoot: %{_tmppath}/%{name}-%{version}-root | ||||||
|  | |||||||
| @ -635,4 +635,61 @@ class Code extends Controller | |||||||
| 		return $path; | 		return $path; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	function graph ($type = '', $projectid = '', $path = '') | ||||||
|  | 	{ | ||||||
|  | 		$this->load->model ('SubversionModel', 'subversion'); | ||||||
|  |  | ||||||
|  | 		$path = $this->converter->HexToAscii ($path); | ||||||
|  | 		if ($path == '.') $path = ''; /* treat a period specially */ | ||||||
|  | 		$path = $this->_normalize_path ($path); | ||||||
|  |  | ||||||
|  | 		$file = $this->subversion->getHistory ($projectid, $path, SVN_REVISION_HEAD); | ||||||
|  | 		$history = $file['history']; | ||||||
|  | 		$history_count = count($history); | ||||||
|  |  | ||||||
|  | 			 | ||||||
|  | 		if ($type == 'commit-share-by-users') | ||||||
|  | 		{ | ||||||
|  | 			$stats = array(); | ||||||
|  | 			for ($i = 0; $i < $history_count; $i++) | ||||||
|  | 			{ | ||||||
|  | 				$h = $history[$i]; | ||||||
|  | 				if (array_key_exists ($h['author'], $stats)) | ||||||
|  | 					$stats[$h['author']]++; | ||||||
|  | 				else  | ||||||
|  | 					$stats[$h['author']] = 1; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$this->load->library ('PHPGraphLibPie', array ('width' => 400, 'height' => 300), 'graph'); | ||||||
|  | 			$this->graph->addData($stats); | ||||||
|  | 			$this->graph->setTitle("Commit share by users"); | ||||||
|  | 			$this->graph->setLabelTextColor('50,50,50'); | ||||||
|  | 			$this->graph->setLegendTextColor('50,50,50'); | ||||||
|  | 			$this->graph->createGraph(); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			$stats = array(); | ||||||
|  | 			for ($i = 0; $i < $history_count; $i++) | ||||||
|  | 			{ | ||||||
|  | 				$h = $history[$i]; | ||||||
|  | 				if (array_key_exists ($h['author'], $stats)) | ||||||
|  | 					$stats[$h['author']]++; | ||||||
|  | 				else  | ||||||
|  | 					$stats[$h['author']] = 1; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$this->load->library ('PHPGraphLib', array ('width' => 400, 'height' => 300), 'graph'); | ||||||
|  | 			$this->graph->addData($stats); | ||||||
|  | 			$this->graph->setTitle("Commits by users"); | ||||||
|  | 			$this->graph->setDataPoints(TRUE); | ||||||
|  | 			$this->graph->setDataValues(TRUE); | ||||||
|  | 			//$this->graph->setLine(TRUE); | ||||||
|  | 			$this->graph->setBars(TRUE); | ||||||
|  | 			//$this->graph->setXValuesHorizontal(TRUE); | ||||||
|  | 			$this->graph->createGraph(); | ||||||
|  |  | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,7 +4,9 @@ www_DATA =  \ | |||||||
| 	index.html \ | 	index.html \ | ||||||
| 	Lang_detect.php \ | 	Lang_detect.php \ | ||||||
| 	issuehelper.php \ | 	issuehelper.php \ | ||||||
| 	wikihelper.php  | 	wikihelper.php \ | ||||||
|  | 	phpgraphlib.php \ | ||||||
|  | 	phpgraphlibpie.php | ||||||
|  |  | ||||||
| EXTRA_DIST = $(www_DATA) | EXTRA_DIST = $(www_DATA) | ||||||
|  |  | ||||||
|  | |||||||
| @ -144,7 +144,9 @@ www_DATA = \ | |||||||
| 	index.html \ | 	index.html \ | ||||||
| 	Lang_detect.php \ | 	Lang_detect.php \ | ||||||
| 	issuehelper.php \ | 	issuehelper.php \ | ||||||
| 	wikihelper.php  | 	wikihelper.php \ | ||||||
|  | 	phpgraphlib.php \ | ||||||
|  | 	phpgraphlibpie.php | ||||||
|  |  | ||||||
| EXTRA_DIST = $(www_DATA) | EXTRA_DIST = $(www_DATA) | ||||||
| all: all-am | all: all-am | ||||||
|  | |||||||
							
								
								
									
										1619
									
								
								codepot/src/codepot/libraries/phpgraphlib.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1619
									
								
								codepot/src/codepot/libraries/phpgraphlib.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										390
									
								
								codepot/src/codepot/libraries/phpgraphlibpie.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										390
									
								
								codepot/src/codepot/libraries/phpgraphlibpie.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,390 @@ | |||||||
|  | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  | PHPGraphLib Graphing Library | ||||||
|  |  | ||||||
|  | The first version PHPGraphLib was written in 2007 by Elliott Brueggeman to | ||||||
|  | deliver PHP generated graphs quickly and easily. It has grown in both features | ||||||
|  | and maturity since its inception, but remains PHP 4.04+ compatible. Originally | ||||||
|  | available only for paid commerial use, PHPGraphLib was open-sourced in 2013  | ||||||
|  | under the MIT License. Please visit http://www.ebrueggeman.com/phpgraphlib  | ||||||
|  | for more information. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | The MIT License (MIT) | ||||||
|  |  | ||||||
|  | Copyright (c) 2013 Elliott Brueggeman | ||||||
|  |  | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be included in | ||||||
|  | all copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  | THE SOFTWARE. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | define('__ROOT__', dirname(__FILE__)); | ||||||
|  | require_once(__ROOT__.'/phpgraphlib.php');  | ||||||
|  |  | ||||||
|  | class PHPGraphLibPie extends PHPGraphLib  | ||||||
|  | { | ||||||
|  | 	const PIE_3D_HEIGHT_PERCENT = 4; | ||||||
|  | 	const PIE_LEGEND_TEXT_WIDTH = 6; | ||||||
|  | 	const PIE_LEGEND_TEXT_HEIGHT = 12; | ||||||
|  | 	const PIE_LABEL_TEXT_WIDTH = 6; | ||||||
|  | 	const PIE_LABEL_TEXT_HEIGHT = 12; | ||||||
|  | 	const PIE_LEGEND_PADDING = 5;  | ||||||
|  | 	const PIE_CENTER_Y_OFFSET = 50; //in % | ||||||
|  | 	const PIE_CENTER_X_OFFSET = 50; //in % | ||||||
|  | 	const PIE_CENTER_LEGEND_SCALE = 55; //offset in % of existing coords when legend | ||||||
|  | 	const PIE_WIDTH_PERCENT = 75; //default width % of total width | ||||||
|  | 	const PIE_HEIGHT_PERCENT = 28;  | ||||||
|  | 	const PIE_LABEL_SCALE = 90; //in % scale width/height if data labels | ||||||
|  | 	const PIE_LEGEND_SCALE = 64;//in % scale width/height if legend | ||||||
|  |  | ||||||
|  | 	//internals - do not change | ||||||
|  | 	protected $pie_width; | ||||||
|  | 	protected $pie_height; | ||||||
|  | 	protected $pie_center_x; | ||||||
|  | 	protected $pie_center_y; | ||||||
|  | 	protected $pie_legend_x; | ||||||
|  | 	protected $pie_legend_y; | ||||||
|  | 	protected $pie_data_label_space; | ||||||
|  | 	protected $pie_3D_height; | ||||||
|  |  | ||||||
|  | 	protected $pie_data_max_length = 0; | ||||||
|  | 	protected $pie_color_pointer = 0; | ||||||
|  | 	protected $pie_data_array_percents = array(); | ||||||
|  | 	protected $bool_x_axis = false; | ||||||
|  | 	protected $bool_y_axis = false; | ||||||
|  | 	protected $bool_data_points = false; | ||||||
|  | 	protected $pie_precision = 0; //number of significant digits in label % | ||||||
|  | 	protected $bool_legend = true; | ||||||
|  | 	protected $bool_data_labels = true; | ||||||
|  |  | ||||||
|  | 	//default colors, in order of display on graph | ||||||
|  | 	protected $pie_avail_colors = array( | ||||||
|  | 		'pastel_orange_1', 'pastel_orange_2', 'pastel_blue_1', 'pastel_green_1', | ||||||
|  | 		'clay', 'pastel_blue_2', 'pastel_yellow', 'silver', 'pastel_green_2', | ||||||
|  | 		'brown', 'gray', 'pastel_purple', 'olive', 'aqua', 'yellow', 'teal', 'lime' | ||||||
|  | 	); | ||||||
|  |  | ||||||
|  | 	protected function calcCoords()  | ||||||
|  | 	{ | ||||||
|  | 		//calc coords of pie center and width/height | ||||||
|  | 		$this->pie_width = $this->width * (self::PIE_WIDTH_PERCENT / 100); | ||||||
|  | 		$this->pie_height = $this->width * (self::PIE_HEIGHT_PERCENT / 100); | ||||||
|  | 		$this->pie_center_y = $this->height * (self::PIE_CENTER_Y_OFFSET / 100); | ||||||
|  | 		$this->pie_center_x = $this->width * (self::PIE_CENTER_X_OFFSET / 100); | ||||||
|  |  | ||||||
|  | 		//set data label spacing  | ||||||
|  | 		if ($this->bool_data_labels) { | ||||||
|  | 			//set to number of pixels that are equal to text width | ||||||
|  | 			//7 is a base spacer that all labels get | ||||||
|  | 			$this->pie_data_label_space = 7 + $this->width / 30; | ||||||
|  | 			$this->pie_width *= self::PIE_LABEL_SCALE / 100; | ||||||
|  | 			$this->pie_height *= self::PIE_LABEL_SCALE / 100; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ($this->bool_legend) { | ||||||
|  | 			//compensate for legend with lesser preset percent | ||||||
|  | 			$this->pie_width *= self::PIE_LEGEND_SCALE / 100; | ||||||
|  | 			$this->pie_height *= self::PIE_LEGEND_SCALE / 100; | ||||||
|  | 			$this->pie_center_x *= self::PIE_CENTER_LEGEND_SCALE / 100; | ||||||
|  | 		} | ||||||
|  | 		$this->pie_3D_height = self::PIE_3D_HEIGHT_PERCENT * ($this->pie_width / 100);	 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function setupData()  | ||||||
|  | 	{ | ||||||
|  | 		//in the pie extension, this will calculate the total sum and the corresponding percentages | ||||||
|  | 		if ($this->data_set_count == 1) { | ||||||
|  | 			$sum = array_sum($this->data_array[0]); | ||||||
|  | 			if ($sum > 0) { | ||||||
|  | 				foreach ($this->data_array[0] as $dataText => $dataValue) { | ||||||
|  | 					$this->pie_data_array_percents[] = $dataValue / $sum; | ||||||
|  | 					//find data text length | ||||||
|  | 					$len = strlen($dataText); | ||||||
|  | 					if ($len > $this->pie_data_max_length) { | ||||||
|  | 						$this->pie_data_max_length = $len; } | ||||||
|  | 				} | ||||||
|  | 				$this->bool_bars_generate = true; | ||||||
|  | 			} else { | ||||||
|  | 				$this->bool_bars_generate = false; | ||||||
|  | 				$this->error[] = "Sum of data must be greater than 0."; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			$this->error[]="Multiple datasets not allowed with pie charts"; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function generateLegend()  | ||||||
|  | 	{ | ||||||
|  | 		$maxChars = NULL; | ||||||
|  | 		//calc height / width based on # of values | ||||||
|  | 		$pie_legend_height = (self::PIE_LEGEND_TEXT_HEIGHT * $this->data_count) + (2 * self::PIE_LEGEND_PADDING);	 | ||||||
|  | 		$pie_legend_width = ($this->pie_data_max_length * self::PIE_LEGEND_TEXT_WIDTH) + (6 * self::PIE_LEGEND_PADDING); | ||||||
|  |  | ||||||
|  | 		//allotted space does not include padding around legend (smaller) | ||||||
|  | 		$allottedSpace = $this->width - $this->pie_center_x - ($this->pie_width / 2) - (2 * self::PIE_LEGEND_PADDING); | ||||||
|  | 		if ($this->bool_data_labels) { | ||||||
|  | 			//also compensate for displayed text data % on graph | ||||||
|  | 			$allottedSpace -= ((4 + $this->pie_precision) * self::PIE_LABEL_TEXT_WIDTH) + $this->pie_data_label_space; | ||||||
|  | 		} | ||||||
|  | 		//check to make sure we are not > allotted space | ||||||
|  | 		if ($pie_legend_width > $allottedSpace) { | ||||||
|  | 			//if we are, adjust width and max length for data values | ||||||
|  | 			//4 = padding | swatch(padding width) | padding | ...text... |padding | ||||||
|  | 			$swatchAndPaddingWidth = 4 * self::PIE_LEGEND_PADDING; | ||||||
|  | 			//MAX CHARS = ALOTTED SPACE - ENOUGH ROOM FOR SWATCHES / TEXT WIDTH | ||||||
|  | 			$maxChars = floor(($allottedSpace - $swatchAndPaddingWidth) / self::PIE_LEGEND_TEXT_WIDTH); | ||||||
|  | 			$pie_legend_width = ($maxChars * self::PIE_LEGEND_TEXT_WIDTH) + $swatchAndPaddingWidth; | ||||||
|  | 		} else { | ||||||
|  | 			//we didnt go over allotted space, so we should adjust the center of the pie chart now | ||||||
|  | 			$equalSpacing = ($this->width - ($this->pie_width + $pie_legend_width)) / 3; | ||||||
|  | 			//so now reposition center at spacing + 1/2 pie width | ||||||
|  | 			$this->pie_center_x = ($this->pie_width / 2) + $equalSpacing; | ||||||
|  | 		} | ||||||
|  | 		//auto adjusting formula for position of pie_legend_x based on pie chart size | ||||||
|  | 		$a = ($this->pie_center_x + $this->pie_width / 2); | ||||||
|  | 		$b = $this->width - $a; | ||||||
|  | 		$c = ($b - $pie_legend_width) / 2; | ||||||
|  | 		//set pie x & y args | ||||||
|  | 		$this->pie_legend_x = $a + $c; | ||||||
|  | 		$this->pie_legend_y = ($this->height - $pie_legend_height) / 2;		 | ||||||
|  | 		//background | ||||||
|  | 		imagefilledrectangle($this->image, $this->pie_legend_x, $this->pie_legend_y, $this->pie_legend_x + $pie_legend_width,  | ||||||
|  | 			$this->pie_legend_y + $pie_legend_height, $this->legend_color); | ||||||
|  | 		//border | ||||||
|  | 		imagerectangle($this->image, $this->pie_legend_x, $this->pie_legend_y, $this->pie_legend_x + $pie_legend_width,  | ||||||
|  | 			$this->pie_legend_y + $pie_legend_height, $this->legend_outline_color); | ||||||
|  | 		$xValue = $this->pie_legend_x + self::PIE_LEGEND_PADDING; | ||||||
|  | 		$count = 0; | ||||||
|  | 		$this->resetColorPointer(); | ||||||
|  | 		$swatchToTextOffset = (self::PIE_LEGEND_TEXT_HEIGHT - 6) / 2; | ||||||
|  | 		$swatchSize = self::PIE_LEGEND_TEXT_HEIGHT - (2 * $swatchToTextOffset); | ||||||
|  | 		foreach ($this->data_array[0] as $dataText => $dataValue) { | ||||||
|  | 			$yValue = $this->pie_legend_y + self::PIE_LEGEND_TEXT_HEIGHT * $count + self::PIE_LEGEND_PADDING; | ||||||
|  | 			//draw color boxes | ||||||
|  | 			$color = $this->generateNextColor(); | ||||||
|  | 			imagefilledrectangle($this->image, $xValue, $yValue + $swatchToTextOffset, $xValue + $swatchSize, $yValue + $swatchToTextOffset + $swatchSize, $color); | ||||||
|  | 			imagerectangle($this->image, $xValue, $yValue + $swatchToTextOffset, $xValue + $swatchSize, $yValue + $swatchToTextOffset + $swatchSize, $this->legend_swatch_outline_color);	 | ||||||
|  | 			//if longer than our max, trim text | ||||||
|  | 			if ($maxChars) {  | ||||||
|  | 				$dataText = substr($dataText,0, $maxChars);  | ||||||
|  | 			} | ||||||
|  | 			imagestring($this->image, 2, $xValue + (2 * self::PIE_LEGEND_PADDING), $yValue, $dataText, $this->legend_text_color); | ||||||
|  | 			$count++; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function generateBars() | ||||||
|  | 	{ | ||||||
|  | 		$this->resetColorPointer(); | ||||||
|  | 		//loop through and create shadaing | ||||||
|  | 		for ($i = $this->pie_center_y + $this->pie_3D_height; $i > $this->pie_center_y; $i--) { | ||||||
|  | 			$arcStart = 0; | ||||||
|  | 			foreach ($this->pie_data_array_percents as $key => $value) { | ||||||
|  | 				$color = $this->generateNextColor(true);  | ||||||
|  | 				// generate a darker version of the indexed color | ||||||
|  | 				// do not draw if the value is zero | ||||||
|  | 				if (! $value == 0){ | ||||||
|  | 					imagefilledarc($this->image, $this->pie_center_x, $i, $this->pie_width, $this->pie_height, $arcStart, (360 * $value) + $arcStart, $color, IMG_ARC_PIE); | ||||||
|  | 					$arcStart += 360*$value; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			$this->resetColorPointer(); | ||||||
|  | 		} | ||||||
|  | 		$arcStart = 0;	 | ||||||
|  | 		foreach ($this->pie_data_array_percents as $key => $value) { | ||||||
|  | 			$color = $this->generateNextColor(); | ||||||
|  | 			// do not draw if the value is zero | ||||||
|  | 			if (! $value == 0){ | ||||||
|  | 				imagefilledarc($this->image, $this->pie_center_x, $this->pie_center_y, $this->pie_width, $this->pie_height, $arcStart, (360*$value)+$arcStart, $color, IMG_ARC_PIE); | ||||||
|  | 				$arcStart += 360 * $value; | ||||||
|  | 			} | ||||||
|  | 			if ($this->bool_data_labels) {  | ||||||
|  | 				$this->generateDataLabel($value, $arcStart);  | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function generateDataLabel($value, $arcStart)  | ||||||
|  | 	{ | ||||||
|  | 		//midway if the mid arc angle of the wedge we just drew | ||||||
|  | 		$midway = ($arcStart - (180 * $value)); | ||||||
|  | 		//adjust for ellipse height/width ratio | ||||||
|  | 		$skew = self::PIE_HEIGHT_PERCENT / self::PIE_WIDTH_PERCENT; | ||||||
|  | 		$pi = atan(1.0) * 4.0; | ||||||
|  | 		$theta = ($midway / 180) * $pi; | ||||||
|  | 		$valueX = $this->pie_center_x + ($this->pie_width / 2 + $this->pie_data_label_space) * cos($theta); | ||||||
|  | 		$valueY = $this->pie_center_y + ($this->pie_width / 2 + $this->pie_data_label_space) * sin($theta) * $skew; | ||||||
|  | 		$displayValue = $this->formatPercent($value); | ||||||
|  | 		$valueArray = $this->dataLabelHandicap($valueX, $valueY, $displayValue, $midway); | ||||||
|  | 		$valueX = $valueArray[0]; | ||||||
|  | 		$valueY = $valueArray[1];	 | ||||||
|  | 		imagestring($this->image, 2, $valueX, $valueY, $displayValue, $this->label_text_color); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function formatPercent($input)  | ||||||
|  | 	{	 | ||||||
|  | 		return number_format($input * 100, $this->pie_precision) . '%'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function dataLabelHandicap($x, $y, $value, $midway)  | ||||||
|  | 	{ | ||||||
|  | 		//moves data label x/y based on quadrant and length of displayed data | ||||||
|  | 		//and how text is displayed (upper left corner x/y) | ||||||
|  | 		//extra 1 for % sign | ||||||
|  | 		$lengthOffset = (strlen($value) * (self::PIE_LABEL_TEXT_WIDTH)) / 2; | ||||||
|  | 		$vertOffset = self::PIE_LABEL_TEXT_HEIGHT / 2; | ||||||
|  | 		if ($midway <= 30) { | ||||||
|  | 			$newX = $x - (1.5 * $lengthOffset); | ||||||
|  | 			$newY = $y - $vertOffset; | ||||||
|  | 		} elseif ($midway > 30 && $midway <= 135) { | ||||||
|  | 			$newX = $x - $lengthOffset; | ||||||
|  | 			$newY = $y - $vertOffset + $this->pie_3D_height; | ||||||
|  | 		} elseif ($midway > 135 && $midway <= 165) { | ||||||
|  | 			$newX = $x - $lengthOffset; | ||||||
|  | 			$newY = $y - $vertOffset; | ||||||
|  | 		} elseif ($midway > 165 && $midway <= 200) { | ||||||
|  | 			//value at risk for being out of bounds on smaller graphs | ||||||
|  | 			$newX = $x - (1/3 * $lengthOffset); | ||||||
|  | 			$newY = $y - $vertOffset; | ||||||
|  | 		} elseif ($midway > 200 && $midway <= 330) { | ||||||
|  | 			$newX = $x - $lengthOffset; | ||||||
|  | 			$newY = $y - $vertOffset; | ||||||
|  | 		} elseif ($midway > 330) { | ||||||
|  | 			//value at risk for overlapping the legend on smaller graphs | ||||||
|  | 			$newX = $x - (1.5 * $lengthOffset); | ||||||
|  | 			$newY = $y - $vertOffset; | ||||||
|  | 		} else { | ||||||
|  | 			$newX = $x - $lengthOffset; | ||||||
|  | 			$newY = $y - $vertOffset; | ||||||
|  | 		} | ||||||
|  | 		return array($newX, $newY); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function generateNextColor($dark = false)  | ||||||
|  | 	{ | ||||||
|  | 		$array = $this->returnColorArray($this->pie_avail_colors[$this->pie_color_pointer]); | ||||||
|  | 		if ($dark) { | ||||||
|  | 			//we are trying to generate a darker version of the existing color | ||||||
|  | 			$array[0] *= .8; | ||||||
|  | 			$array[1] *= .8; | ||||||
|  | 			$array[2] *= .8; | ||||||
|  | 		} | ||||||
|  | 		$color = imagecolorallocate($this->image, $array[0], $array[1], $array[2]); | ||||||
|  | 		$this->pie_color_pointer++; | ||||||
|  | 		if ($this->pie_color_pointer >= count($this->pie_avail_colors)) { | ||||||
|  | 			$this->pie_color_pointer = 0; | ||||||
|  | 		} | ||||||
|  | 		return $color; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function resetColorPointer()  | ||||||
|  | 	{ | ||||||
|  | 		$this->pie_color_pointer = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected function returnColorArray($color)  | ||||||
|  | 	{ | ||||||
|  | 		//this function first checks exisitng colors in phpgraphlib | ||||||
|  | 		//then if not found checks its own list | ||||||
|  | 		//comes with various preset lighter pie chart friendly colors | ||||||
|  | 		if ($resultColor = parent::returnColorArray($color)) { | ||||||
|  | 			return $resultColor; | ||||||
|  | 		} else { | ||||||
|  | 			//remove last error generated (phpgraphlib::returncolorarray) sets only one error if false) | ||||||
|  | 			array_pop($this->error); | ||||||
|  | 			//check to see if numeric color passed through in form '128,128,128' | ||||||
|  | 			if (strpos($color,',') !== false) { | ||||||
|  | 				return explode(',', $color); | ||||||
|  | 			} | ||||||
|  | 			switch(strtolower($color)) { | ||||||
|  | 				//named colors based on w3c's recommended html colors | ||||||
|  | 				case 'pastel_orange_1': return array(238,197,145); break; | ||||||
|  | 				case 'pastel_orange_2': return array(238,180,34); break; | ||||||
|  | 				case 'pastel_blue_1':   return array(122,197,205); break; | ||||||
|  | 				case 'pastel_green_1':  return array(102,205,0); break; | ||||||
|  | 				case 'pastel_blue_2':   return array(125,167,217); break; | ||||||
|  | 				case 'pastel_green_2':  return array(196,223,155); break; | ||||||
|  | 				case 'clay':            return array(246,142,85); break; | ||||||
|  | 				case 'pastel_yellow':   return array(255,247,153); break; | ||||||
|  | 				case 'pastel_purple':   return array(135,129,189); break; | ||||||
|  | 				case 'brown':           return array(166,124,81); break;	 | ||||||
|  | 			} | ||||||
|  | 			$this->error[] = "Color name \"$color\" not recogized."; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	protected function generateTitle() | ||||||
|  | 	{ | ||||||
|  | 		//draws title b/t top of graph and edge of canvas | ||||||
|  | 		$pieTop = $this->pie_center_y - ($this->pie_height / 2); | ||||||
|  | 		if ($this->bool_legend) { | ||||||
|  | 			$topElement = ($pieTop < $this->pie_legend_y) ? $pieTop : $this->pie_legend_y; | ||||||
|  | 		} else { | ||||||
|  | 			$topElement = $pieTop; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ($topElement < 0) { | ||||||
|  | 			$this->error[] = "Not enough room for a title. Increase graph height, or eliminate data values."; | ||||||
|  | 		} else { | ||||||
|  | 			$title_y = ($topElement / 2) - (self::TITLE_CHAR_HEIGHT / 2); | ||||||
|  | 			$title_x = ($this->width / 2) - ((strlen($this->title_text) * self::TITLE_CHAR_WIDTH) / 2); | ||||||
|  | 			imagestring($this->image, 2, $title_x , $title_y , $this->title_text,  $this->title_color); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function setLabelTextColor($color) | ||||||
|  | 	{ | ||||||
|  | 		$this->setGenericColor($color, '$this->label_text_color', "Label text color not specified properly."); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function setPrecision($digits) | ||||||
|  | 	{ | ||||||
|  | 		if (is_int($digits)) {  | ||||||
|  | 			$this->pie_precision = $digits; | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$this->error[] = "Integer arg for setPrecision() not specified properly."; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function setDataLabels($bool)  | ||||||
|  | 	{ | ||||||
|  | 		if (is_bool($bool)) {  | ||||||
|  | 			$this->bool_data_labels = $bool; | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		$this->error[] = "Boolean arg for setDataLabels() not specified properly.";  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	//overwritten and unused PHPGraphLib functions | ||||||
|  | 	function setDataPoints($bool)  | ||||||
|  | 	{  | ||||||
|  | 		$this->error[] = __function__ . '() function not allowed in PHPGraphLib Stacked extension.';  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function calcTopMargin() {} | ||||||
|  | 	function calcRightMargin() {} | ||||||
|  | 	function setupGrid() {} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ?> | ||||||
| @ -79,6 +79,17 @@ $this->load->view ( | |||||||
| </div> <!-- code_history_mainarea_menu --> | </div> <!-- code_history_mainarea_menu --> | ||||||
|  |  | ||||||
| <div id="code_history_mainarea_result"> | <div id="code_history_mainarea_result"> | ||||||
|  |  | ||||||
|  | <?php | ||||||
|  | 	$xfullpath = $this->converter->AsciiToHex (($fullpath == '')? '.': $fullpath); | ||||||
|  |  | ||||||
|  | 	$graph_url = site_url() . "/code/graph/commits-by-users/{$project->id}/{$xfullpath}"; | ||||||
|  | 	print "<img src='{$graph_url}' />"; | ||||||
|  |  | ||||||
|  | 	$graph_url = site_url() . "/code/graph/commit-share-by-users/{$project->id}/{$xfullpath}"; | ||||||
|  | 	print "<img src='{$graph_url}' />"; | ||||||
|  | ?> | ||||||
|  |  | ||||||
| <table id="code_history_mainarea_result_table"> | <table id="code_history_mainarea_result_table"> | ||||||
| <tr class='heading'> | <tr class='heading'> | ||||||
| 	<th><?=$this->lang->line('Revision')?></th> | 	<th><?=$this->lang->line('Revision')?></th> | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user