int footerCounts[] = new int[columnCount];
int maxFooterCount = 0;
for (int col = 0; col < columnCount; col++) {
// Get the header property.
ColumnDefinition<RowType, ?> colDef = visibleColumns.get(col);
FooterProperty prop = colDef.getColumnProperty(FooterProperty.TYPE);
int footerCount = prop.getFooterCount();
footerCounts[col] = footerCount;
maxFooterCount = Math.max(maxFooterCount, footerCount);
// Add each ColumnHeaderInfo
List<ColumnHeaderInfo> infos = new ArrayList<ColumnHeaderInfo>();
ColumnHeaderInfo prev = null;
for (int row = 0; row < footerCount; row++) {
Object footer = prop.getFooter(row, col);
if (prev != null && prev.header.equals(footer)) {
prev.incrementRowSpan();
} else {
prev = new ColumnHeaderInfo(footer);
infos.add(prev);