java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
branchv_0
changeset 39 be8db46a38c3
parent 37 9e6f8e5d5f98
child 40 a9db7fb3ce65
equal deleted inserted replaced
38:ff5bbc06ed29 39:be8db46a38c3
    17  */
    17  */
    18 package info.globalcode.sql.dk.formatting;
    18 package info.globalcode.sql.dk.formatting;
    19 
    19 
    20 import info.globalcode.sql.dk.ColorfulPrintWriter;
    20 import info.globalcode.sql.dk.ColorfulPrintWriter;
    21 import static info.globalcode.sql.dk.ColorfulPrintWriter.*;
    21 import static info.globalcode.sql.dk.ColorfulPrintWriter.*;
       
    22 import static info.globalcode.sql.dk.Functions.lpad;
       
    23 import static info.globalcode.sql.dk.Functions.rpad;
    22 
    24 
    23 /**
    25 /**
    24  *
    26  *
    25  * @author Ing. František Kučera (frantovo.cz)
    27  * @author Ing. František Kučera (frantovo.cz)
    26  */
    28  */
    27 public class TabularFormatter extends AbstractFormatter {
    29 public class TabularFormatter extends AbstractFormatter {
    28 
    30 
    29 	public static final String NAME = "tabular";
    31 	public static final String NAME = "tabular";
       
    32 	private static final String HEADER_TYPE_PREFIX = " (";
       
    33 	private static final String HEADER_TYPE_SUFFIX = ")";
    30 	private ColorfulPrintWriter out;
    34 	private ColorfulPrintWriter out;
    31 	private boolean firstResult = true;
    35 	private boolean firstResult = true;
       
    36 	private int[] columnWidth;
    32 
    37 
    33 	public TabularFormatter(FormatterContext formatterContext) {
    38 	public TabularFormatter(FormatterContext formatterContext) {
    34 		super(formatterContext);
    39 		super(formatterContext);
    35 		out = new ColorfulPrintWriter(formatterContext.getOutputStream());
    40 		out = new ColorfulPrintWriter(formatterContext.getOutputStream());
    36 	}
    41 	}
    43 
    48 
    44 	@Override
    49 	@Override
    45 	public void writeColumnsHeader(ColumnsHeader header) {
    50 	public void writeColumnsHeader(ColumnsHeader header) {
    46 		super.writeColumnsHeader(header);
    51 		super.writeColumnsHeader(header);
    47 
    52 
       
    53 		columnWidth = new int[header.getColumnCount()];
       
    54 
    48 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
    55 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
    49 			out.print(TerminalStyle.Bright, cd.getLabel());
    56 			out.print(TerminalStyle.Bright, cd.getLabel());
    50 			out.print(" (");
    57 			out.print(HEADER_TYPE_PREFIX);
    51 			out.print(cd.getTypeName());
    58 			out.print(cd.getTypeName());
    52 			out.print(")");
    59 			out.print(HEADER_TYPE_SUFFIX);
    53 			if (!cd.isLastColumn()) {
    60 			if (!cd.isLastColumn()) {
    54 				out.print(TerminalColor.Green, " | ");
    61 				out.print(TerminalColor.Green, " | ");
    55 			}
    62 			}
       
    63 
       
    64 			setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length());
    56 		}
    65 		}
    57 		out.println();
    66 		out.println();
    58 		out.flush();
    67 		out.flush();
    59 	}
    68 	}
    60 
    69 
    64 
    73 
    65 		if (!isCurrentColumnFirst()) {
    74 		if (!isCurrentColumnFirst()) {
    66 			out.print(TerminalColor.Green, " | ");
    75 			out.print(TerminalColor.Green, " | ");
    67 		}
    76 		}
    68 
    77 
    69 		out.print(TerminalColor.Cyan, String.valueOf(value));
    78 		out.print(TerminalColor.Cyan, toString(value));
       
    79 	}
       
    80 
       
    81 	private int getColumnWidth(int columnNumber) {
       
    82 		return columnWidth[columnNumber - 1];
       
    83 	}
       
    84 
       
    85 	private void setColumnWidth(int columnNumber, int width) {
       
    86 		columnWidth[columnNumber - 1] = width;
       
    87 	}
       
    88 
       
    89 	private void updateColumnWidth(int columnNumber, int width) {
       
    90 		int oldWidth = getColumnWidth(columnNumber);
       
    91 		setColumnWidth(columnNumber, Math.max(width, oldWidth));
       
    92 
       
    93 	}
       
    94 
       
    95 	@Override
       
    96 	protected String toString(Object value) {
       
    97 		final int width = getColumnWidth(getCurrentColumnsCount());
       
    98 		if (value instanceof Number) {
       
    99 			return lpad(super.toString(value), width);
       
   100 		} else {
       
   101 			return rpad(super.toString(value), width);
       
   102 		}
    70 	}
   103 	}
    71 
   104 
    72 	@Override
   105 	@Override
    73 	public void writeEndRow() {
   106 	public void writeEndRow() {
    74 		super.writeEndRow();
   107 		super.writeEndRow();