package hip.util;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class PaddedTable {
private final int maxColLength;
private final List<String> columns = new ArrayList<String>();
private final List<Integer> maxColumnLengths = new ArrayList<Integer>();
private final List<List<String>> rows = new ArrayList<List<String>>();
public PaddedTable() {
maxColLength = Integer.MAX_VALUE;
}
public PaddedTable(int maxColLength) {
this.maxColLength = maxColLength;
}
public PaddedTable addColumnTitle(String title) {
title = abbreviate(title);
columns.add(title);
maxColumnLengths.add(title.length());
return this;
}
public PaddedTable newRow() {
rows.add(new ArrayList<String>());
return this;
}
public PaddedTable clearRows() {
rows.clear();
return this;
}
public PaddedTable addColumnValue(String value) {
addColumnValueNoAbbreviate(abbreviate(value));
return this;
}
public PaddedTable addColumnValueNoAbbreviate(String value) {
rows.get(rows.size()-1).add(value);
int colIndex = rows.get(rows.size()-1).size()-1;
maxColumnLengths.set(colIndex,
Math.max(maxColumnLengths.get(colIndex), value.length()));
return this;
}
public PaddedTable addColumnValue(int value) {
String valueAsString = String.valueOf(value);
addColumnValueNoAbbreviate(valueAsString);
return this;
}
public PaddedTable addColumnValue(long value) {
String valueAsString = String.valueOf(value);
addColumnValueNoAbbreviate(valueAsString);
return this;
}
public PaddedTable addColumnValue(double value) {
String valueAsString = String.format("%.2f", value);
addColumnValueNoAbbreviate(valueAsString);
return this;
}
public String abbreviate(String s) {
return StringUtils.abbreviate(s, maxColLength);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
// header first
for(int i=0; i < columns.size(); i++) {
appendToBuilder(sb, i, columns.get(i));
}
sb.append(String.format("%n"));
for (List<String> row : rows) {
for (int j = 0; j < row.size(); j++) {
appendToBuilder(sb, j, row.get(j));
}
sb.append(String.format("%n"));
}
return sb.toString();
}
public void appendToBuilder(StringBuilder sb, int columnIdx, String value) {
int globalPadding = 2;
int paddingRequired = globalPadding + maxColumnLengths.get(columnIdx);
sb.append(String.format("%" + paddingRequired + "s", value));
}
}