// 0 % vertical label margin $graph->SetLabelVMarginFactor(1); // Format the bar for the first activity // ($row,$title,$startdate,$enddate) $activity = new GanttBar(0, "Project", "2001-12-21", "2002-01-07", "[50%]"); // Yellow diagonal line pattern on a red background $activity->SetPattern(BAND_RDIAG, "yellow"); $activity->SetFillColor("red"); // Set absolute height $activity->SetHeight(10); // Specify progress to 60% $activity->progress->Set(0.6); // Format the bar for the second activity // ($row,$title,$startdate,$enddate) $activity2 = new GanttBar(1, "Project", "2001-12-21", "2002-01-02", "[30%]"); // Yellow diagonal line pattern on a red background $activity2->SetPattern(BAND_RDIAG, "yellow"); $activity2->SetFillColor("red"); // Set absolute height $activity2->SetHeight(10); // Specify progress to 30% $activity2->progress->Set(0.3); // Finally add the bar to the graph $graph->Add($activity); $graph->Add($activity2); // Add a vertical line $vline = new GanttVLine("2001-12-24", "Phase 1"); $vline->SetDayOffset(0.5); //$graph->Add($vline); // ... and display it $graph->Stroke();
$bar->SetFillColor("red"); // To indicate progress each bar can have a smaller bar within // For illustrative purpose just set the progress to 50% for each bar $bar->progress->Set(0.5); // Each bar may also have optional left and right plot marks // As illustration lets put a filled circle with a number at the end // of each bar $bar->rightMark->SetType(MARK_FILLEDCIRCLE); $bar->rightMark->SetFillColor("red"); $bar->rightMark->SetColor("red"); $bar->rightMark->SetWidth(10); // Title for the mark $bar->rightMark->title->Set("" . $i + 1); $bar->rightMark->title->SetColor("white"); $bar->rightMark->title->SetFont(FF_ARIAL, FS_BOLD, 10); $bar->rightMark->Show(); // ... and add the bar to the gantt chart $graph->Add($bar); } // Create a milestone mark $ms = new MileStone(7, "M5", "2001-12-10", "10/12"); $ms->title->SetFont(FF_FONT1, FS_BOLD); $graph->Add($ms); // Create a vertical line to emphasize the milestone $vl = new GanttVLine("2001-12-10 13:00", "Phase 1", "darkred"); $vl->SetDayOffset(0.5); // Center the line in the day $graph->Add($vl); // Output the graph $graph->Stroke(); // EOF
$graph->scale->month->SetBackgroundColor("blue"); // Format the bar for the first activity // ($row,$title,$startdate,$enddate) $activity = new GanttBar(0, "Project", "2001-12-21", "2002-01-20"); // Yellow diagonal line pattern on a red background $activity->SetPattern(BAND_RDIAG, "yellow"); $activity->SetFillColor("red"); // Add a right marker $activity->rightMark->Show(); $activity->rightMark->SetType(MARK_FILLEDCIRCLE); $activity->rightMark->SetWidth(13); $activity->rightMark->SetColor("red"); $activity->rightMark->SetFillColor("red"); $activity->rightMark->title->Set("M5"); $activity->rightMark->title->SetFont(FF_ARIAL, FS_BOLD, 12); $activity->rightMark->title->SetColor("white"); // Set absolute height $activity->SetHeight(8); // Finally add the bar to the graph $graph->Add($activity); // Create a miletone $milestone = new MileStone(2, "Milestone", "2002-01-15", "2002-01-15"); $milestone->title->SetColor("black"); $milestone->title->SetFont(FF_FONT1, FS_BOLD); $graph->Add($milestone); // Add a vertical line $vline = new GanttVLine("2001-12-24", "Phase 1"); $vline->SetDayOffset(0.5); $graph->Add($vline); // ... and display it $graph->Stroke();
$graph->scale->minute->SetStyle(MINUTESTYLE_MM); $graph->scale->minute->grid->SetColor('lightgray'); $graph->scale->tableTitle->Set('Phase 1'); $graph->scale->tableTitle->SetFont(FF_ARIAL, FS_NORMAL, 12); $graph->scale->SetTableTitleBackground('darkgreen@0.6'); $graph->scale->tableTitle->Show(true); $graph->title->Set("Example of hours & mins scale"); $graph->title->SetColor('darkgray'); $graph->title->SetFont(FF_VERDANA, FS_BOLD, 14); for ($i = 0; $i < count($data); ++$i) { $bar = new GanttBar($data[$i][0], $data[$i][1], $data[$i][2], $data[$i][3]); if (count($data[$i]) > 4) { $bar->title->SetFont($data[$i][4], $data[$i][5], $data[$i][6]); } $bar->SetPattern(BAND_RDIAG, "yellow"); $bar->SetFillColor("gray"); $graph->Add($bar); } //$vline = new GanttVLine("2001-11-27");//d=1006858800, $vline = new GanttVLine("2001-11-27 9:00"); //d=1006858800, $vline->SetWeight(5); $vline->SetDayOffset(0); $vline->title->Set("27/11 9:00"); $vline->title->SetFont(FF_FONT1, FS_BOLD, 10); $graph->Add($vline); $graph->Stroke(); ?>
/** * creates the image for the gantt chart * * @param $_params array containing projectdata, start- and enddate * @param $_filename filename for the image, if empty image gets printed to browser * @author Lars Kneschke / Bettina Gille * @returns nothing - writes image to disk */ function show_graph($params, $_filename = '') { $modernJPGraph = false; // no gd support if (!function_exists('imagecopyresampled')) { return false; } DEFINE("TTF_DIR", PHPGW_SERVER_ROOT . "/projects/ttf-bitstream-vera-1.10/"); if (file_exists(PHPGW_SERVER_ROOT . '/../jpgraph/src/jpgraph.php')) { include PHPGW_SERVER_ROOT . '/../jpgraph/src/jpgraph.php'; include PHPGW_SERVER_ROOT . '/../jpgraph/src/jpgraph_gantt.php'; } else { include PHPGW_SERVER_ROOT . '/projects/inc/jpgraph-1.5.2/src/jpgraph.php'; include PHPGW_SERVER_ROOT . '/projects/inc/jpgraph-1.5.2/src/jpgraph_gantt.php'; } //_debug_array($params); $project_array = $params['project_array']; $sdate = $params['sdate']; $edate = $params['edate']; $showMilestones = $params['showMilestones']; $showResources = $params['showResources']; $bocalendar = CreateObject('calendar.bocalendar'); $this->graph = CreateObject('phpgwapi.gdgraph', $this->debug); $bolink = CreateObject('infolog.bolink'); //$this->boprojects->order = 'parent'; $this->boprojects->limit = False; $this->boprojects->html_output = False; if (is_array($project_array)) { $projects = array(); foreach ($project_array as $pro) { $project = $this->boprojects->list_projects(array('action' => 'mainsubsorted', 'project_id' => $pro, 'mstones_stat' => True)); if (is_array($project)) { $i = count($projects); for ($k = 0; $k < count($project); $k++) { $projects[$i + $k] = $project[$k]; } } } } if (is_array($projects)) { $modernJPGraph = version_compare('1.13', JPG_VERSION); $sdate = $sdate + 60 * 60 * $GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset']; $sdateout = $GLOBALS['phpgw']->common->show_date($sdate, $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']); $edate = $edate + 60 * 60 * $GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset']; $edateout = $GLOBALS['phpgw']->common->show_date($edate, $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']); # $this->graph->title = lang('Gantt chart from %1 to %2',$sdateout,$edateout); // Standard calls to create a new graph if ($modernJPGraph) { $graph = new GanttGraph(940, -1, "auto"); } else { $graph = new GanttGraph(-1, -1, "auto"); } $graph->SetShadow(); $graph->SetBox(); $duration = $edate - $sdate; if ($duration < 5958000) { $graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK); if ($modernJPGraph) { $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAYWNBR); } else { $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY); } } elseif ($duration < 13820400) { $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY); $graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HWEEK); } else { $graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH); } // For the week we choose to show the start date of the week // the default is to show week number (according to ISO 8601) #$graph->scale->SetDateLocale('de_DE'); // Change the scale font $graph->scale->week->SetFont(FF_VERA, FS_NORMAL, 8); $graph->scale->year->SetFont(FF_VERA, FS_BOLD, 10); // Titles for chart $graph->title->Set(lang('project overview')); $graph->subtitle->Set(lang('from %1 to %2', $sdateout, $edateout)); $graph->title->SetFont(FF_VERA, FS_BOLD, 12); $graph->subtitle->SetFont(FF_VERA, FS_BOLD, 10); // set the start and end date // add one day to the end is needed internaly by jpgraph $graph->SetDateRange(date('Y-m-d 00:00:00', $sdate), date('Y-m-d', $edate + 86400)); foreach ($projects as $pro) { $ptime_pro = $this->boprojects->return_value('ptime', $pro[project_id]); $acc = $this->boprojects->get_budget(array('project_id' => $pro[project_id], 'ptime' => $ptime_pro)); if ($ptime_pro > 0) { $finnishedPercent = 100 / $ptime_pro * $acc[uhours_jobs_wminutes]; } else { $finnishedPercent = 0; } $previous = ''; if ($pro['previous'] > 0) { $previous = $this->boprojects->read_single_project($pro['previous']); $spro[] = array('title' => str_repeat(' ', $spro['level']) . '[!]' . $previous['title'], 'extracolor' => 'darkorange', 'sdate' => $previous['sdate'], 'edate' => $previous['edate'], 'pro_id' => $previous['project_id'], 'f_sdate' => $pro['sdate']); $color_legend['previous'] = array('title' => '[!]' . lang('previous project'), 'extracolor' => 'darkorange'); } // add a empty row before new project if ($pro['level'] == 0 && $counter > 0) { $counter++; } $spro = array('title' => $pro['title'], 'sdate' => $pro['sdate'], 'edate' => $pro['edate'] ? $pro['edate'] : mktime(0, 0, 0, date('m'), date('d'), date('Y')), 'color' => $pro['level'], 'pro_id' => $pro['project_id'], 'previous' => $pro['previous']); // convert title to iso-8859-1 $spro[title] = $this->botranslation->convert($spro[title], $this->displayCharset, 'iso-8859-1'); if ($spro[edate] < $sdate) { continue; } if ($spro[edate] > $edate) { $spro[edate] = $edate; } if ($spro[sdate] < $sdate) { $spro[sdate] = $sdate; } $bar = new GanttBar($counter, $spro[title], date('Y-m-d', $spro[sdate]), date('Y-m-d', $spro[edate]), round($finnishedPercent) . '%', 0.5); // mark beginn of new project bold if ($pro['level'] == 0) { $bar->title->SetFont(FF_VERA, FS_BOLD, 9); #$bar->title->SetColor("#9999FF"); $bar->SetPattern(BAND_SOLID, "#9999FF"); } else { // For illustration lets make each bar be red with yellow diagonal stripes $bar->SetPattern(BAND_SOLID, "#ccccFF"); #$bar->title->SetColor("#ccccFF"); } // To indicate progress each bar can have a smaller bar within // For illustrative purpose just set the progress to 50% for each bar $bar->progress->SetHeight(0.2); $bar->SetColor('#777777'); if ($finnishedPercent > 100) { $bar->progress->Set(1); #$bar->progress->SetPattern(GANTT_SOLID,"darkred",98); $bar->caption->SetColor("red"); } else { $bar->progress->Set($finnishedPercent / 100); #$bar->progress->SetPattern(GANTT_SOLID,"darkgreen",98); } $bar->caption->SetFont(FF_VERA, FS_NORMAL, 8); // ... and add the bar to the gantt chart $graphs['bars'][] = $bar; #$graph->Add($bar); $counter++; // check for Resources if ($showResources == 'true') { $linkedObjects = $bolink->get_links('projects', $pro[project_id]); $projectACL = $this->boprojects->get_acl_for_project($pro[project_id]); if (is_array($projectACL)) { // if beginn foreach ($projectACL as $accountID) { #_debug_array($projectData); $accountData = CreateObject('phpgwapi.accounts', $accountID); $accountData->read_repository(); $accountName = $GLOBALS['phpgw']->common->display_fullname($accountData->data['account_lid'], $accountData->data['firstname'], $accountData->data['lastname']); $calData = array('syear' => date('Y', $sdate), 'smonth' => date('m', $sdate), 'sday' => date('d', $sdate), 'eyear' => date('Y', $edate), 'emonth' => date('m', $edate), 'eday' => date('d', $edate), 'owner' => array($accountID)); $calEntries = $bocalendar->store_to_cache($calData); $bocalendar->remove_doubles_in_cache(date('Y', $sdate) . date('m', $sdate) . date('d', $sdate), date('Y', $edate) . date('m', $edate) . date('d', $edate)); $calEntries = $bocalendar->cached_events; #_debug_array($calEntries); if (is_array($calEntries) && count($calEntries)) { #_debug_array($calEntries); foreach ($calEntries as $calDayDate => $calDayEntries) { foreach ($calDayEntries as $calDayEntry) { if ($calDayEntry['recur_type']) { $bocalendar->set_recur_date($calDayEntry, $calDayDate); } #_debug_array($calDayEntry); if (!$bocalendar->rejected_no_show($calDayEntry)) { $startDate = date('Y-m-d H:i:s', mktime($calDayEntry['start']['hour'], $calDayEntry['start']['min'], $calDayEntry['start']['sec'], $calDayEntry['start']['month'], $calDayEntry['start']['mday'], $calDayEntry['start']['year'])); $endDate = date('Y-m-d H:i:s', mktime($calDayEntry['end']['hour'], $calDayEntry['end']['min'], $calDayEntry['end']['sec'], $calDayEntry['end']['month'], $calDayEntry['end']['mday'], $calDayEntry['end']['year'])); #$endDate = $startDate+1000; #_debug_array($startDate); $bar = new GanttBar($counter, str_repeat(' ', $pro['level'] + 1) . $accountName, $startDate, $endDate, '', 0.5); $bar->SetPattern(BAND_SOLID, "#DDDDDD"); $bar->SetColor('#CCCCCC'); #$bar->SetShadow(true,"darkgray"); if (count($projectLinks = $bolink->get_links('calendar', $calDayEntry['id'], 'projects'))) { $projectLinks = array_flip($projectLinks); #_debug_array($projectLinks); if (isset($projectLinks[$pro[project_id]])) { $bar->SetPattern(BAND_SOLID, "#33FF33"); $bar->SetColor('#33FF33'); } } $graphs['bars'][] = $bar; #$graph->Add($bar); } else { print "rejected<br>"; } } } $counter++; } } } // if end } // check for milstones if (is_array($pro['mstones']) && $showMilestones == 'true') { $msColor = "#999999"; foreach ($pro['mstones'] as $ms) { if ($sdate < $ms['edate'] && $ms['edate'] <= $edate) { $ms[title] = $this->botranslation->convert($ms[title], $this->displayCharset, 'iso-8859-1'); $msData = array('title' => $ms['title'], 'extracolor' => 'yellow', 'edate' => $ms['edate'], 'pro_id' => $pro['project_id']); // Create a milestone mark $ms = new MileStone($counter, str_repeat(' ', $pro['level'] + 1) . lang('Milestone'), date('Y-m-d', $msData['edate']), $msData['title']); $ms->caption->SetFont(FF_VERA, FS_NORMAL, 8); $ms->title->SetFont(FF_VERA, FS_NORMAL, 8); $ms->mark->SetColor($msColor); $ms->mark->SetFillColor('#EEEEEE'); $graphs['ms'][$counter] = $ms; // Create a vertical line to emphasize the milestone $vl = new GanttVLine(date('Y-m-d', $msData[edate]), '', $msColor, 2); $vl->SetDayOffset(0.5); // Center the line in the day $graphs['vl'][$counter] = $vl; $counter++; } } } } // add the vertical lines if (is_array($graphs['vl'])) { foreach ($graphs['vl'] as $graphCounter => $graphPointer) { $graph->Add($graphPointer); } } // add the milestones if (is_array($graphs['ms'])) { foreach ($graphs['ms'] as $graphCounter => $graphPointer) { $graph->Add($graphPointer); } } // add the resources if (is_array($graphs['bars'])) { foreach ($graphs['bars'] as $graphCounter => $graphPointer) { $graph->Add($graphPointer); } } #$graph->Stroke(PHPGW_SERVER_ROOT . SEP . 'phpgwapi' . SEP . 'images' . SEP . 'draw_tmp.png'); $graph->Stroke($_filename); } }
/** * Builds gantt graph */ function buildGraph() { require_once 'common/chart/Chart_Gantt.class.php'; $this->graph = new Chart_Gantt($this->width, $this->height, "auto"); // title setup $this->graph->title->Set($this->title); if (is_null($this->description)) { $this->description = ""; } $this->graph->subtitle->Set($this->description); //Try to fix issue with 'cut' right infos //TODO : more elegant way... $margin_right = 20; if (isset($this->data[0]['right']) && $this->data[0]['right'] != '' && $this->asOfDate == '') { $margin_right = 100; } $this->graph->SetMargin(20, $margin_right, $this->graph->getTopMargin(), 30); // asOfDate setup if ($this->asOfDate == 0) { $dateRep = date("Y-m-d", $_SERVER['REQUEST_TIME']); $dateDisp = date("m-d-Y", $_SERVER['REQUEST_TIME']); $vline = new GanttVLine($dateRep, "Today:" . $dateDisp, $this->graph->getTodayLineColor(), 1, 'solid'); } else { $dateRep = $this->asOfDate; $dateDisp = date("m-d-Y", strtotime($this->asOfDate)); $vline = new GanttVLine($dateRep, $dateDisp, $this->graph->getTodayLineColor(), 1, 'solid'); } $vline->SetDayOffset(0.5); $vline->title->SetFont($this->graph->getFont(), FS_NORMAL, 7); $vline->title->setColor($this->graph->getMainColor()); $this->graph->Add($vline); //scale setup $this->graph->ShowHeaders($this->formatScale()); $scale_dim = $this->getScaleDim(); //add info to gantt graph $this->graph->scale->actinfo->SetColTitles(array("Id", $this->summary_label)); $format = "Y-m-d"; $today = strtotime('now'); $one_day = 24 * 3600; for ($i = 0; $i < count($this->data); $i++) { $s = $this->data[$i]['start']; $d = $this->data[$i]['due']; $f = $this->data[$i]['finish']; //Milestone if ($s == 0 && $d == 0 && $f != 0 || $s == 0 && $d != 0 && $f == 0 || $s == 0 && $d != 0 && $f == $d) { $this->addMilestone($i, $this->data[$i], array('date' => max($this->data[$i]['due'], $this->data[$i]['finish']))); } elseif ($s == 0 && $d != 0 && $f != 0 && $d < $f) { $this->addLateBar($i, $this->data[$i], false, array('start' => 'due', 'end' => 'finish', 'label' => "", 'caption' => "", 'height' => 0.2)); $this->addMilestone($i, $this->data[$i], array('date' => 'finish')); } elseif ($s == 0 && $d != 0 && $f != 0 && $f < $d) { $this->addBar($i, $this->data[$i], false, array('start' => 'finish', 'end' => 'due', 'label' => "", 'caption' => "", 'height' => 0.2)); $this->addMilestone($i, $this->data[$i], array('date' => 'finish')); } elseif ($s != 0 && $d == 0 && $s <= $f) { $this->addBar($i, $this->data[$i], true, array('start' => 'start', 'end' => 'finish')); } elseif ($s != 0 && $d != 0 && $s <= $d && ($f == 0 || $d == $f)) { $this->addBar($i, $this->data[$i], true, array('start' => 'start', 'end' => 'due')); } elseif ($s != 0 && $d != 0 && $f != 0 && $s <= $d && $d < $f) { $this->addBar($i, $this->data[$i], true, array('start' => 'start', 'end' => 'due', 'caption' => "")); $bar = $this->addLateBar($i, $this->data[$i], false, array('start' => date($format, strtotime($this->data[$i]['due']) + $one_day), 'end' => 'finish', 'label' => "")); } elseif ($s != 0 && $d != 0 && $d < $s && ($f == 0 || $s == $f)) { $bar = $this->addLateBar($i, $this->data[$i], true, array('start' => 'due', 'end' => 'start')); } elseif ($s != 0 && $d != 0 && $f != 0 && $d < $s && $s < $f) { $bar = $this->addLateBar($i, $this->data[$i], true, array('start' => 'due', 'end' => 'finish')); } elseif ($s != 0 && $d != 0 && $f != 0 && $s <= $f && $f < $d) { $this->addBar($i, $this->data[$i], true, array('start' => 'start', 'end' => 'finish', 'caption' => "")); $this->addBar($i, $this->data[$i], false, array('start' => date($format, strtotime($this->data[$i]['finish']) + $one_day), 'end' => 'due', 'label' => "", 'height' => 0.2)); } else { $this->addErrorBar($i, $this->data[$i]); } } }
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY); // Make the week scale font smaller than the default if (isset($gantt_title_font_family)) { $graph->scale->week->SetFont(constant($gantt_title_font_family), FS_NORMAL, 9); $graph->scale->month->SetFont(constant($gantt_title_font_family), FS_NORMAL, 9); } // Use the short name of the month together with a 2 digit year // on the month scale $graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2); $rows = count($pt_arr); for ($i = 0; $i < $rows; $i++) { // Format the bar for the first activity // ($row,$title,$startdate,$enddate) $activity[$i] = new GanttBar($i, convert_unicode($pt_arr[$i]->getSummary()), date('Y-m-d', $pt_arr[$i]->getStartDate()), date('Y-m-d', $pt_arr[$i]->getEndDate() - 86400)); // Yellow diagonal line pattern on a red background $activity[$i]->SetPattern(BAND_RDIAG, "yellow"); $activity[$i]->SetFillColor("red"); $activity[$i]->progress->Set($pt_arr[$i]->getPercentComplete() ? $pt_arr[$i]->getPercentComplete() / 100 : 0); $activity[$i]->progress->SetPattern(BAND_RDIAG, "blue"); if (isset($gantt_task_font_family)) { $activity[$i]->title->SetFont(constant($gantt_task_font_family), constant($gantt_task_font_style), $gantt_task_font_size); } // Finally add the bar to the graph $graph->Add($activity[$i]); } //echo $rows; $todayline = new GanttVLine(date('Y-m-d', time()), "Today"); $todayline->SetDayOffset(0.5); $graph->Add($todayline); // Display the Gantt chart $graph->Stroke();
function gantt_chart($p_metrics, $p_title, $p_subtitle, $p_graph_width = 300, $p_graph_height = 380) { $t_graph_font = graph_get_font(); $t_metrics = $p_metrics['metrics']; $t_range = $p_metrics['range']; // Diff in weeks of the range: $t_60s = 60; // 1 minute $t_60min = 60; // 1 hour $t_24h = 24; // 1 day $t_7d = 7; // 1 week $t_minute = $t_60s; $t_hour = $t_60min * $t_minute; $t_day = $t_24h * $t_hour; $t_week = $t_7d * $t_day; $t_gantt_chart_max_rows = plugin_config_get('rows_max'); error_check(is_array($t_metrics) ? count($t_metrics) : 0, $p_title . " (" . $p_subtitle . ")"); if (plugin_config_get('eczlibrary') == ON) { // DO NOTHING SINCE eczlibrary DOES NOT SUPPORT GANTT CHART } else { // A new graph with automatic size $graph = new GanttGraph(0, 0, "auto"); $graph->SetShadow(); // Add title and subtitle $graph->title->Set($p_title); $graph->title->SetFont($t_graph_font, FS_BOLD, 12); $graph->subtitle->Set($p_subtitle); // Show day, week and month scale $graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH); // Instead of week number show the date for the first day in the week // on the week scale $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY); // Make the week scale font smaller than the default $graph->scale->week->SetFont($t_graph_font, FS_NORMAL, 8); // Use the short name of the month together with a 2 digit year // on the month scale $graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4); $graph->scale->month->SetFontColor("white"); $graph->scale->month->SetBackgroundColor("blue"); // Setup a horizontal grid $graph->hgrid->Show(); $graph->hgrid->SetRowFillColor('darkblue@0.9'); // Setup a vertical grid // $graph->vgrid->Show(); //Setup the divider display $graph->scale->divider->SetWeight(3); $graph->scale->divider->SetColor("darkblue"); $graph->scale->dividerh->SetWeight(3); $graph->scale->dividerh->SetColor("darkblue"); $graph->scale->dividerh->Show(); $graph->scale->actinfo->vgrid->SetStyle('solid'); $graph->scale->actinfo->vgrid->SetColor('darkblue'); $graph->scale->actinfo->vgrid->Show(); // // Set the column headers and font // $graph->scale->actinfo->SetColTitles( array('Task','Start','End'),array(100)); // $graph->scale->actinfo->SetFont( $t_graph_font, FS_BOLD, 10 ); //Adding columns: //The following is an example: 1st element, an array of the columns, // 2nd element an optional array of min width of the columns (here the min width of the 2 first columns) //$graph->scale->actinfo->SetColTitles( // array('Note','Task','Duration','Start','Finish'),array(30,100)); //Adding a table title $graph->scale->tableTitle->Set("{$p_subtitle}"); $graph->scale->tableTitle->SetFont($t_graph_font, FS_NORMAL, 8); $graph->scale->SetTableTitleBackground('darkblue@0.6'); $graph->scale->tableTitle->Show(); // if ( null != $t_constrain ){ // $t_activity->SetConstrain( $t_constrain, CONSTRAIN_ENDSTART ); // } // if ( null != $t_constrain ){ // $t_activity->SetConstrain( $t_constrain['row'], $t_constrain['type'] ); // } // We first need to get the list of rows, in order to know whether to // display the constraint or not (in case of missing referenced row) $t_row_list = array(); foreach ($t_metrics as $t_metric_row) { $t_row_list[] = $t_metric_row[0]; } foreach ($t_metrics as $t_metric_row) { $t_row = $t_metric_row[0] % $t_gantt_chart_max_rows; $t_activity_type = $t_metric_row[1]; $t_bug_id = $t_metric_row[2]; $t_start_date = $t_metric_row[3]; $t_end_date = $t_metric_row[4]; $t_extra = " {$t_bug_id}" . $t_metric_row[5]; $t_level = $t_metric_row[6]; $t_constraints = $t_metric_row[7]; if (isset($t_level)) { $t_row_label = utf8_str_pad('', $t_level * 2, ' ') . htmlspecialchars_decode(bug_format_summary($t_bug_id, SUMMARY_FIELD)); } else { $t_row_label = htmlspecialchars_decode(bug_format_summary($t_bug_id, SUMMARY_FIELD)); } // Limit the label to max defined $t_row_label = strlen($t_row_label) > plugin_config_get('label_max') ? substr($t_row_label, 0, plugin_config_get('label_max') - 3) . '...' : $t_row_label; $t_activity_arr = array('left' => null, 'main' => array('row' => $t_row, 'label' => $t_row_label, 'start' => $t_start_date, 'end' => $t_end_date, 'info' => $t_extra), 'right' => null); if ($t_end_date < $t_range['min']) { // complete left bar // ** | o[ ]-[ ]o $t_activity_arr = array('left' => array('row' => $t_row, 'label' => $t_row_label, 'start' => $t_range['min'], 'end' => $t_range['min'], 'info' => "<- " . graph_date_format($t_start_date)), 'main' => null, 'right' => array('row' => $t_row, 'label' => "", 'start' => $t_range['min'] + $t_day, 'end' => $t_range['min'] + $t_day, 'info' => "<<- [" . graph_date_format($t_start_date) . " / " . graph_date_format($t_end_date) . "]" . $t_extra)); } else { if ($t_range['max'] < $t_start_date) { // complete right bar // o[ ]-[ ]o | ** $t_activity_arr = array('left' => array('row' => $t_row, 'label' => $t_row_label, 'start' => $t_range['max'] - $t_day, 'end' => $t_range['max'] - $t_day, 'info' => ""), 'main' => null, 'right' => array('row' => $t_row, 'label' => "", 'start' => $t_range['max'], 'end' => $t_range['max'], 'info' => "[" . graph_date_format($t_start_date) . " / " . graph_date_format($t_end_date) . "] ->>" . $t_extra)); } else { if ($t_start_date < $t_range['min']) { // left bar // * | o[ ]-[ ] $t_activity_arr['left'] = array('row' => $t_row, 'label' => '', 'start' => $t_range['min'], 'end' => $t_range['min'], 'info' => "<- " . graph_date_format($t_start_date)); $t_activity_arr['main']['start'] = $t_range['min'] + $t_day; //4 * $t_day;// @TODO: what happens if duration is less than that } if ($t_range['max'] < $t_end_date) { // right bar // [ ]-[ ]o | * $t_activity_arr['main']['end'] = $t_range['max'] - $t_day; //4 * $t_day; $t_activity_arr['main']['info'] = ""; $t_activity_arr['right'] = array('row' => $t_row, 'label' => "", 'start' => $t_range['max'], 'end' => $t_range['max'], 'info' => graph_date_format($t_end_date) . " ->" . $t_extra); } } } switch ($t_activity_type) { case ACTYPE_NORMAL: if (null != $t_activity_arr['left']) { $t_activity_left = new GanttBar($t_activity_arr['left']['row'], $t_activity_arr['left']['label'], graph_date_format($t_activity_arr['left']['start']), graph_date_format($t_activity_arr['left']['end']), $t_activity_arr['left']['info']); // Add a left marker $t_activity_left->leftMark->Show(); $t_activity_left->leftMark->SetType(MARK_FILLEDCIRCLE); $t_activity_left->leftMark->SetWidth(8); // $t_activity_left->leftMark->SetColor( 'red' ); $t_activity_left->leftMark->SetFillColor('red'); $t_activity_left->leftMark->title->Set(''); $t_activity_left->leftMark->title->SetFont($t_graph_font, FS_NORMAL, 8); $t_activity_left->leftMark->title->SetColor('white'); if (null != gantt_get_resolution_date($t_bug_id)) { $t_activity_left->SetPattern(BAND_RDIAG, get_status_color(bug_get_field($t_bug_id, 'status'))); } $t_activity_left->SetFillColor(get_status_color(bug_get_field($t_bug_id, 'status'))); } if (null != $t_activity_arr['main']) { $t_activity_main = new GanttBar($t_activity_arr['main']['row'], $t_activity_arr['main']['label'], graph_date_format($t_activity_arr['main']['start']), graph_date_format($t_activity_arr['main']['end']), $t_activity_arr['main']['info']); if (null != gantt_get_resolution_date($t_bug_id)) { $t_activity_main->SetPattern(BAND_RDIAG, get_status_color(bug_get_field($t_bug_id, 'status'))); } $t_activity_main->SetFillColor(get_status_color(bug_get_field($t_bug_id, 'status'))); $t_activity_main->title->SetFont($t_graph_font, FS_NORMAL, 8); // Set the constraint if any... foreach ($t_constraints as $t_constraint) { // ... and if possible if (in_array($t_constraint['row'], $t_row_list)) { $t_activity_main->SetConstrain($t_constraint['row'], $t_constraint['type']); } } $graph->add($t_activity_main); } if (null != $t_activity_arr['right']) { $t_activity_right = new GanttBar($t_activity_arr['right']['row'], $t_activity_arr['right']['label'], graph_date_format($t_activity_arr['right']['start']), graph_date_format($t_activity_arr['right']['end']), $t_activity_arr['right']['info']); // Add a left marker $t_activity_right->rightMark->Show(); $t_activity_right->rightMark->SetType(MARK_FILLEDCIRCLE); $t_activity_right->rightMark->SetWidth(8); $t_activity_right->rightMark->SetColor('red'); $t_activity_right->rightMark->SetFillColor('red'); $t_activity_right->rightMark->title->Set(''); $t_activity_right->rightMark->title->SetFont($t_graph_font, FS_NORMAL, 8); $t_activity_right->rightMark->title->SetColor('white'); if (null != gantt_get_resolution_date($t_bug_id)) { $t_activity_right->SetPattern(BAND_RDIAG, get_status_color(bug_get_field($t_bug_id, 'status'))); } $t_activity_right->SetFillColor(get_status_color(bug_get_field($t_bug_id, 'status'))); } if (isset($t_activity_left)) { $graph->add($t_activity_left); } if (isset($t_activity_right)) { $graph->add($t_activity_right); } break; case ACTYPE_MILESTONE: $t_size = 5; if ($t_start_date < $t_range['min']) { $t_extra = "(<-- " . graph_date_format($t_start_date) . ")" . $t_extra; $t_start_date = $t_range['min']; $t_size = 8; } else { if ($t_range['max'] < $t_start_date) { $t_extra = "(--> " . graph_date_format($t_start_date) . ")" . $t_extra; $t_start_date = $t_range['max']; $t_size = 8; } } $t_milestone = new MileStone($t_row, $t_row_label, graph_date_format($t_start_date), $t_extra); $t_milestone->title->SetFont($t_graph_font, FS_NORMAL, 8); $t_milestone->mark->SetType(MARK_FILLEDCIRCLE); $t_milestone->mark->SetWidth($t_size); if (5 != $t_size) { $t_milestone->mark->SetFillColor('red'); } // foreach( $t_constraints as $t_constraint){ // $t_milestone->SetConstrain( $t_constraint['row'], $t_constraint['type'] ); // } $graph->add($t_milestone); break; } } // Setting the min and max date: $t_minmax = $graph->GetBarMinMax(); $t_week_in_seconds = 7 * 24 * 3600; // 1 week offset min: if ($t_minmax[0] - $t_week_in_seconds > 0) { $t_graph_offset_min = $t_minmax[0] - $t_week_in_seconds; } else { $t_graph_offset_min = $t_minmax[0]; } // 2 weeks offset max: $t_graph_offset_max = $t_minmax[1] + 3 * $t_week_in_seconds; $graph->SetDateRange(graph_date_format($t_graph_offset_min), graph_date_format($t_graph_offset_max)); // Add a vertical line for today if in the range of GetBarMinMax() (retruns an arry ($min, $max) ): $t_minmax = $graph->GetBarMinMax(); $t_now = date(config_get('short_date_format')); if ($t_now >= graph_date_format($t_graph_offset_min) && $t_now <= graph_date_format($t_graph_offset_max)) { $t_today = new GanttVLine($t_now, "Today", "darkred", 2, "solid"); $t_today->SetDayOffset(0.5); $graph->add($t_today); } // $t_today = new GanttVLine( "2011-03-01" , "" , "darkred", 2, "solid");// // $t_today->SetDayOffset(0.5); // $graph->add( $t_today ); $t_gantt_chart_height = gantt_chart_get_height($graph); $t_legend = gantt_chart_legend(false); $t_legend_height = 60; // Display the Gantt chart // $graph->Stroke(); //-------------------------------------- // Create a combined graph //-------------------------------------- $mgraph = new MGraph(); $mgraph->Add($graph, 0, 0); $mgraph->Add($t_legend, 0, $t_gantt_chart_height + $t_legend_height); $mgraph->Stroke(); } }