in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java [544:776]
private void encodeTableBody(
final FacesContext facesContext, final AbstractUISheet sheet, final TobagoResponseWriter writer,
final String sheetId,
final Selectable selectable, final List<Integer> columnWidths, final List<Integer> selectedRows,
final List<AbstractUIColumnBase> columns, final boolean autoLayout, final List<Integer> expandedValue)
throws IOException {
final boolean showHeader = sheet.isShowHeader();
final Markup sheetMarkup = sheet.getMarkup() != null ? sheet.getMarkup() : Markup.NULL;
final ExpandedState expandedState = sheet.isTreeModel() ? sheet.getExpandedState() : null;
if (showHeader && !autoLayout) {
// if no autoLayout, we render the header in a separate table.
writer.startElement(HtmlElements.HEADER);
writer.startElement(HtmlElements.TABLE);
writer.writeAttribute(HtmlAttributes.CELLSPACING, "0", false);
writer.writeAttribute(HtmlAttributes.CELLPADDING, "0", false);
writer.writeAttribute(HtmlAttributes.SUMMARY, "", false);
writer.writeClassAttribute(
BootstrapClass.TABLE,
sheetMarkup.contains(Markup.DARK) ? BootstrapClass.TABLE_DARK : null,
sheetMarkup.contains(Markup.BORDERED) ? BootstrapClass.TABLE_BORDERED : null,
sheetMarkup.contains(Markup.SMALL) ? BootstrapClass.TABLE_SM : null,
TobagoClass.TABLE_LAYOUT__FIXED);
writeColgroup(writer, columnWidths, columns, true);
writer.startElement(HtmlElements.THEAD);
encodeHeaderRows(facesContext, sheet, writer, columns);
writer.endElement(HtmlElements.THEAD);
writer.endElement(HtmlElements.TABLE);
writer.endElement(HtmlElements.HEADER);
}
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(TobagoClass.BODY);
writer.startElement(HtmlElements.TABLE);
writer.writeAttribute(HtmlAttributes.CELLSPACING, "0", false);
writer.writeAttribute(HtmlAttributes.CELLPADDING, "0", false);
writer.writeAttribute(HtmlAttributes.SUMMARY, "", false);
writer.writeClassAttribute(
BootstrapClass.TABLE,
sheetMarkup.contains(Markup.DARK) ? BootstrapClass.TABLE_DARK : null,
sheetMarkup.contains(Markup.STRIPED) ? BootstrapClass.TABLE_STRIPED : null,
sheetMarkup.contains(Markup.BORDERED) ? BootstrapClass.TABLE_BORDERED : null,
sheetMarkup.contains(Markup.HOVER) ? BootstrapClass.TABLE_HOVER : null,
sheetMarkup.contains(Markup.SMALL) ? BootstrapClass.TABLE_SM : null,
!autoLayout ? TobagoClass.TABLE_LAYOUT__FIXED : null);
if (showHeader && autoLayout) {
writer.startElement(HtmlElements.THEAD);
encodeHeaderRows(facesContext, sheet, writer, columns);
writer.endElement(HtmlElements.THEAD);
}
if (!autoLayout) {
writeColgroup(writer, columnWidths, columns, false);
}
// Print the Content
if (LOG.isDebugEnabled()) {
LOG.debug("first = " + sheet.getFirst() + " rows = " + sheet.getRows());
}
writer.startElement(HtmlElements.TBODY);
final String var = sheet.getVar();
boolean emptySheet = true;
// rows = 0 means: show all
final int last = sheet.isRowsUnlimited() ? Integer.MAX_VALUE : sheet.getFirst() + sheet.getRows();
for (int rowIndex = sheet.getFirst(); rowIndex < last; rowIndex++) {
sheet.setRowIndex(rowIndex);
if (!sheet.isRowAvailable()) {
break;
}
final Object rowRendered = sheet.getAttributes().get("rowRendered");
if (rowRendered instanceof Boolean && !((Boolean) rowRendered)) {
continue;
}
emptySheet = false;
if (LOG.isDebugEnabled()) {
LOG.debug("var " + var);
LOG.debug("list " + sheet.getValue());
}
if (sheet.isTreeModel()) {
final TreePath path = sheet.getPath();
if (sheet.isFolder() && expandedState.isExpanded(path)) {
expandedValue.add(rowIndex);
}
}
writer.startElement(HtmlElements.TR);
writer.writeAttribute(CustomAttributes.ROW_INDEX, rowIndex);
final boolean selected = selectedRows.contains(rowIndex);
final String parentId = sheet.getRowParentClientId();
if (parentId != null) {
// TODO: replace with
// todo writer.writeIdAttribute(parentId + SUB_SEPARATOR + AbstractUITree.SUFFIX_PARENT);
// todo like in TreeListboxRenderer
writer.writeAttribute(DataAttributes.TREE_PARENT, parentId, false);
}
AbstractUIRow row = null;
for (final UIColumn column : columns) {
if (column.isRendered()) {
if (column instanceof AbstractUIRow) {
row = (AbstractUIRow) column;
// todo: Markup.CLICKABLE ???
}
}
}
// the row client id depends from the existence of an UIRow component! TBD: is this good?
writer.writeIdAttribute(row != null ? row.getClientId(facesContext) : sheet.getRowClientId());
writer.writeClassAttribute(
selected ? TobagoClass.SELECTED : null,
selected ? BootstrapClass.TABLE_INFO : null,
row != null ? row.getCustomClass() : null,
sheet.isRowVisible() ? null : BootstrapClass.D_NONE);
int colSpan = 0;
AbstractUIColumnPanel panel = null;
for (final AbstractUIColumnBase column : columns) {
if (column.isRendered()) {
if (column instanceof AbstractUIColumn || column instanceof AbstractUIColumnSelector
|| column instanceof AbstractUIColumnNode) {
colSpan++;
writer.startElement(HtmlElements.TD);
Markup markup = column.getMarkup();
if (markup == null) {
markup = Markup.NULL;
}
writer.writeClassAttribute(
BootstrapClass.textAlign(
column instanceof AbstractUIColumn ? ((AbstractUIColumn) column).getAlign() : null),
BootstrapClass.verticalAlign(
column instanceof AbstractUIColumn ? ((AbstractUIColumn) column).getVerticalAlign() : null),
column.getCustomClass());
if (column instanceof AbstractUIColumnSelector) {
final AbstractUIColumnSelector selector = (AbstractUIColumnSelector) column;
writer.startElement(HtmlElements.INPUT);
writer.writeNameAttribute(sheetId + "_data_row_selector_" + rowIndex);
if (selectable.isSingle()) {
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.RADIO);
} else {
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.CHECKBOX);
}
writer.writeAttribute(HtmlAttributes.CHECKED, selected);
writer.writeAttribute(HtmlAttributes.DISABLED, selector.isDisabled());
writer.writeClassAttribute(
BootstrapClass.FORM_CHECK_INLINE,
TobagoClass.SELECTED);
writer.endElement(HtmlElements.INPUT);
} else /*if (normalColumn instanceof AbstractUIColumnNode)*/ {
column.encodeAll(facesContext);
} /*else {
final List<UIComponent> children = sheet.getRenderedChildrenOf(normalColumn);
for (final UIComponent grandKid : children) {
grandKid.encodeAll(facesContext);
}
}*/
writer.endElement(HtmlElements.TD);
} else if (column instanceof AbstractUIColumnPanel) {
panel = (AbstractUIColumnPanel) column;
}
}
}
colSpan++;
writer.startElement(HtmlElements.TD);
writer.startElement(HtmlElements.DIV);
writer.endElement(HtmlElements.DIV);
encodeBehavior(writer, facesContext, row);
writer.endElement(HtmlElements.TD);
writer.endElement(HtmlElements.TR);
if (panel != null) {
writer.startElement(HtmlElements.TR);
writer.writeClassAttribute(panel.getCustomClass());
writer.startElement(HtmlElements.TD);
writer.writeAttribute(HtmlAttributes.COLSPAN, colSpan);
panel.encodeAll(facesContext);
writer.endElement(HtmlElements.TD);
writer.endElement(HtmlElements.TR);
}
}
sheet.setRowIndex(-1);
if (emptySheet && showHeader) {
writer.startElement(HtmlElements.TR);
int countColumns = 0;
for (final UIColumn column : columns) {
if (!(column instanceof AbstractUIRow)) {
countColumns++;
}
}
writer.startElement(HtmlElements.TD);
writer.writeAttribute(HtmlAttributes.COLSPAN, countColumns);
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(BootstrapClass.TEXT_CENTER);
writer.writeText(ResourceUtils.getString(facesContext, "sheet.empty"));
writer.endElement(HtmlElements.DIV);
writer.endElement(HtmlElements.TD);
if (!autoLayout) {
writer.startElement(HtmlElements.TD);
// writer.write(" ");
writer.startElement(HtmlElements.DIV);
writer.endElement(HtmlElements.DIV);
writer.endElement(HtmlElements.TD);
}
writer.endElement(HtmlElements.TR);
}
writer.endElement(HtmlElements.TBODY);
writer.endElement(HtmlElements.TABLE);
writer.endElement(HtmlElements.DIV);
// END RENDER BODY CONTENT
}