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