private void writeColgroup()

in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java [948:1045]


  private void writeColgroup(
      final FacesContext facesContext, final AbstractUISheet sheet, final TobagoResponseWriter writer,
      final List<Integer> columnWidths, final List<AbstractUIColumnBase> columns, final boolean isHeader)
      throws IOException {
    writer.startElement(HtmlElements.COLGROUP);
    int numOfCols = 0;
    for (final AbstractUIColumnBase column : columns) {
      if (!(column instanceof AbstractUIRow) && !(column instanceof AbstractUIColumnPanel)) {
        if (column.isRendered()) {
          writeCol(writer, null);
          numOfCols++;
        }
      }
    }
    writeCol(writer, TobagoClass.ROW__FILLER);
    writeCol(writer, TobagoClass.BEHAVIOR__CONTAINER);
    writer.endElement(HtmlElements.COLGROUP);

    if (isHeader) { // write style tag only once (when rendering header), but for both header and body
      final MeasureList columnLayout = sheet.getColumnLayout();
      final String sheetId = sheet.getClientId(facesContext);
      final String encodedSheetId = StyleRenderUtils.encodeIdSelector(sheetId);
      final boolean hasAutoOrFrValue = columnLayout.stream()
          .anyMatch(measure -> measure.getUnit().equals(Measure.Unit.AUTO)
              || measure.getUnit().equals(Measure.Unit.FR));
      boolean columnWidthSetByUser = false;

      float fr = 0;
      MeasureList tangibleMeasures = new MeasureList();

      int columnIndex = 0;
      int renderedColumnIndex = 0;
      for (final AbstractUIColumnBase column : columns) {
        if (!(column instanceof AbstractUIRow) && !(column instanceof AbstractUIColumnPanel)) {
          if (column.isRendered()) {
            Measure measure;
            int columnWidth = columnWidths.get(columnIndex);
            if (columnWidth > -1) {
              columnWidthSetByUser = true;
              measure = new Measure(columnWidth, Measure.Unit.PX);
            } else {
              measure = columnLayout.get(columnIndex % columnLayout.getSize());
            }
            if (Measure.Unit.FR.equals(measure.getUnit())) {
              fr += measure.getValue();
            } else {
              if (Measure.Unit.AUTO.equals(measure.getUnit())) {
                tangibleMeasures.add(new Measure(100.0 / (numOfCols + 2), Measure.Unit.PERCENT));
                /* (numOfCols + 2) for backwards compatibility, because the
                previous initialization in TypeScript had included the COL.tobago-row-filler and
                COL.tobago-behavior-container in the calculation. */
              } else {
                tangibleMeasures.add(measure);
              }
              encodeColStyle(facesContext, encodedSheetId, null, renderedColumnIndex, measure);
            }

            renderedColumnIndex++;
          }
          columnIndex++;
        }
      }

      if (fr > 0) {
        columnIndex = 0;
        renderedColumnIndex = 0;
        for (final AbstractUIColumnBase column : columns) {
          if (!(column instanceof AbstractUIRow) && !(column instanceof AbstractUIColumnPanel)) {
            if (column.isRendered()) {
              Measure measure = columnLayout.get(columnIndex % columnLayout.getSize());
              if (Measure.Unit.FR.equals(measure.getUnit())) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("calc((100%");
                for (Measure tangibleMeasure : tangibleMeasures) {
                  stringBuilder.append(" - ");
                  stringBuilder.append(tangibleMeasure.getValue());
                  stringBuilder.append(tangibleMeasure.getUnit().getValue());
                }
                stringBuilder.append(") / ");
                stringBuilder.append(fr);
                stringBuilder.append(" * ");
                stringBuilder.append(measure.getValue());
                stringBuilder.append(")");
                encodeColStyle(facesContext, writer, encodedSheetId, renderedColumnIndex, stringBuilder.toString());
              }
              renderedColumnIndex++;
            }
            columnIndex++;
          }
        }
      }

      Measure zeroPixel = new Measure(0, Measure.Unit.PX);
      encodeColStyle(facesContext, encodedSheetId, TobagoClass.ROW__FILLER, null,
          columnWidthSetByUser || !hasAutoOrFrValue ? Measure.AUTO : zeroPixel);
      encodeColStyle(facesContext, encodedSheetId, TobagoClass.BEHAVIOR__CONTAINER, null, zeroPixel);
    }
  }