protected function getMaxColumnWidths()
{
// Loop through the table rows and headers, building multidimensional
// arrays of the 'original' and 'minimum' column widths. In the same
// loop, build a count of the number of columns.
$originalColumnWidths = [];
$minColumnWidths = [];
$columnCounts = [0];
foreach (array_merge($this->rowsCopy, $this->headersCopy) as $rowNum => $row) {
if ($row instanceof TableSeparator) {
continue;
}
$columnCount = 0;
foreach ($row as $column => $cell) {
$columnCount += $column instanceof TableCell ? $column->getColspan() - 1 : 1;
// The column width is the width of the widest cell.
$cellWidth = $this->getCellWidth($cell);
if (!isset($originalColumnWidths[$column]) || $originalColumnWidths[$column] < $cellWidth) {
$originalColumnWidths[$column] = $cellWidth;
}
// Find the minimum width of the cell. The default is configured
// in minColumnWidth, but this is overridden for non-wrapping
// cells and very narrow cells. Additionally, table headers are
// never wrapped.
$minCellWidth = $this->minColumnWidth;
if ($cellWidth < $this->minColumnWidth || $cell instanceof AdaptiveTableCell && !$cell->canWrap() || !isset($this->rowsCopy[$rowNum])) {
$minCellWidth = $cellWidth;
}
// The minimum column width is the greatest minimum cell width.
if (!isset($minColumnWidths[$column]) || $minColumnWidths[$column] < $minCellWidth) {
$minColumnWidths[$column] = $minCellWidth;
}
}
$columnCounts[] = $columnCount;
}
// Find the number of columns in the table. This uses the same process
// as the parent private method Table->calculateNumberOfColumns().
$columnCount = max($columnCounts);
// Find the maximum width for each column's content, to fit into the
// calculated maximum content width.
$maxContentWidth = $this->getMaxContentWidth($columnCount);
$maxColumnWidths = [];
$totalWidth = array_sum($originalColumnWidths);
asort($originalColumnWidths, SORT_NUMERIC);
foreach ($originalColumnWidths as $column => $columnWidth) {
$columnRatio = $maxContentWidth / $totalWidth * $columnWidth;
$maxColumnWidth = round($columnRatio);
// Do not change the width of columns which are already narrower
// than the minimum.
if (isset($minColumnWidths[$column]) && $maxColumnWidth < $minColumnWidths[$column]) {
$maxColumnWidth = $minColumnWidths[$column];
}
$maxColumnWidths[$column] = $maxColumnWidth;
$totalWidth -= $columnWidth;
$maxContentWidth -= $maxColumnWidth;
}
return $maxColumnWidths;
}