diff -r 7e08730da258 -r 4a1864c3e867 java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java Mon Mar 04 17:06:42 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/** - * SQL-DK - * Copyright © 2014 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package info.globalcode.sql.dk.formatting; - -import info.globalcode.sql.dk.ColorfulPrintWriter.TerminalColor; -import java.util.ArrayList; -import java.util.List; -import static info.globalcode.sql.dk.Functions.lpad; -import static info.globalcode.sql.dk.Functions.rpad; -import static info.globalcode.sql.dk.Functions.repeat; - -/** - * Longer values are line-wrapped – the cell then contains multiple lines. Marks are added to - * signalize forced line ends (not present in original data). - * - * @author Ing. František Kučera (frantovo.cz) - */ -public class TabularWrappingFormatter extends TabularFormatter { - - public static final String NAME = "tabular-wrapping"; // bash-completion:formatter - private List currentRow; - - public TabularWrappingFormatter(FormatterContext formatterContext) { - super(formatterContext); - } - - @Override - public void writeStartResultSet(ColumnsHeader header) { - super.writeStartResultSet(header); - currentRow = new ArrayList<>(header.getColumnCount()); - } - - @Override - protected void writeColumnValueInternal(Object value) { - boolean rightAlign = value instanceof Number || value instanceof Boolean; - String valueString = String.valueOf(value); - int columnWidth = getColumnWidth(getCurrentColumnsCount()) - 1; // -1 = space for new line symbol - currentRow.add(wrapLines(valueString, columnWidth, rightAlign)); - } - - @Override - public void writeEndRow() { - super.writeEndRow(); - - int wrappedLine = 0; - boolean hasMoreWrappedLines; - - do { - hasMoreWrappedLines = false; - for (int i = 0; i < currentRow.size(); i++) { - if (i == 0) { - printTableIndent(); - printTableBorder("│ "); - } else { - printTableBorder(" │ "); - } - String[] columnArray = currentRow.get(i); - if (wrappedLine < columnArray.length) { - printValueWithWhitespaceReplaced(columnArray[wrappedLine]); - - if (wrappedLine < columnArray.length - 1) { - out.print(TerminalColor.Red, "↩"); - hasMoreWrappedLines = true; - } else { - out.print(" "); - } - - } else { - out.print(repeat(' ', getColumnWidth(i + 1))); - } - - if (i == (currentRow.size() - 1)) { - printTableBorder(" │"); - } - } - out.println(); - out.flush(); - wrappedLine++; - } while (hasMoreWrappedLines); - - currentRow.clear(); - } - - @Override - public void writeEndRowInternal() { - // already done – wrapped row ends - } - - private static String[] wrapLines(String s, int width, boolean rightAlign) { - String[] array = new String[(s.length() - 1) / width + 1]; - for (int i = 0; i < array.length; i++) { - if (i == array.length - 1) { - String part = s.substring(i * width, s.length()); - array[i] = rightAlign ? lpad(part, width) : rpad(part, width); - } else { - array[i] = s.substring(i * width, (i + 1) * width); - } - } - return array; - } -}