java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
branchv_0
changeset 88 102ba0fcb07f
parent 87 03bf24449c7a
child 89 98d18e9a357b
equal deleted inserted replaced
87:03bf24449c7a 88:102ba0fcb07f
    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;
    22 import static info.globalcode.sql.dk.Functions.lpad;
    23 import static info.globalcode.sql.dk.Functions.rpad;
    23 import static info.globalcode.sql.dk.Functions.rpad;
    24 import static info.globalcode.sql.dk.Functions.repeat;
    24 import static info.globalcode.sql.dk.Functions.repeat;
       
    25 import java.util.Arrays;
       
    26 import java.util.List;
    25 
    27 
    26 /**
    28 /**
    27  *
    29  *
    28  * @author Ing. František Kučera (frantovo.cz)
    30  * @author Ing. František Kučera (frantovo.cz)
    29  */
    31  */
    57 
    59 
    58 	@Override
    60 	@Override
    59 	public void writeColumnsHeader(ColumnsHeader header) {
    61 	public void writeColumnsHeader(ColumnsHeader header) {
    60 		super.writeColumnsHeader(header);
    62 		super.writeColumnsHeader(header);
    61 
    63 
    62 		columnWidth = new int[header.getColumnCount()];
    64 		initColumnWidths(header.getColumnCount());
    63 
    65 
    64 		printTableIndent();
    66 		printTableIndent();
    65 		printTableBorder("╭");
    67 		printTableBorder("╭");
    66 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
    68 
    67 			setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length());
    69 		List<ColumnDescriptor> columnDescriptors = header.getColumnDescriptors();
       
    70 
       
    71 		for (ColumnDescriptor cd : columnDescriptors) {
       
    72 			// padding: make header cell at least same width as data cells in this column
       
    73 			int typeWidth = cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length();
       
    74 			cd.setLabel(rpad(cd.getLabel(), getColumnWidth(cd.getColumnNumber()) - typeWidth));
       
    75 			updateColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + typeWidth);
       
    76 
    68 			if (!cd.isFirstColumn()) {
    77 			if (!cd.isFirstColumn()) {
    69 				printTableBorder("┬");
    78 				printTableBorder("┬");
    70 			}
    79 			}
    71 			printTableBorder(repeat('─', getColumnWidth(cd.getColumnNumber()) + 2));
    80 			printTableBorder(repeat('─', getColumnWidth(cd.getColumnNumber()) + 2));
    72 		}
    81 		}
    73 		printTableBorder("╮");
    82 		printTableBorder("╮");
    74 		out.println();
    83 		out.println();
    75 
    84 
    76 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
    85 		for (ColumnDescriptor cd : columnDescriptors) {
    77 			if (cd.isFirstColumn()) {
    86 			if (cd.isFirstColumn()) {
    78 				printTableIndent();
    87 				printTableIndent();
    79 				printTableBorder("│ ");
    88 				printTableBorder("│ ");
    80 			} else {
    89 			} else {
    81 				printTableBorder(" │ ");
    90 				printTableBorder(" │ ");
    85 			out.print(cd.getTypeName());
    94 			out.print(cd.getTypeName());
    86 			out.print(HEADER_TYPE_SUFFIX);
    95 			out.print(HEADER_TYPE_SUFFIX);
    87 			if (cd.isLastColumn()) {
    96 			if (cd.isLastColumn()) {
    88 				printTableBorder(" │");
    97 				printTableBorder(" │");
    89 			}
    98 			}
    90 
       
    91 			setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length());
       
    92 		}
    99 		}
    93 		out.println();
   100 		out.println();
    94 
   101 
    95 		printTableIndent();
   102 		printTableIndent();
    96 		printTableBorder("├");
   103 		printTableBorder("├");
   104 		out.println();
   111 		out.println();
   105 
   112 
   106 		out.flush();
   113 		out.flush();
   107 	}
   114 	}
   108 
   115 
       
   116 	/**
       
   117 	 * Must be called before
       
   118 	 * {@linkplain #updateColumnWidth(int, int)}
       
   119 	 * and {@linkplain #getColumnWidth(int)}
       
   120 	 * for each result set.
       
   121 	 *
       
   122 	 * @param columnCount number of columns in current result set
       
   123 	 */
       
   124 	protected void initColumnWidths(int columnCount) {
       
   125 		if (columnWidth == null) {
       
   126 			columnWidth = new int[columnCount];
       
   127 		}
       
   128 	}
       
   129 
       
   130 	protected void cleanColumnWidths() {
       
   131 		columnWidth = null;
       
   132 	}
       
   133 
   109 	@Override
   134 	@Override
   110 	public void writeColumnValue(Object value) {
   135 	public void writeColumnValue(Object value) {
   111 		super.writeColumnValue(value);
   136 		super.writeColumnValue(value);
   112 
   137 
   113 		if (isCurrentColumnFirst()) {
   138 		if (isCurrentColumnFirst()) {
   131 
   156 
   132 	private void setColumnWidth(int columnNumber, int width) {
   157 	private void setColumnWidth(int columnNumber, int width) {
   133 		columnWidth[columnNumber - 1] = width;
   158 		columnWidth[columnNumber - 1] = width;
   134 	}
   159 	}
   135 
   160 
   136 	private void updateColumnWidth(int columnNumber, int width) {
   161 	protected void updateColumnWidth(int columnNumber, int width) {
   137 		int oldWidth = getColumnWidth(columnNumber);
   162 		int oldWidth = getColumnWidth(columnNumber);
   138 		setColumnWidth(columnNumber, Math.max(width, oldWidth));
   163 		setColumnWidth(columnNumber, Math.max(width, oldWidth));
   139 
   164 
   140 	}
   165 	}
   141 
   166 
   178 			printTableBorder(repeat('─', getColumnWidth(i) + 2));
   203 			printTableBorder(repeat('─', getColumnWidth(i) + 2));
   179 		}
   204 		}
   180 		printTableBorder("╯");
   205 		printTableBorder("╯");
   181 		out.println();
   206 		out.println();
   182 
   207 
       
   208 		cleanColumnWidths();
   183 
   209 
   184 		out.print(TerminalColor.Yellow, "Record count: ");
   210 		out.print(TerminalColor.Yellow, "Record count: ");
   185 		out.println(getCurrentRowCount());
   211 		out.println(getCurrentRowCount());
   186 		out.bell();
   212 		out.bell();
   187 		out.flush();
   213 		out.flush();