package org.emdev.common.textmarkup; import org.ebookdroid.droids.fb2.codec.LineCreationParams; import java.util.ArrayList; import java.util.UUID; import org.emdev.common.textmarkup.line.Line; import org.emdev.common.textmarkup.line.LineStream; import org.emdev.common.textmarkup.line.MultiLineElement; public class MarkupTable implements MarkupElement { private static final int DOUBLE_BORDER_WIDTH = MultiLineElement.BORDER_WIDTH * 2; public final String uuid = UUID.randomUUID().toString(); final ArrayList<ArrayList<Cell>> rows = new ArrayList<ArrayList<Cell>>(); int maxColCount; public void addRow() { rows.add(new ArrayList<Cell>()); } public Cell addCol() { if (rows.isEmpty()) { addRow(); } final Cell c = new Cell(); final ArrayList<Cell> row = rows.get(rows.size() - 1); row.add(c); c.stream = uuid + ":" + rows.size() + ":" + row.size(); maxColCount = Math.max(maxColCount, row.size()); return c; } @Override public void publishToLines(final LineStream lines) { if (rows.isEmpty()) { return; } final int cellWidth = lines.params.maxLineWidth / maxColCount; for (final ArrayList<Cell> row : rows) { final Line rowLine = lines.add(); rowLine.applyJustification(JustificationMode.Center); int maxHeight = 0; for (final Cell cell : row) { final int cellHeight = MultiLineElement.calcHeight(cell.getLines(lines.params, cellWidth)); maxHeight = Math.max(maxHeight, cellHeight); } for (final Cell cell : row) { final MultiLineElement cellElem = cell.getElement(cellWidth, maxHeight); rowLine.append(cellElem); cellElem.applyNotes(rowLine); } } } public class Cell { public JustificationMode align = JustificationMode.Left; public String stream; public boolean hasBackground; private LineStream lines; private LineStream getLines(final LineCreationParams params, final int cellWidth) { if (lines == null) { lines = params.content.getStreamLines(stream, cellWidth - DOUBLE_BORDER_WIDTH, align, params.hyphenEnabled); } return lines; } private MultiLineElement getElement(final int cellWidth, final int maxHeight) { return new MultiLineElement(cellWidth, maxHeight + DOUBLE_BORDER_WIDTH, lines, true, hasBackground); } } }