package ilarkesto.console;
import ilarkesto.core.base.Str;
import java.util.ArrayList;
import java.util.Arrays;
public class ConsoleTable {
private final String EMPTY = "";
private final String SPACE = " ";
private final String LINEBREAK = "\n";
// private final Alignment DEFAULT_ALIGNMENT = Alignment.LEFT;
// private ArrayList<Alignment> alignments = new ArrayList<Alignment>();
private int padding = 1;
private ArrayList<ArrayList<String>> rows = new ArrayList<ArrayList<String>>();
private ArrayList<Integer> maxColLenghts = new ArrayList<Integer>();
private int maxRowLength = 0;
public ConsoleTable addRow(Object... columns) {
rows.add(new ArrayList<String>());
return appendRow(columns);
}
public <T> ConsoleTable appendRow(T... moreColumns) {
ArrayList<String> lastRow = lastRow();
// update maximal row length
maxRowLength = Math.max(maxRowLength, lastRow.size() + moreColumns.length);
// update maximal column lengths
for (int i = 0; i < moreColumns.length; i++) {
int colNumber = lastRow.size() + i;
if (colNumber >= maxColLenghts.size()) {
maxColLenghts.add(colNumber, moreColumns[i].toString().length());
} else {
maxColLenghts
.set(colNumber, Math.max(maxColLenghts.get(colNumber), moreColumns[i].toString().length()));
}
}
// append columns to row
for (Object col : moreColumns) {
lastRow.add(col.toString());
}
return this;
}
public <T> ConsoleTable appendRowFromColumn(int fromCol, T... moreColumns) {
ArrayList<String> lastRow = lastRow();
if (fromCol < lastRow.size())
throw new IllegalArgumentException("Cannot append from column " + fromCol + ", because there are already "
+ lastRow.size() + " columns.");
String[] emptyCols = new String[fromCol - lastRow.size() - 1];
Arrays.fill(emptyCols, "");
appendRow(emptyCols);
appendRow(moreColumns);
return this;
}
private ArrayList<String> lastRow() {
return rows.get(rows.size() - 1);
}
public static enum Alignment {
LEFT, CENTER, RIGHT
};
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (ArrayList<String> row : rows) {
for (int i = 0; i < maxRowLength; i++) {
String cell = i < row.size() ? row.get(i) : EMPTY;
sb.append(createPadding(padding));
sb.append(Str.fillUpRight(cell, SPACE, maxColLenghts.get(i)));
sb.append(createPadding(padding));
}
sb.append(LINEBREAK);
}
return sb.toString();
}
private Object createPadding(int width) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < width; i++) {
sb.append(SPACE);
}
return sb.toString();
}
}