table.removeRow(0);
}
// Generate the header table
int columnCount = allInfos.size();
FlexCellFormatter formatter = table.getFlexCellFormatter();
List<ColumnHeaderInfo> prevInfos = null;
for (int col = 0; col < columnCount; col++) {
List<ColumnHeaderInfo> infos = allInfos.get(col);
int row = 0;
for (ColumnHeaderInfo info : infos) {
// Get the actual row and cell index
int rowSpan = info.getRowSpan();
int cell = 0;
if (table.getRowCount() > row) {
cell = table.getCellCount(row);
}
// Compare to the cell in the previous column
if (prevInfos != null) {
boolean headerAdded = false;
int prevRow = 0;
for (ColumnHeaderInfo prevInfo : prevInfos) {
// Increase the colSpan of the previous cell
if (prevRow == row && info.equals(prevInfo)) {
int colSpan = formatter.getColSpan(row, cell - 1);
formatter.setColSpan(row, cell - 1, colSpan + 1);
headerAdded = true;
break;
}
prevRow += prevInfo.getRowSpan();
}
if (headerAdded) {
row += rowSpan;
continue;
}
}
// Set the new header
Object header = info.getHeader();
if (header instanceof Widget) {
table.setWidget(row, cell, (Widget) header);
} else {
table.setHTML(row, cell, header.toString());
}
// Update the rowSpan
if (rowSpan > 1) {
formatter.setRowSpan(row, cell, rowSpan);
}
// Increment the row
row += rowSpan;
}
// Increment the previous info
prevInfos = infos;
}
// Insert the checkbox column
SelectionPolicy selectionPolicy = getDataTable().getSelectionPolicy();
if (selectionPolicy.hasInputColumn()) {
// Get the select all box
Widget box = null;
if (isHeader
&& getDataTable().getSelectionPolicy() == SelectionPolicy.CHECKBOX) {
box = getSelectAllWidget();
}
// Add the offset column
table.insertCell(0, 0);
if (box != null) {
table.setWidget(0, 0, box);
} else {
table.setHTML(0, 0, " ");
}
formatter.setRowSpan(0, 0, table.getRowCount());
formatter.setHorizontalAlignment(0, 0,
HasHorizontalAlignment.ALIGN_CENTER);
table.setColumnWidth(0, getDataTable().getInputColumnWidth());
}
}