com.sun.webui.jsf.renderkit.html.RowColumnRenderer Maven / Gradle / Ivy
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the license at
* https://woodstock.dev.java.net/public/CDDLv1.0.html.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at https://woodstock.dev.java.net/public/CDDLv1.0.html.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* you own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.webui.jsf.renderkit.html;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import com.sun.webui.html.HTMLElements;
import com.sun.webui.html.HTMLAttributes;
import com.sun.webui.theme.Theme;
import com.sun.webui.jsf.util.RenderingUtilities;
/**
* RowColumnRenderer renders a HTML table.
* The contents are rendered by a subclass during the
* renderCellContent method, implemented in a subclass.
* An example of the HTML produced when the subclass renderer
* is a {@link RadionButtonGroup}.
*
* <table class=" RbGrp" style="">
* <tbody>
* <tr class="RbGrpRwOd">
* <td class="RbGrpCpt">
* <label class="RbGrpLbl" for="form1:_id1_0_input"
* title="rbgrp-tooltip"
* id="form1:_id1_caption">Radio Button Group</label>
* </td>
* <td class="RbGrpClEv">
* <input tabindex="1" class="Rb"
* value="Server" name="form1:_id1"
* id="form1:_id1_0_input" type="radio">
* <img class="RbImg" src="tree_server.gif" id="form1:_id1_0_image">
* <label class="RbLbl LblLev3Txt" for="form1:_id1_0_input"
* id="form1:_id1_0_label">Server</label>
* </td>
* <td class="RbGrpClOd">
* <input tabindex="1" class="Rb"
* value="Volume" name="form1:_id1"
* id="form1:_id1_1_input" type="radio">
* <img class="RbImg" src="volumegroup_tree.gif"
* id="form1:_id1_1_image">
* <label
* class="RbLbl LblLev3Txt" for="form1:_id1_1_input"
* id="form1:_id1_1_label">Volume</label>
* </td>
* </tr>
* <tr class="RbGrpRwEv">
* <td>
* </td>
* <td class="RbGrpClEv">
* <input tabindex="1" class="Rb"
* checked="checked" value="Pool" name="form1:_id1"
* id="form1:_id1_2_input" type="radio">
* <img class="RbImg" src="pool_tree.gif" id="form1:_id1_2_image">
* <label class="RbLbl LblLev3Txt" for="form1:_id1_2_input"
* id="form1:_id1_2_label">Pool</label>
* </td>
* <td class="RbGrpClEv">
* </td>
* </tr>
* </tbody>
* </table>
*
* The style class selectors are not output by RowColumnRenderer
* but by a subclass.
*/
abstract class RowColumnRenderer extends AbstractRenderer {
/**
* Constant indicating a TABLE element style selector is desired.
*/
protected final static int TABLE_STYLE = 0;
/**
* Constant indicating a TD element stlye is desired.
* This selector is used for the TD element that contains
* the group label.
*/
protected final static int CAPTION_STYLE = 1;
/**
* Constant indicating a TR element style selector is desired.
* The selector is applied to an odd row.
*/
protected final static int ROWEVEN_STYLE = 2;
/**
* Constant indicating a TR element style selector is desired.
* The selector is applied to an even row.
*/
protected final static int ROWODD_STYLE = 3;
/**
* Constant indicating a TD element style selector is desired.
* The selector is applied to an even column.
*/
protected final static int CELLEVEN_STYLE = 4;
/**
* Constant indicating a TD element style selector is desired.
* The selector is applied to an odd column.
*/
protected final static int CELLODD_STYLE = 5;
/**
* Create a RowColumnRenderer instance.
*/
public RowColumnRenderer() {
super();
}
/**
* Called from a subclass when rendering is to begin
*
* @param context FacesContext
for the current request
* @param component RadioButtonGroup
component rendered
* @param writer ResponseWriter
to which the HTML is rendered
* @param rows the number of rows to render
* @param columns the number of columns to render
*/
protected void renderRowColumnLayout(FacesContext context,
UIComponent component, Theme theme, ResponseWriter writer,
int rows, int columns) throws IOException {
writer.startElement(HTMLElements.TABLE, component);
writer.writeAttribute(HTMLAttributes.ID,
component.getClientId(context), HTMLAttributes.ID);
// Set the CSS table style
//
writeStyleAttribute(component, writer, null);
// Set the class attribute.
// Include the hidden attribute
//
String styles = RenderingUtilities.getStyleClasses(context, component,
getRowColumnStyle(theme, TABLE_STYLE));
if (styles != null) {
writer.writeAttribute(HTMLAttributes.CLASS, styles, null);
}
// Assume contained elements inherit from these
// span attributes
//
addStringAttributes(context, component, writer,
I18N_ATTRIBUTES);
// mbohm 6300361,6300362
// commenting out this call to addStringAttributes
// see RadioButtonGroupRenderer.getSelectorComponent and
// CheckboxGroupRenderer.getSelectorComponent
// addStringAttributes(context, component, writer,
// EVENTS_ATTRIBUTES);
renderRows(context, component, theme, writer, rows, columns);
writer.endElement(HTMLElements.TABLE);
}
/**
* Render the rows of the table
*/
private void renderRows(FacesContext context,
UIComponent component,
Theme theme,
ResponseWriter writer,
int rows,
int columns) throws IOException {
// Create a cell for the caption
//
int row = 0;
writer.startElement(HTMLElements.TR, component);
writer.writeAttribute(HTMLAttributes.CLASS,
getRowColumnStyle(theme, ROWODD_STYLE), null);
writer.startElement(HTMLElements.TD, component);
String style = getRowColumnStyle(theme, CAPTION_STYLE);
if (style != null) {
writer.writeAttribute(HTMLAttributes.CLASS, style, null);
}
renderCaption(context, component, theme, writer);
writer.endElement(HTMLElements.TD);
int itemN = 0;
for (row = 1; row <= rows; ++row) {
for (int column = 0; column < columns; ++column) {
writer.startElement(HTMLElements.TD, component);
// Use "1" based cells so that the first cell is odd
// vs. "0th" cell which would be even
//
// Don't inlcude the hidden attribute
String styles = getRowColumnStyle(theme,
(column & 0x00000001) == 0 ? CELLEVEN_STYLE : CELLODD_STYLE);
if (styles != null) {
writer.writeAttribute(HTMLAttributes.CLASS, styles, null);
}
renderCellContent(context, component, theme, writer, itemN);
++itemN;
writer.endElement(HTMLElements.TD);
}
writer.endElement(HTMLElements.TR);
// Don't start any more rows if the loop is ending
//
if (row + 1 <= rows) {
writer.startElement(HTMLElements.TR, component);
// Use "1" based rows so that the first row is odd
// vs. "0th" row which would be even
//
String styles = getRowColumnStyle(theme,
(row & 0x00000001) == 0 ? ROWODD_STYLE : ROWEVEN_STYLE);
if (styles != null) {
writer.writeAttribute(HTMLAttributes.CLASS, styles,
HTMLAttributes.CLASS);
}
writer.startElement(HTMLElements.TD, component);
writer.endElement(HTMLElements.TD);
}
}
// FIXME
// Need to know if rows can ever be zero.
// If rows is 0 then this is the only time this
// row needs to be terminated.
//
if (rows == 0) {
// End the row started outside the loop
//
writer.endElement(HTMLElements.TR);
}
}
/**
* Implemented by a subclass.
* Called when subclass should render the contents of the cell for the
* itemN
'th renderer cell.
*
* @param context FacesContext
for the current request
* @param component component being rendered
* @param writer ResponseWriter
to which the HTML is rendered
* @param itemN the nth cell to be rendered.
*/
protected abstract void renderCellContent(FacesContext context,
UIComponent component, Theme theme, ResponseWriter writer, int itemN)
throws IOException;
/**
* Implemented by a subclass.
* Called when the subclass should render the CAPTION element for
* the table.
*
* @param context FacesContext
for the current request
* @param component component being rendered
* @param writer ResponseWriter
to which the HTML is rendered
*/
protected abstract void renderCaption(FacesContext context,
UIComponent component,
Theme theme,
ResponseWriter writer)
throws IOException;
/**
* Get the style class for a structural element of the table.
* styleCode
is one of.
*
*
* TABLE_STYLE
* CAPTION_STYLE
* ROWEVEN_STYLE
* ROWODD_STYLE
* CELLEVEN_STYLE
* CELLODD_STYLE
*
*
*
* @param context FacesContext
for the current request
* @param styleCode one the predefined constants.
*/
protected abstract String getRowColumnStyle(Theme theme,
int styleCode);
private void writeStyleAttribute(UIComponent component,
ResponseWriter writer, String style) throws IOException {
StringBuffer styleBuf = new StringBuffer();
String compStyle = (String) component.getAttributes().get("style"); //NOI18N
if (compStyle != null) {
styleBuf.append(compStyle);
}
if (style != null) {
if (styleBuf.length() != 0) {
styleBuf.append(" "); //NOI18N
}
styleBuf.append(style);
}
if (styleBuf.length() != 0) {
writer.writeAttribute(HTMLAttributes.STYLE, styleBuf.toString(),
HTMLAttributes.STYLE);
}
}
}