java/sql-dk/src/main/java/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java
3 * Copyright © 2014 František Kučera (frantovo.cz)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package info.globalcode.sql.dk.formatting;
19 import info.globalcode.sql.dk.ColorfulPrintWriter.TerminalColor;
20 import java.util.ArrayList;
21 import java.util.List;
22 import static info.globalcode.sql.dk.Functions.lpad;
23 import static info.globalcode.sql.dk.Functions.rpad;
24 import static info.globalcode.sql.dk.Functions.repeat;
27 * Longer values are line-wrapped – the cell then contains multiple lines. Marks are added to
28 * signalize forced line ends (not present in original data).
30 * @author Ing. František Kučera (frantovo.cz)
32 public class TabularWrappingFormatter extends TabularFormatter {
34 public static final String NAME = "tabular-wrapping"; // bash-completion:formatter
35 private List<String[]> currentRow;
37 public TabularWrappingFormatter(FormatterContext formatterContext) {
38 super(formatterContext);
42 public void writeStartResultSet(ColumnsHeader header) {
43 super.writeStartResultSet(header);
44 currentRow = new ArrayList<>(header.getColumnCount());
48 protected void writeColumnValueInternal(Object value) {
49 boolean rightAlign = value instanceof Number || value instanceof Boolean;
50 String valueString = String.valueOf(value);
51 int columnWidth = getColumnWidth(getCurrentColumnsCount()) - 1; // -1 = space for new line symbol
52 currentRow.add(wrapLines(valueString, columnWidth, rightAlign));
56 public void writeEndRow() {
60 boolean hasMoreWrappedLines;
63 hasMoreWrappedLines = false;
64 for (int i = 0; i < currentRow.size(); i++) {
67 printTableBorder("│ ");
69 printTableBorder(" │ ");
71 String[] columnArray = currentRow.get(i);
72 if (wrappedLine < columnArray.length) {
73 printValueWithWhitespaceReplaced(columnArray[wrappedLine]);
75 if (wrappedLine < columnArray.length - 1) {
76 out.print(TerminalColor.Red, "↩");
77 hasMoreWrappedLines = true;
83 out.print(repeat(' ', getColumnWidth(i + 1)));
86 if (i == (currentRow.size() - 1)) {
87 printTableBorder(" │");
93 } while (hasMoreWrappedLines);
99 public void writeEndRowInternal() {
100 // already done – wrapped row ends
103 private static String[] wrapLines(String s, int width, boolean rightAlign) {
104 String[] array = new String[(s.length() - 1) / width + 1];
105 for (int i = 0; i < array.length; i++) {
106 if (i == array.length - 1) {
107 String part = s.substring(i * width, s.length());
108 array[i] = rightAlign ? lpad(part, width) : rpad(part, width);
110 array[i] = s.substring(i * width, (i + 1) * width);