| | |
| | | |
| | | /** |
| | | * This is a forked version of FlipTables which supports controlling the |
| | | * displayed borders. |
| | | * displayed borders and gracefully handles null cell values. |
| | | * |
| | | * FULL = all borders |
| | | * BODY_COLS = header + perimeter + column separators |
| | |
| | | private static final String EMPTY = "(empty)"; |
| | | |
| | | public static enum Borders { |
| | | FULL(7), BODY_COLS(5), COLS(4), BODY(1), HEADER(0); |
| | | FULL(15), BODY_HCOLS(13), HCOLS(12), BODY(9), HEADER(8), COLS(4); |
| | | |
| | | final int bitmask; |
| | | |
| | | private Borders(int bitmask) { |
| | | this.bitmask = bitmask; |
| | | } |
| | | |
| | | boolean header() { |
| | | return isset(0x8); |
| | | } |
| | | |
| | | boolean body() { |
| | |
| | | rowData.length, columns)); |
| | | } |
| | | for (int column = 0; column < columns; column++) { |
| | | for (String rowDataLine : rowData[column].split("\\n")) { |
| | | String cell = rowData[column]; |
| | | if (cell == null) { |
| | | continue; |
| | | } |
| | | for (String rowDataLine : cell.split("\\n")) { |
| | | columnWidths[column] = Math.max(columnWidths[column], rowDataLine.length()); |
| | | } |
| | | } |
| | |
| | | @Override |
| | | public String toString() { |
| | | StringBuilder builder = new StringBuilder(); |
| | | printDivider(builder, "╔═╤═╗"); |
| | | if (borders.header()) { |
| | | printDivider(builder, "╔═╤═╗"); |
| | | } |
| | | printData(builder, headers, true); |
| | | if (data.length == 0) { |
| | | if (borders.body()) { |
| | | printDivider(builder, "╠═╧═╣"); |
| | | builder.append('║').append(pad(emptyWidth, EMPTY)).append("║\n"); |
| | | printDivider(builder, "╚═══╝"); |
| | | } else { |
| | | } else if (borders.header()) { |
| | | printDivider(builder, "╚═╧═╝"); |
| | | builder.append(' ').append(pad(emptyWidth, EMPTY)).append(" \n"); |
| | | } |
| | | } else { |
| | | for (int row = 0; row < data.length; row++) { |
| | | if (row == 0) { |
| | | if (row == 0 && borders.header()) { |
| | | if (borders.body()) { |
| | | if (borders.columns()) { |
| | | printDivider(builder, "╠═╪═╣"); |
| | |
| | | } else { |
| | | printDivider(builder, "╚═╧═╝"); |
| | | } |
| | | } |
| | | } else if (row == 0 && !borders.header()) { |
| | | if (borders.columns()) { |
| | | printDivider(builder, " ─┼─ "); |
| | | } else { |
| | | printDivider(builder, " ─┼─ "); |
| | | } |
| | | } else if (borders.rows()) { |
| | | if (borders.columns()) { |
| | |
| | | for (int line = 0, lines = 1; line < lines; line++) { |
| | | for (int column = 0; column < columns; column++) { |
| | | if (column == 0) { |
| | | if (isHeader || borders.body()) { |
| | | if ((isHeader && borders.header()) || borders.body()) { |
| | | out.append('║'); |
| | | } else { |
| | | out.append(' '); |
| | |
| | | } else { |
| | | out.append(' '); |
| | | } |
| | | String[] cellLines = data[column].split("\\n"); |
| | | String cell = data[column]; |
| | | if (cell == null) { |
| | | cell = ""; |
| | | } |
| | | String[] cellLines = cell.split("\\n"); |
| | | lines = Math.max(lines, cellLines.length); |
| | | String cellLine = line < cellLines.length ? cellLines[line] : ""; |
| | | out.append(pad(columnWidths[column], cellLine)); |
| | | } |
| | | if (isHeader || borders.body()) { |
| | | if ((isHeader && borders.header()) || borders.body()) { |
| | | out.append("║\n"); |
| | | } else { |
| | | out.append('\n'); |