String image1x1 = contextPath + resourceManager.getImage(viewRoot, "image/1x1.gif");
String selectorDisabled = contextPath + resourceManager.getImage(viewRoot, "image/sheetUncheckedDisabled.gif");
String unchecked = contextPath + resourceManager.getImage(viewRoot, "image/sheetUnchecked.gif");
Map attributes = data.getAttributes();
HtmlStyleMap sheetStyle = (HtmlStyleMap) attributes.get(ATTR_STYLE);
//HtmlStyleMap headerStyle = (HtmlStyleMap) attributes.get(ATTR_STYLE_HEADER);
// String sheetWidthString = LayoutUtil.getStyleAttributeValue(sheetStyle,
// "width");
Integer sheetHeight = HtmlRendererUtil.getStyleAttributeIntValue(sheetStyle, "height");
if (sheetHeight == null) {
// FIXME: nullpointer if height not defined
LOG.error("no height in parent container, setting to 100");
sheetHeight = 100;
}
//HtmlStyleMap bodyStyle = (HtmlStyleMap) attributes.get(ATTR_STYLE_BODY);
int footerHeight = (Integer) attributes.get(ATTR_FOOTER_HEIGHT);
String selectable = data.getSelectable();
Application application = facesContext.getApplication();
SheetState state = data.getSheetState(facesContext);
List<Integer> columnWidths = data.getWidthList();
String selectedRows = StringUtil.toString(getSelectedRows(data, state));
List<UIColumn> renderedColumnList = data.getRenderedColumns();
writer.startElement(HtmlConstants.INPUT, null);
writer.writeIdAttribute(sheetId + WIDTHS_POSTFIX);
writer.writeNameAttribute(sheetId + WIDTHS_POSTFIX);
writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
writer.writeAttribute(HtmlAttributes.VALUE, "", false);
writer.endElement(HtmlConstants.INPUT);
writer.startElement(HtmlConstants.INPUT, null);
writer.writeIdAttribute(sheetId + SCROLL_POSTFIX);
writer.writeNameAttribute(sheetId + SCROLL_POSTFIX);
writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
Integer[] scrollPosition = data.getScrollPosition();
if (scrollPosition != null) {
String scroll = scrollPosition[0] + ";" + scrollPosition[1];
writer.writeAttribute(HtmlAttributes.VALUE, scroll, false);
} else {
writer.writeAttribute(HtmlAttributes.VALUE, "", false);
}
writer.endElement(HtmlConstants.INPUT);
if (!NONE.equals(selectable)) {
writer.startElement(HtmlConstants.INPUT, null);
writer.writeIdAttribute(sheetId + SELECTED_POSTFIX);
writer.writeNameAttribute(sheetId + SELECTED_POSTFIX);
writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
writer.writeAttribute(HtmlAttributes.VALUE, selectedRows, true);
writer.endElement(HtmlConstants.INPUT);
}
final boolean showHeader = data.isShowHeader();
if (showHeader) {
// begin rendering header
writer.startElement(HtmlConstants.DIV, null);
writer.writeIdAttribute(sheetId + "_header_div");
writer.writeClassAttribute("tobago-sheet-header-div");
HtmlStyleMap headerStyle = (HtmlStyleMap) attributes.get(ATTR_STYLE_HEADER);
if (headerStyle != null) {
writer.writeStyleAttribute(headerStyle);
}
int columnCount = 0;
final int sortMarkerWidth = getAscendingMarkerWidth(facesContext, data);
String imageAscending = contextPath + resourceManager.getImage(viewRoot, "image/ascending.gif");
String imageDescending = contextPath + resourceManager.getImage(viewRoot, "image/descending.gif");
String img = resourceManager.getImage(viewRoot, "image/unsorted.gif", true);
String imageUnsorted = image1x1;
if (img != null) {
imageUnsorted = contextPath + img;
}
for (UIColumn column : renderedColumnList) {
renderColumnHeader(facesContext, writer, data, columnCount, column,
imageAscending, imageDescending, imageUnsorted, image1x1, sortMarkerWidth);
columnCount++;
}
writer.startElement(HtmlConstants.DIV, null);
writer.writeIdAttribute(sheetId + "_header_box_filler");
writer.writeClassAttribute("tobago-sheet-header-box");
writer.writeAttribute(HtmlAttributes.STYLE, "width: 0px", false);
writer.startElement(HtmlConstants.DIV, null);
writer.writeClassAttribute("tobago-sheet-header");
writer.flush();
writer.write(" ");
writer.endElement(HtmlConstants.DIV);
writer.endElement(HtmlConstants.DIV);
writer.endElement(HtmlConstants.DIV);
// end rendering header
}
// BEGIN RENDER BODY CONTENT
HtmlStyleMap bodyStyle = (HtmlStyleMap) attributes.get(ATTR_STYLE_BODY);
HtmlRendererUtil.replaceStyleAttribute(data, ATTR_STYLE_BODY, "height", (sheetHeight - footerHeight));
writer.startElement(HtmlConstants.DIV, null);
writer.writeIdAttribute(sheetId + "_data_div");
writer.writeClassAttribute("tobago-sheet-body-div ");
writer.writeAttribute(HtmlAttributes.STYLE, bodyStyle.toString() + (showHeader?"":" padding-top: 0px;"), false);
Integer space = HtmlRendererUtil.getStyleAttributeIntValue(bodyStyle, "width");
HtmlStyleMap sheetBodyStyle = (HtmlStyleMap) bodyStyle.clone();
//String sheetBodyStyle;
if (space != null) {
// intSpace -= columnWidths.get(columnWidths.size() - 1);
space -= getContentBorder(facesContext, data);
if (needVerticalScrollbar(facesContext, data)) {
space -= getScrollbarWidth(facesContext, data);
}
sheetBodyStyle.put("width", space);
}
sheetBodyStyle.remove("height");
writer.startElement(HtmlConstants.TABLE, null);
writer.writeAttribute(HtmlAttributes.CELLSPACING, 0);
writer.writeAttribute(HtmlAttributes.CELLPADDING, 0);
writer.writeAttribute(HtmlAttributes.SUMMARY, "", false);
writer.writeClassAttribute("tobago-sheet-body-table");
writer.writeStyleAttribute(sheetBodyStyle);
if (columnWidths != null) {
writer.startElement(HtmlConstants.COLGROUP, null);
for (Integer columnWidth : columnWidths) {
writer.startElement(HtmlConstants.COL, null);
writer.writeAttribute(HtmlAttributes.WIDTH, columnWidth);
writer.endElement(HtmlConstants.COL);
}
writer.endElement(HtmlConstants.COLGROUP);
}
// Print the Content
if (LOG.isDebugEnabled()) {
LOG.debug("first = " + data.getFirst() + " rows = " + data.getRows());
}
final String var = data.getVar();
boolean odd = false;
int visibleIndex = -1;
final int last = data.getFirst() + data.getRows();
for (int rowIndex = data.getFirst(); rowIndex < last; rowIndex++) {
visibleIndex++;
data.setRowIndex(rowIndex);
if (!data.isRowAvailable()) {
break;
}
odd = !odd;
final String rowClass = odd ? "tobago-sheet-content-odd " : "tobago-sheet-content-even ";
if (LOG.isDebugEnabled()) {
LOG.debug("var " + var);
LOG.debug("list " + data.getValue());
}
writer.startElement(HtmlConstants.TR, null);
writer.writeClassAttribute(rowClass);
writer.writeIdAttribute(sheetId + "_data_tr_" + rowIndex);
writer.flush();
int columnIndex = -1;
for (UIColumn column : renderedColumnList) {
columnIndex++;
StyleClasses tdClass = new StyleClasses();
tdClass.addClass("sheet", "cell-td"); // XXX not a standard compliant name
tdClass.addMarkupClass(column, "column");
if (columnIndex == 0) {
tdClass.addClass("sheet", "cell-first-column"); // XXX not a standard compliant name
}
if (hasClickAction) {
tdClass.addClass("sheet", "cell-clickable");
}
StyleClasses cellClass = StyleClasses.ensureStyleClasses(column);
tdClass.addClasses(cellClass);
writer.startElement(HtmlConstants.TD, column);
writer.writeClassAttribute(tdClass.toString());
final String align = (String) column.getAttributes().get(ATTR_ALIGN);
if (align != null) {
writer.writeStyleAttribute(HtmlRendererUtil.toStyleString("text-align", align));
}
writer.startElement(HtmlConstants.DIV, null);
writer.writeIdAttribute(
sheetId + "_data_row_" + visibleIndex + "_column" + columnIndex);
writer.writeClassAttribute("tobago-sheet-cell-outer");
writer.writeStyleAttribute(HtmlRendererUtil.toStyleString("width", columnWidths.get(columnIndex)));
writer.startElement(HtmlConstants.DIV, null);
writer.writeClassAttribute("tobago-sheet-cell-inner");
writer.flush();
if (column instanceof UIColumnSelector) {
final boolean disabled
= ComponentUtil.getBooleanAttribute(column, ATTR_DISABLED);
writer.startElement(HtmlConstants.IMG, null);
if (disabled) {
writer.writeAttribute(HtmlAttributes.SRC, selectorDisabled, false);
} else {
writer.writeAttribute(HtmlAttributes.SRC, unchecked, false);
}
writer.writeIdAttribute(sheetId + "_data_row_selector_" + rowIndex);
writer.writeClassAttribute("tobago-sheet-column-selector");
writer.endElement(HtmlConstants.IMG);
} else {
for (UIComponent grandkid : data.getRenderedChildrenOf(column)) {
// set height to 0 to prevent use of layoutheight from parent
grandkid.getAttributes().put(ATTR_LAYOUT_HEIGHT, HEIGHT_0);
RenderUtil.encode(facesContext, grandkid);
}
}
writer.endElement(HtmlConstants.DIV);
writer.endElement(HtmlConstants.DIV);
writer.endElement(HtmlConstants.TD);
}
writer.startElement(HtmlConstants.TD, null);
writer.writeClassAttribute("tobago-sheet-cell-td");
writer.startElement(HtmlConstants.DIV, null);
writer.writeIdAttribute(
sheetId + "_data_row_" + visibleIndex + "_column_filler");
writer.writeClassAttribute("tobago-sheet-cell-outer");
writer.writeStyleAttribute("width: 0px;");
writer.flush();
writer.write(" ");
writer.endElement(HtmlConstants.DIV);
writer.endElement(HtmlConstants.TD);
writer.endElement(HtmlConstants.TR);
}
data.setRowIndex(-1);
writer.endElement(HtmlConstants.TABLE);
writer.endElement(HtmlConstants.DIV);
// END RENDER BODY CONTENT
final String showRowRange
= getPagingAttribute(data, ATTR_SHOW_ROW_RANGE);
final String showPageRange
= getPagingAttribute(data, ATTR_SHOW_PAGE_RANGE);
final String showDirectLinks
= getPagingAttribute(data, ATTR_SHOW_DIRECT_LINKS);
if (isValidPagingValue(showRowRange)
|| isValidPagingValue(showPageRange)
|| isValidPagingValue(showDirectLinks)) {
final HtmlStyleMap footerStyle = (HtmlStyleMap) bodyStyle.clone();
footerStyle.put("height", footerHeight);
footerStyle.put("top", (sheetHeight - footerHeight));
// "height", MessageFormat.format("{0}px", footerHeight));
// + " top: " + (sheetHeight - footerHeight) + "px;";
writer.startElement(HtmlConstants.DIV, data);