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(); |