diff -r ff5bbc06ed29 -r be8db46a38c3 java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Mon Dec 23 11:52:49 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Mon Dec 23 12:16:22 2013 +0100 @@ -19,6 +19,8 @@ import info.globalcode.sql.dk.ColorfulPrintWriter; import static info.globalcode.sql.dk.ColorfulPrintWriter.*; +import static info.globalcode.sql.dk.Functions.lpad; +import static info.globalcode.sql.dk.Functions.rpad; /** * @@ -27,8 +29,11 @@ public class TabularFormatter extends AbstractFormatter { public static final String NAME = "tabular"; + private static final String HEADER_TYPE_PREFIX = " ("; + private static final String HEADER_TYPE_SUFFIX = ")"; private ColorfulPrintWriter out; private boolean firstResult = true; + private int[] columnWidth; public TabularFormatter(FormatterContext formatterContext) { super(formatterContext); @@ -45,14 +50,18 @@ public void writeColumnsHeader(ColumnsHeader header) { super.writeColumnsHeader(header); + columnWidth = new int[header.getColumnCount()]; + for (ColumnDescriptor cd : header.getColumnDescriptors()) { out.print(TerminalStyle.Bright, cd.getLabel()); - out.print(" ("); + out.print(HEADER_TYPE_PREFIX); out.print(cd.getTypeName()); - out.print(")"); + out.print(HEADER_TYPE_SUFFIX); if (!cd.isLastColumn()) { out.print(TerminalColor.Green, " | "); } + + setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length()); } out.println(); out.flush(); @@ -66,7 +75,31 @@ out.print(TerminalColor.Green, " | "); } - out.print(TerminalColor.Cyan, String.valueOf(value)); + out.print(TerminalColor.Cyan, toString(value)); + } + + private int getColumnWidth(int columnNumber) { + return columnWidth[columnNumber - 1]; + } + + private void setColumnWidth(int columnNumber, int width) { + columnWidth[columnNumber - 1] = width; + } + + private void updateColumnWidth(int columnNumber, int width) { + int oldWidth = getColumnWidth(columnNumber); + setColumnWidth(columnNumber, Math.max(width, oldWidth)); + + } + + @Override + protected String toString(Object value) { + final int width = getColumnWidth(getCurrentColumnsCount()); + if (value instanceof Number) { + return lpad(super.toString(value), width); + } else { + return rpad(super.toString(value), width); + } } @Override