in src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java [147:197]
protected TableDefinition adjustTableFormat(final TableDefinition table) {
final List<TextStyle.Builder> styleBuilders = new ArrayList<>();
for (int i = 0; i < table.columnTextStyles().size(); i++) {
final TextStyle style = table.columnTextStyles().get(i);
final TextStyle.Builder builder = TextStyle.builder().setTextStyle(style);
styleBuilders.add(builder);
final String header = table.headers().get(i);
if (style.getMaxWidth() < header.length() || style.getMaxWidth() == TextStyle.UNSET_MAX_WIDTH) {
builder.setMaxWidth(header.length());
}
if (style.getMinWidth() < header.length()) {
builder.setMinWidth(header.length());
}
for (final List<String> row : table.rows()) {
final String cell = row.get(i);
if (cell.length() > builder.getMaxWidth()) {
builder.setMaxWidth(cell.length());
}
}
}
// calculate the total width.
int calcWidth = 0;
int adjustedMaxWidth = textStyleBuilder.getMaxWidth();
for (final TextStyle.Builder builder : styleBuilders) {
adjustedMaxWidth -= builder.getLeftPad();
if (builder.isScalable()) {
calcWidth += builder.getMaxWidth();
} else {
adjustedMaxWidth -= builder.getMaxWidth();
}
}
// rescale if necessary
if (calcWidth > adjustedMaxWidth) {
final double fraction = adjustedMaxWidth * 1.0 / calcWidth;
for (int i = 0; i < styleBuilders.size(); i++) {
final TextStyle.Builder builder = styleBuilders.get(i);
if (builder.isScalable()) {
// resize and remove the padding from the maxWidth calculation.
styleBuilders.set(i, resize(builder, fraction));
}
}
}
// regenerate the styles
final List<TextStyle> styles = new ArrayList<>();
for (final TextStyle.Builder builder : styleBuilders) {
// adjust by removing the padding as it was not accounted for above.
styles.add(builder.get());
}
return TableDefinition.from(table.caption(), styles, table.headers(), table.rows());
}