in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java [740:938]
private void encodeHeaderRows(
final FacesContext facesContext, final AbstractUISheet sheet, final TobagoResponseWriter writer,
final List<AbstractUIColumnBase> columns)
throws IOException {
final String sheetClientId = sheet.getClientId(facesContext);
final Selectable selectable = sheet.getSelectable();
final Grid grid = sheet.getHeaderGrid();
final boolean autoLayout = sheet.isAutoLayout();
final boolean multiHeader = grid.getRowCount() > 1;
int offset = 0;
for (int i = 0; i < grid.getRowCount(); i++) {
writer.startElement(HtmlElements.TR);
final AbstractUIRow row = ComponentUtils.findChild(sheet, AbstractUIRow.class);
if (row != null) {
writer.writeClassAttribute(row.getCustomClass());
}
for (int j = 0; j < columns.size(); j++) {
final AbstractUIColumnBase column = columns.get(j);
if (!column.isRendered() || column instanceof AbstractUIRow || column instanceof AbstractUIColumnPanel) {
offset++;
} else {
final Cell cell = grid.getCell(j - offset, i);
if (cell instanceof OriginCell) {
writer.startElement(HtmlElements.TH);
writer.writeIdAttribute(column.getClientId(facesContext)
+ (multiHeader ? ComponentUtils.SUB_SEPARATOR + cell.getComponent().getId() : ""));
if (cell.getColumnSpan() > 1) {
writer.writeAttribute(HtmlAttributes.COLSPAN, cell.getColumnSpan());
}
if (cell.getRowSpan() > 1) {
writer.writeAttribute(HtmlAttributes.ROWSPAN, cell.getRowSpan());
}
final TextAlign align;
final UIComponent cellComponent = cell.getComponent();
if (multiHeader && cell.getColumnSpan() > 1) {
align = TextAlign.center;
} else if (column instanceof AbstractUIColumn) {
align = ((AbstractUIColumn) column).getAlign();
} else {
align = null;
}
writer.writeClassAttribute(
BootstrapClass.textAlign(align),
column.getCustomClass());
writer.startElement(HtmlElements.SPAN);
boolean sortable = false;
boolean ascending = false;
boolean descending = false;
CssItem sortPosition = null;
String tip = ComponentUtils.getStringAttribute(column, Attributes.tip);
// sorter icons should only displayed when there is only 1 column and not input
CommandMap behaviorCommands = null;
if (cell.getColumnSpan() == 1 && cellComponent instanceof AbstractUIOut) {
sortable = ComponentUtils.getBooleanAttribute(column, Attributes.sortable);
if (sortable) {
AbstractUILink sortCommand = (AbstractUILink) ComponentUtils.getFacet(column, Facets.sorter);
if (sortCommand == null) {
// assign id to column
column.getClientId(facesContext);
final String sorterId = column.getId() + "_" + AbstractUISheet.SORTER_ID;
sortCommand = (AbstractUILink) ComponentUtils.createComponent(
facesContext, Tags.link.componentType(), RendererTypes.Link, sorterId);
sortCommand.setTransient(true);
final AjaxBehavior reloadBehavior = sheet.createReloadBehavior(sheet);
sortCommand.addClientBehavior("click", reloadBehavior);
ComponentUtils.setFacet(column, Facets.sorter, sortCommand);
}
writer.writeIdAttribute(sortCommand.getClientId(facesContext));
behaviorCommands = getBehaviorCommands(facesContext, sortCommand);
ComponentUtils.removeFacet(column, Facets.sorter);
if (tip == null) {
tip = "";
} else {
tip += " - ";
}
tip += ResourceUtils.getString(facesContext, "sheet.sorting");
final SheetState sheetState = sheet.getSheetState(facesContext);
final SortedColumnList sortedColumnList = sheetState.getSortedColumnList();
final int index = sortedColumnList.indexOf(column.getId());
if (index >= 0) {
if (sortedColumnList.isShowNumbers()) { // ignore number circles otherwise
switch (index) {
case 0:
sortPosition = TobagoClass.CIRCLE__1;
break;
case 1:
sortPosition = TobagoClass.CIRCLE__2;
break;
case 2:
sortPosition = TobagoClass.CIRCLE__3;
break;
case 3:
sortPosition = TobagoClass.CIRCLE__4;
break;
case 4:
sortPosition = TobagoClass.CIRCLE__5;
break;
case 5:
sortPosition = TobagoClass.CIRCLE__6;
break;
case 6:
sortPosition = TobagoClass.CIRCLE__7;
break;
case 7:
sortPosition = TobagoClass.CIRCLE__8;
break;
case 8:
sortPosition = TobagoClass.CIRCLE__9;
break;
default:
// should not happen
LOG.warn("Index {} not supported!", index);
}
}
final SortedColumn sortedColumn = sortedColumnList.get(index);
if (Objects.equals(column.getId(), sortedColumn.getId())) {
final String sortTitle;
if (sortedColumn.isAscending()) {
sortTitle = ResourceUtils.getString(facesContext, "sheet.ascending");
ascending = true;
} else {
sortTitle = ResourceUtils.getString(facesContext, "sheet.descending");
descending = true;
}
tip += " - " + sortTitle;
}
}
}
}
writer.writeClassAttribute(
sortable ? TobagoClass.SORTABLE : null,
ascending ? TobagoClass.ASCENDING : null,
descending ? TobagoClass.DESCENDING : null,
sortPosition);
writer.writeAttribute(HtmlAttributes.TITLE, tip, true);
encodeBehavior(writer, behaviorCommands);
if (column instanceof AbstractUIColumnSelector selector) {
Selectable currentSelectable = getSelectionMode(selectable, selector);
writer.startElement(HtmlElements.INPUT);
if (currentSelectable.isMulti()) {
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.CHECKBOX);
writer.writeAttribute(HtmlAttributes.TITLE,
ResourceUtils.getString(facesContext, "sheet.selectAll"), true);
writer.writeAttribute(Arias.LABEL,
ResourceUtils.getString(facesContext, "sheet.selectAll"), true);
writer.writeAttribute(HtmlAttributes.DISABLED, selector.isDisabled());
} else {
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
}
writer.writeNameAttribute(sheetClientId + SUFFIX_COLUMN_SELECTOR);
writer.writeClassAttribute(TobagoClass.SELECTED);
writer.writeAttribute(DataAttributes.SELECTION_MODE, currentSelectable.name(), false);
writer.endElement(HtmlElements.INPUT);
} else {
if (ComponentUtils.getFacet(column, Facets.label) == null) {
cellComponent.encodeAll(facesContext);
}
}
final UIComponent label = ComponentUtils.getFacet(column, Facets.label);
if (label != null) {
insideBegin(facesContext, Facets.label);
label.encodeAll(facesContext);
insideEnd(facesContext, Facets.label);
}
writer.endElement(HtmlElements.SPAN);
if (!autoLayout) {
if (column.isResizable()) {
encodeResizing(writer, sheet, j - offset + cell.getColumnSpan() - 1);
}
}
final UIComponent bar = ComponentUtils.getFacet(column, Facets.bar);
if (bar != null) {
insideBegin(facesContext, Facets.bar);
bar.encodeAll(facesContext);
insideEnd(facesContext, Facets.bar);
}
writer.endElement(HtmlElements.TH);
}
}
}
if (!autoLayout) {
encodeHeaderFiller(writer, TobagoClass.ROW__FILLER);
}
encodeHeaderFiller(writer, TobagoClass.BEHAVIOR__CONTAINER);
writer.endElement(HtmlElements.TR);
}
}