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