/**
* Copyright (C) 2012 alanhay <alanhay99@hotmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package uk.co.certait.htmlexporter.writer;
import org.jsoup.nodes.Element;
public abstract class AbstractTableRowWriter implements TableRowWriter {
private TableCellWriter cellWriter;
private RowTracker rowTracker;
public AbstractTableRowWriter(TableCellWriter cellWriter) {
this.cellWriter = cellWriter;
rowTracker = new RowTracker();
}
public void writeRow(Element row, int rowIndex) {
renderRow(row, rowIndex);
for (Element element : row.getAllElements()) {
if (element.tag().getName().equals(TD_TAG) || element.tag().getName().equals(TH_TAG)) {
int columnIndex = rowTracker.getNextColumnIndexForRow(rowIndex);
cellWriter.writeCell(element, rowIndex, columnIndex);
int rowSpan = getRowSpan(element);
int columnSpan = getColumnSpan(element);
rowTracker.addCell(rowIndex, columnIndex, rowSpan, columnSpan);
if (rowSpan > 1 || columnSpan > 1) {
doMerge(rowIndex, columnIndex, rowSpan, columnSpan);
}
}
}
}
protected boolean isRowGrouped(Element row) {
return row.hasAttr("");
}
protected String[] getRowGroups(Element row) {
return getAttributeValues(row, "");
}
protected String[] getAttributeValues(Element element, String attributeName) {
String values[] = null;
if (element.hasAttr(attributeName)) {
values = element.attr(attributeName).toLowerCase().split(",");
for (String value : values) {
value = value.trim().toLowerCase();
}
}
return values;
}
protected int getColumnSpan(Element element) {
int columnSpan = 1;
if (element.hasAttr("colspan")) {
columnSpan = Integer.parseInt(element.attr("colspan"));
}
return columnSpan;
}
protected int getRowSpan(Element element) {
int rowSpan = 1;
if (element.hasAttr("rowSpan")) {
rowSpan = Integer.parseInt(element.attr("rowSpan"));
}
return rowSpan;
}
public abstract void renderRow(Element row, int rowIndex);
public abstract void doMerge(int rowIndex, int columnIndex, int rowSpan, int columnSpan);
}