java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
branchv_0
changeset 88 102ba0fcb07f
parent 87 03bf24449c7a
child 89 98d18e9a357b
--- 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<ColumnDescriptor> 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());