in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java [193:335]
public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
final String sheetId = component.getClientId(facesContext);
final Markup markup = component.getMarkup();
final TobagoResponseWriter writer = getResponseWriter(facesContext);
final PaginatorMode paginator = component.getPaginator();
LOG.debug("paginator={}", paginator);
switch (paginator) {
case list, auto -> {
final UIComponent after = ensureAfterFacetPaginator(facesContext, component);
if (after.getChildCount() == 0) {
final UIPaginatorList paginatorList = (UIPaginatorList) ComponentUtils.createComponent(
facesContext, Tags.paginatorList.componentType(), RendererTypes.PaginatorList, "_paginator_list");
after.getChildren().add(paginatorList);
}
}
case page -> {
final UIComponent after = ensureAfterFacetPaginator(facesContext, component);
if (after.getChildCount() == 0) {
final UIPaginatorPage paginatorPage = (UIPaginatorPage) ComponentUtils.createComponent(
facesContext, Tags.paginatorPage.componentType(), RendererTypes.PaginatorPage, "_paginator_page");
after.getChildren().add(paginatorPage);
}
}
case row -> {
final UIComponent after = ensureAfterFacetPaginator(facesContext, component);
if (after.getChildCount() == 0) {
final UIPaginatorRow paginatorRow = (UIPaginatorRow) ComponentUtils.createComponent(
facesContext, Tags.paginatorRow.componentType(), RendererTypes.PaginatorRow, "_paginator_row");
after.getChildren().add(paginatorRow);
}
}
case useShowAttributes -> {
boolean initialized = component.getAttributes().get("useShowAttributesInitialized") != null;
if (!initialized) {
final Map<ShowPosition, AbstractUIPaginator> paginatorMap = new HashMap<>();
final ShowPosition rangePosition = component.getShowRowRange();
if (!ShowPosition.none.equals(rangePosition) && component.isPagingVisible()) {
final UIPaginatorRow paginatorRow = (UIPaginatorRow) ComponentUtils.createComponent(
facesContext, Tags.paginatorRow.componentType(), RendererTypes.PaginatorRow, "_paginator_row");
paginatorRow.setAlwaysVisible(component.isShowPagingAlways());
paginatorMap.put(rangePosition, paginatorRow);
}
final ShowPosition listPosition = component.getShowDirectLinks();
if (!ShowPosition.none.equals(listPosition) && component.isPagingVisible()) {
final UIPaginatorList paginatorList = (UIPaginatorList) ComponentUtils.createComponent(
facesContext, Tags.paginatorList.componentType(), RendererTypes.PaginatorList, "_paginator_list");
paginatorList.setAlwaysVisible(component.isShowPagingAlways());
paginatorList.setArrows(component.isShowDirectLinksArrows() ? Arrows.show : Arrows.hide);
paginatorList.setMax(component.getDirectLinkCount());
paginatorMap.put(listPosition, paginatorList);
}
final ShowPosition pagePosition = component.getShowPageRange();
if (!ShowPosition.none.equals(pagePosition) && component.isPagingVisible()) {
final UIPaginatorPage paginatorPage = (UIPaginatorPage) ComponentUtils.createComponent(
facesContext, Tags.paginatorPage.componentType(), RendererTypes.PaginatorPage, "_paginator_page");
paginatorPage.setAlwaysVisible(component.isShowPagingAlways());
paginatorMap.put(pagePosition, paginatorPage);
}
if (!paginatorMap.isEmpty()) {
final UIComponent after = ensureAfterFacetPaginator(facesContext, component);
final ShowPosition[] order = {ShowPosition.left, ShowPosition.center, ShowPosition.right};
for (ShowPosition showPosition : order) {
if (paginatorMap.containsKey(showPosition)) {
after.getChildren().add(paginatorMap.get(showPosition));
} else {
final UIOut space = (UIOut) ComponentUtils.createComponent(
facesContext, Tags.out.componentType(), RendererTypes.Out, "_space_" + showPosition.name());
after.getChildren().add(space);
}
}
}
component.getAttributes().put("useShowAttributesInitialized", Boolean.TRUE);
}
}
case custom -> {
// nothing to do
}
default -> throw new IllegalStateException("Unknown paginator mode: " + paginator);
}
UIComponent header = component.getHeader();
if (header == null) {
header = ComponentUtils.createComponent(facesContext, Tags.panel.componentType(), null, "_header");
header.setTransient(true);
final List<AbstractUIColumnBase> columns = component.getAllColumns();
int i = 0;
for (final AbstractUIColumnBase column : columns) {
if (!(column instanceof AbstractUIRow)) {
final UIComponent labelFacet = ComponentUtils.getFacet(column, Facets.label);
final AbstractUIOut out = (AbstractUIOut) ComponentUtils.createComponent(
facesContext, Tags.out.componentType(), RendererTypes.Out, "_col" + i);
out.setTransient(true);
if (labelFacet == null) {
out.setValue(ComponentUtils.getAttribute(column, Attributes.label));
}
out.setRendered(column.isRendered());
out.setLabelLayout(LabelLayout.skip);
header.getChildren().add(out);
}
i++;
}
component.setHeader(header);
}
component.init(facesContext);
// Outer sheet div
insideBegin(facesContext, HtmlElements.TOBAGO_SHEET);
writer.startElement(HtmlElements.TOBAGO_SHEET);
writer.writeIdAttribute(sheetId);
HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
writer.writeClassAttribute(
component.getCustomClass(),
markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
writer.writeAttribute(DataAttributes.SELECTION_MODE, component.getSelectable().name(), false);
writer.writeAttribute(DataAttributes.FIRST, Integer.toString(component.getFirst()), false);
writer.writeAttribute(CustomAttributes.ROWS, component.getRows());
writer.writeAttribute(CustomAttributes.ROW_COUNT, Integer.toString(component.getRowCount()), false);
writer.writeAttribute(CustomAttributes.LAZY, component.isLazy());
writer.writeAttribute(CustomAttributes.LAZY_ROWS, component.isLazy() ? component.getLazyRows() : null);
writer.writeAttribute(CustomAttributes.LAZY_UPDATE, component.getLazyUpdate());
final boolean autoLayout = component.isAutoLayout();
if (!autoLayout) {
writer.writeAttribute(DataAttributes.LAYOUT, JsonUtils.encode(component.getColumnLayout(), "columns"), true);
}
encodeBehavior(writer, facesContext, component);
final AbstractUIReload reload = ComponentUtils.getReloadFacet(component);
if (reload != null) {
reload.encodeAll(facesContext);
}
}