diff -r 03bf24449c7a -r 102ba0fcb07f java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Fri Dec 27 21:26:30 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Sat Dec 28 12:19:39 2013 +0100 @@ -22,6 +22,8 @@ import static info.globalcode.sql.dk.Functions.lpad; import static info.globalcode.sql.dk.Functions.rpad; import static info.globalcode.sql.dk.Functions.repeat; +import java.util.Arrays; +import java.util.List; /** * @@ -59,12 +61,19 @@ public void writeColumnsHeader(ColumnsHeader header) { super.writeColumnsHeader(header); - columnWidth = new int[header.getColumnCount()]; + initColumnWidths(header.getColumnCount()); printTableIndent(); printTableBorder("╭"); - for (ColumnDescriptor cd : header.getColumnDescriptors()) { - setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length()); + + List columnDescriptors = header.getColumnDescriptors(); + + for (ColumnDescriptor cd : columnDescriptors) { + // padding: make header cell at least same width as data cells in this column + int typeWidth = cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length(); + cd.setLabel(rpad(cd.getLabel(), getColumnWidth(cd.getColumnNumber()) - typeWidth)); + updateColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + typeWidth); + if (!cd.isFirstColumn()) { printTableBorder("┬"); } @@ -73,7 +82,7 @@ printTableBorder("╮"); out.println(); - for (ColumnDescriptor cd : header.getColumnDescriptors()) { + for (ColumnDescriptor cd : columnDescriptors) { if (cd.isFirstColumn()) { printTableIndent(); printTableBorder("│ "); @@ -87,8 +96,6 @@ if (cd.isLastColumn()) { printTableBorder(" │"); } - - setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length()); } out.println(); @@ -106,6 +113,24 @@ out.flush(); } + /** + * Must be called before + * {@linkplain #updateColumnWidth(int, int)} + * and {@linkplain #getColumnWidth(int)} + * for each result set. + * + * @param columnCount number of columns in current result set + */ + protected void initColumnWidths(int columnCount) { + if (columnWidth == null) { + columnWidth = new int[columnCount]; + } + } + + protected void cleanColumnWidths() { + columnWidth = null; + } + @Override public void writeColumnValue(Object value) { super.writeColumnValue(value); @@ -133,7 +158,7 @@ columnWidth[columnNumber - 1] = width; } - private void updateColumnWidth(int columnNumber, int width) { + protected void updateColumnWidth(int columnNumber, int width) { int oldWidth = getColumnWidth(columnNumber); setColumnWidth(columnNumber, Math.max(width, oldWidth)); @@ -180,6 +205,7 @@ printTableBorder("╯"); out.println(); + cleanColumnWidths(); out.print(TerminalColor.Yellow, "Record count: "); out.println(getCurrentRowCount());