# HG changeset patch # User František Kučera # Date 1387797382 -3600 # Node ID be8db46a38c36d233eae0d63c9656574b27e18cf # Parent ff5bbc06ed291381241b33576a10c5321ed3564b TabularFormatter: basic column padding diff -r ff5bbc06ed29 -r be8db46a38c3 java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java Mon Dec 23 11:52:49 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java Mon Dec 23 12:16:22 2013 +0100 @@ -202,6 +202,17 @@ } } + /** + * @param value from ResultSet + * @return String representation of given value + */ + protected String toString(Object value) { + /** + * TODO: basic formatting: boolean, null, date, numbers… + */ + return String.valueOf(value); + } + @Override public void writeStartUpdatesResult() { pushState(State.UPDATES_RESULT, EnumSet.of(State.DATABASE)); diff -r ff5bbc06ed29 -r be8db46a38c3 java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java Mon Dec 23 11:52:49 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java Mon Dec 23 12:16:22 2013 +0100 @@ -29,6 +29,7 @@ private String typeName; private boolean firstColumn; private boolean lastColumn; + private int columnNumber; /** * @return column name @@ -84,4 +85,15 @@ public void setLastColumn(boolean lastColumn) { this.lastColumn = lastColumn; } + + /** + * @return number of this column, 1 = first + */ + public int getColumnNumber() { + return columnNumber; + } + + public void setColumnNumber(int columnNumber) { + this.columnNumber = columnNumber; + } } diff -r ff5bbc06ed29 -r be8db46a38c3 java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java Mon Dec 23 11:52:49 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java Mon Dec 23 12:16:22 2013 +0100 @@ -27,13 +27,13 @@ * @author Ing. František Kučera (frantovo.cz) */ public class ColumnsHeader { - + private ResultSetMetaData metaData; - + public ColumnsHeader(ResultSetMetaData metaData) { this.metaData = metaData; } - + public int getColumnCount() { try { return metaData.getColumnCount(); @@ -41,16 +41,19 @@ throw new IllegalStateException("Error during getting column count.", e); } } - + public List getColumnDescriptors() { try { int count = metaData.getColumnCount(); List list = new ArrayList<>(count); - + for (int i = 1; i <= count; i++) { ColumnDescriptor cd = new ColumnDescriptor(); + cd.setFirstColumn(i == 1); cd.setLastColumn(i == count); + cd.setColumnNumber(i); + cd.setLabel(metaData.getColumnLabel(i)); cd.setName(metaData.getColumnName(i)); cd.setType(metaData.getColumnType(i)); @@ -58,7 +61,7 @@ /** TODO: more properties */ list.add(cd); } - + return list; } catch (SQLException e) { throw new IllegalStateException("Error during building column descriptors.", e); diff -r ff5bbc06ed29 -r be8db46a38c3 java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java --- 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