public void encodeBeginInternal()

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);
    }
  }