package org.opencustomer.framework.webapp.util.html.renderer; import org.opencustomer.framework.db.util.engine.Row; import org.opencustomer.framework.webapp.util.html.Column; import org.opencustomer.framework.webapp.util.html.Table; public class TableRenderer { private final static String BASE = "TableRenderer."; public final static String TABLE_CLASS = BASE+"table.class"; public final static String ROW_CLASS = BASE+"row.class"; public final static String ROW_ACTIVE_CLASS = BASE+"row.active.class"; public final static String ROW_NOENTRIES_CLASS = BASE+"row.noEntries.class"; public final static String ROW_NOENTRIES_MESSAGEKEY = BASE+"row.noEntries.messageKey"; private OrderRenderer sortRenderer = new OrderRenderer(); public final String createHtml(RendererContext context, String style, Table table, String onclick) { StringBuilder builder = new StringBuilder(); writeTableStart(context, builder, style); writeColGroups(context, builder, table.getColumns()); writeTableHeadStart(context, builder); writeHeadRowStart(context, builder, table.getColumns()); for(Column column : table.getColumns()) { writeHeadCellStart(context, builder, column); if(column.getMessageKey() != null) { writeHeadCellContent(context, builder, table.getColumns(), column); } writeHeadCellEnd(context, builder, column); } writeHeadRowEnd(context, builder, table.getColumns()); writeTableHeadEnd(context, builder); writeTableBodyStart(context, builder); for(Row row : table.getRows()) { writeRowStart(context, builder, row); for(int i=0; i<row.getColumns().length; i++) { Object cell = row.getColumns()[i]; writeCellStart(context, builder, row, table.getColumns()[i], cell, onclick); writeCellContent(context, builder, row, table.getColumns()[i], cell); writeCellEnd(context, builder, row, table.getColumns()[i], cell); } writeRowEnd(context, builder, row); } if(table.getRows().isEmpty()) { writeEmptyRow(context, builder, table.getColumns()); } writeTableBodyEnd(context, builder); writeTableEnd(context, builder); return builder.toString(); } protected void writeColGroups(RendererContext context, StringBuilder builder, Column[] columns) { builder.append("<colgroup>"); for(Column column : columns) { builder.append("<col width=\"1*\"/>"); } builder.append("</colgroup>\n"); } protected void writeTableStart(RendererContext context, StringBuilder builder, String style) { String styleClass = context.getSettings().getProperty(TABLE_CLASS); builder.append("\n<table"); if(styleClass != null) { builder.append(" class=\"").append(styleClass).append("\""); } if(style != null) { builder.append(" style=\"").append(style).append("\""); } builder.append(">\n"); } protected void writeTableEnd(RendererContext context, StringBuilder builder) { builder.append("</table>\n"); } protected void writeTableHeadStart(RendererContext context, StringBuilder builder) { builder.append("<thead>\n"); } protected void writeTableHeadEnd(RendererContext context, StringBuilder builder) { builder.append("</thead>\n"); } protected void writeTableBodyStart(RendererContext context, StringBuilder builder) { builder.append("<tbody>\n"); } protected void writeTableBodyEnd(RendererContext context, StringBuilder builder) { builder.append("</tbody>\n"); } protected void writeRowStart(RendererContext context, StringBuilder builder, Row row) { String styleClass = context.getSettings().getProperty(ROW_CLASS); String styleClassActive = context.getSettings().getProperty(ROW_ACTIVE_CLASS); builder.append("<tr"); if(styleClass != null) { builder.append(" class=\"").append(styleClass).append("\""); } if(styleClassActive != null) { builder.append(" onmouseover=\"this.className='").append(styleClassActive).append("';\""); if(styleClass != null) { builder.append(" onmouseout=\"this.className='").append(styleClass).append("';\""); } else { builder.append(" onmouseout=\"this.className=null;\""); } } builder.append(">"); } protected void writeRowEnd(RendererContext context, StringBuilder builder, Row row) { builder.append("</tr>\n"); } protected void writeCellStart(RendererContext context, StringBuilder builder, Row row, Column column, Object value, String onclick) { builder.append("<td"); if(onclick != null) { builder.append(" onclick=\"").append(onclick.replaceAll("\\{id\\}", Integer.toString(row.getId()))).append("\""); } builder.append(">"); } protected void writeCellContent(RendererContext context, StringBuilder builder, Row row, Column column, Object value) { builder.append(column.getFormatter().format(context.getResources(), context.getLocale(), value)); } protected void writeCellEnd(RendererContext context, StringBuilder builder, Row row, Column column, Object value) { builder.append("</td>"); } protected void writeHeadCellStart(RendererContext context, StringBuilder builder, Column column) { builder.append("<th>"); } protected void writeHeadCellContent(RendererContext context, StringBuilder builder, Column[] columns, Column column) { if(column.isSortable()) { builder.append(sortRenderer.createHtml(context, columns, column)); } else { builder.append(context.getResources().getMessage(context.getLocale(), column.getMessageKey())); } } protected void writeHeadCellEnd(RendererContext context, StringBuilder builder, Column column) { builder.append("</th>"); } protected void writeHeadRowStart(RendererContext context, StringBuilder builder, Column[] columns) { builder.append("<tr>"); } protected void writeHeadRowEnd(RendererContext context, StringBuilder builder, Column[] columns) { builder.append("</tr>\n"); } protected void writeEmptyRow(RendererContext context, StringBuilder builder, Column[] columns) { String styleClass = context.getSettings().getProperty(ROW_NOENTRIES_CLASS); String message = context.getSettings().getProperty(ROW_NOENTRIES_MESSAGEKEY); builder.append("<tr"); if(styleClass != null) { builder.append(" class=\"").append(styleClass).append("\""); } builder.append(">"); builder.append("<td"); builder.append(" colspan=\"").append(columns.length).append("\""); builder.append(">"); builder.append(context.getResources().getMessage(context.getLocale(), message)); builder.append("</td>"); builder.append("</tr>\n"); } }