java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
branchv_0
changeset 39 be8db46a38c3
parent 37 9e6f8e5d5f98
child 40 a9db7fb3ce65
     1.1 --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java	Mon Dec 23 11:52:49 2013 +0100
     1.2 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java	Mon Dec 23 12:16:22 2013 +0100
     1.3 @@ -19,6 +19,8 @@
     1.4  
     1.5  import info.globalcode.sql.dk.ColorfulPrintWriter;
     1.6  import static info.globalcode.sql.dk.ColorfulPrintWriter.*;
     1.7 +import static info.globalcode.sql.dk.Functions.lpad;
     1.8 +import static info.globalcode.sql.dk.Functions.rpad;
     1.9  
    1.10  /**
    1.11   *
    1.12 @@ -27,8 +29,11 @@
    1.13  public class TabularFormatter extends AbstractFormatter {
    1.14  
    1.15  	public static final String NAME = "tabular";
    1.16 +	private static final String HEADER_TYPE_PREFIX = " (";
    1.17 +	private static final String HEADER_TYPE_SUFFIX = ")";
    1.18  	private ColorfulPrintWriter out;
    1.19  	private boolean firstResult = true;
    1.20 +	private int[] columnWidth;
    1.21  
    1.22  	public TabularFormatter(FormatterContext formatterContext) {
    1.23  		super(formatterContext);
    1.24 @@ -45,14 +50,18 @@
    1.25  	public void writeColumnsHeader(ColumnsHeader header) {
    1.26  		super.writeColumnsHeader(header);
    1.27  
    1.28 +		columnWidth = new int[header.getColumnCount()];
    1.29 +
    1.30  		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
    1.31  			out.print(TerminalStyle.Bright, cd.getLabel());
    1.32 -			out.print(" (");
    1.33 +			out.print(HEADER_TYPE_PREFIX);
    1.34  			out.print(cd.getTypeName());
    1.35 -			out.print(")");
    1.36 +			out.print(HEADER_TYPE_SUFFIX);
    1.37  			if (!cd.isLastColumn()) {
    1.38  				out.print(TerminalColor.Green, " | ");
    1.39  			}
    1.40 +
    1.41 +			setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length());
    1.42  		}
    1.43  		out.println();
    1.44  		out.flush();
    1.45 @@ -66,7 +75,31 @@
    1.46  			out.print(TerminalColor.Green, " | ");
    1.47  		}
    1.48  
    1.49 -		out.print(TerminalColor.Cyan, String.valueOf(value));
    1.50 +		out.print(TerminalColor.Cyan, toString(value));
    1.51 +	}
    1.52 +
    1.53 +	private int getColumnWidth(int columnNumber) {
    1.54 +		return columnWidth[columnNumber - 1];
    1.55 +	}
    1.56 +
    1.57 +	private void setColumnWidth(int columnNumber, int width) {
    1.58 +		columnWidth[columnNumber - 1] = width;
    1.59 +	}
    1.60 +
    1.61 +	private void updateColumnWidth(int columnNumber, int width) {
    1.62 +		int oldWidth = getColumnWidth(columnNumber);
    1.63 +		setColumnWidth(columnNumber, Math.max(width, oldWidth));
    1.64 +
    1.65 +	}
    1.66 +
    1.67 +	@Override
    1.68 +	protected String toString(Object value) {
    1.69 +		final int width = getColumnWidth(getCurrentColumnsCount());
    1.70 +		if (value instanceof Number) {
    1.71 +			return lpad(super.toString(value), width);
    1.72 +		} else {
    1.73 +			return rpad(super.toString(value), width);
    1.74 +		}
    1.75  	}
    1.76  
    1.77  	@Override