package org.concordion.internal; import java.util.ArrayList; import java.util.List; import org.concordion.api.Element; public class Table { private final Element tableElement; public Table(Element tableElement) { assert tableElement.isNamed("table"); this.tableElement = tableElement; } public Row getLastHeaderRow() { Row[] headerRows = getHeaderRows(); if (headerRows.length == 0) { throw new RuntimeException("Table has no header row (i.e. no row containing only <th> elements)"); } else { return headerRows[headerRows.length - 1]; } } private Row[] getHeaderRows() { List<Row> headerRows = new ArrayList<Row>(); for (Row row : getRows()) { if (row.isHeaderRow()) { headerRows.add(row); } } return headerRows.toArray(new Row[headerRows.size()]); } public Row[] getDetailRows() { List<Row> detailRows = new ArrayList<Row>(); for (Row row : getRows()) { if (!row.isHeaderRow()) { detailRows.add(row); } } return detailRows.toArray(new Row[detailRows.size()]); } private Row[] getRows() { List<Row> rows = new ArrayList<Row>(); for (Element rowElement : tableElement.getDescendantElements("tr")) { rows.add(new Row(rowElement)); } return rows.toArray(new Row[rows.size()]); } public Row addDetailRow() { Element rowElement = new Element("tr"); Element tbody = tableElement.getFirstChildElement("tbody"); if (tbody != null) { tbody.appendChild(rowElement); } else { tableElement.appendChild(rowElement); } for (int i = 0; i < getColumnCount(); i++) { rowElement.appendChild(new Element("td")); } return new Row(rowElement); } private int getColumnCount() { return getLastHeaderRow().getCells().length; } }