java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
branchv_0
changeset 39 be8db46a38c3
parent 37 9e6f8e5d5f98
child 40 a9db7fb3ce65
--- 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