You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2009/09/19 01:33:35 UTC
svn commit: r816813 - in
/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit:
JSFAttr.java html/HtmlGridRendererBase.java html/HtmlTableRendererBase.java
Author: lu4242
Date: Fri Sep 18 23:33:34 2009
New Revision: 816813
URL: http://svn.apache.org/viewvc?rev=816813&view=rev
Log:
MYFACES-2282 h:dataTable and h:panelGrid should implement bodyrows behavior (tbody encapsulation) (Thanks to Jakob Korherr for provide this patch)
Modified:
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlGridRendererBase.java
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java?rev=816813&r1=816812&r2=816813&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java Fri Sep 18 23:33:34 2009
@@ -88,6 +88,7 @@
String HEADER_CLASS_ATTR = "headerClass";
String COLUMN_CLASSES_ATTR = "columnClasses";
String ROW_CLASSES_ATTR = "rowClasses";
+ String BODYROWS_ATTR = "bodyrows";
// Panel_Grid Attributes
String COLUMNS_ATTR = "columns";
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlGridRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlGridRendererBase.java?rev=816813&r1=816812&r2=816813&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlGridRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlGridRendererBase.java Fri Sep 18 23:33:34 2009
@@ -18,13 +18,10 @@
*/
package org.apache.myfaces.shared.renderkit.html;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.myfaces.shared.renderkit.JSFAttr;
-import org.apache.myfaces.shared.renderkit.RendererUtils;
-import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
-import org.apache.myfaces.shared.util.ArrayUtils;
-import org.apache.myfaces.shared.util.StringUtils;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.component.UIPanel;
@@ -33,10 +30,15 @@
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.shared.renderkit.JSFAttr;
+import org.apache.myfaces.shared.renderkit.RendererUtils;
+import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
+import org.apache.myfaces.shared.util.ArrayUtils;
+import org.apache.myfaces.shared.util.StringUtils;
+
/**
* @author Martin Marinschek
@@ -48,6 +50,8 @@
extends HtmlRenderer
{
private static final Log log = LogFactory.getLog(HtmlGridRendererBase.class);
+
+ private static final Integer[] ZERO_INT_ARRAY = new Integer[]{0};
public boolean getRendersChildren()
{
@@ -182,8 +186,6 @@
int columns)
throws IOException
{
- writer.startElement(HTML.TBODY_ELEM, component);
-
String columnClasses;
String rowClasses;
if (component instanceof HtmlPanelGrid)
@@ -210,6 +212,27 @@
int childCount = getChildCount(component);
if (childCount > 0)
{
+ // get the row indizes for which a new TBODY element should be created
+ Integer[] bodyrows = null;
+ String bodyrowsAttr = (String) component.getAttributes().get(JSFAttr.BODYROWS_ATTR);
+ if(bodyrowsAttr != null && !"".equals(bodyrowsAttr))
+ {
+ String[] bodyrowsString = StringUtils.trim(StringUtils.splitShortString(bodyrowsAttr, ','));
+ // parsing with no exception handling, because of JSF-spec:
+ // "If present, this must be a comma separated list of integers."
+ bodyrows = new Integer[bodyrowsString.length];
+ for(int i = 0; i < bodyrowsString.length; i++)
+ {
+ bodyrows[i] = new Integer(bodyrowsString[i]);
+ }
+
+ }
+ else
+ {
+ bodyrows = ZERO_INT_ARRAY;
+ }
+ int bodyrowsCount = 0;
+ int rowIndex = -1;
int columnIndex = 0;
int rowClassIndex = 0;
boolean rowStarted = false;
@@ -220,13 +243,30 @@
{
if (columnIndex == 0)
{
- //start of new/next row
+ rowIndex++;
+
if (rowStarted)
{
//do we have to close the last row?
writer.endElement(HTML.TR_ELEM);
HtmlRendererUtils.writePrettyLineSeparator(context);
}
+
+ // is the current row listed in the bodyrows attribute
+ if(ArrayUtils.contains(bodyrows, rowIndex))
+ {
+ // close any preopened TBODY element first
+ if(bodyrowsCount != 0)
+ {
+ writer.endElement(HTML.TBODY_ELEM);
+ HtmlRendererUtils.writePrettyLineSeparator(context);
+ }
+ writer.startElement(HTML.TBODY_ELEM, component);
+ HtmlRendererUtils.writePrettyLineSeparator(context);
+ bodyrowsCount++;
+ }
+
+ //start of new/next row
writer.startElement(HTML.TR_ELEM, component);
if (rowClassIndex < rowClassesCount) {
writer.writeAttribute(HTML.CLASS_ATTR, rowClassesArray[rowClassIndex], null);
@@ -272,10 +312,15 @@
}
writer.endElement(HTML.TR_ELEM);
HtmlRendererUtils.writePrettyLineSeparator(context);
+
+ // close any preopened TBODY element first
+ if(bodyrowsCount != 0)
+ {
+ writer.endElement(HTML.TBODY_ELEM);
+ HtmlRendererUtils.writePrettyLineSeparator(context);
+ }
}
}
-
- writer.endElement(HTML.TBODY_ELEM);
}
}
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java?rev=816813&r1=816812&r2=816813&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java Fri Sep 18 23:33:34 2009
@@ -18,15 +18,11 @@
*/
package org.apache.myfaces.shared.renderkit.html;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.myfaces.shared.renderkit.JSFAttr;
-import org.apache.myfaces.shared.renderkit.RendererUtils;
-import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
-import org.apache.myfaces.shared.util.ArrayUtils;
-import org.apache.myfaces.shared.util.StringUtils;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
-import javax.el.ValueExpression;
import javax.faces.component.UIColumn;
import javax.faces.component.UIComponent;
import javax.faces.component.UIData;
@@ -36,10 +32,14 @@
import javax.faces.component.html.HtmlDataTable;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.shared.renderkit.JSFAttr;
+import org.apache.myfaces.shared.renderkit.RendererUtils;
+import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
+import org.apache.myfaces.shared.util.ArrayUtils;
+import org.apache.myfaces.shared.util.StringUtils;
/**
* Common methods for renderers for components that subclass the standard
@@ -60,6 +60,8 @@
/** The logger. */
private static final Log log = LogFactory.getLog(HtmlTableRendererBase.class);
+
+ private static final Integer[] ZERO_INT_ARRAY = new Integer[]{0};
/**
* @param component dataTable
@@ -147,18 +149,10 @@
{
RendererUtils.checkParamValidity(facesContext, component, UIData.class);
- ResponseWriter writer = facesContext.getResponseWriter();
-
beforeBody(facesContext, (UIData) component);
- HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.TBODY_ELEM, component);
- writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext)+":tbody_element", null);
-
encodeInnerHtml(facesContext, component);
- writer.endElement(HTML.TBODY_ELEM);
-
afterBody(facesContext, (UIData) component);
}
@@ -250,10 +244,13 @@
if (rowCount == 0) {
//nothing to render, to get valid xhtml we render an empty dummy row
+ writer.startElement(HTML.TBODY_ELEM, uiData);
+ writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext) + ":tbody_element", null);
writer.startElement(HTML.TR_ELEM, uiData);
writer.startElement(HTML.TD_ELEM, uiData);
writer.endElement(HTML.TD_ELEM);
writer.endElement(HTML.TR_ELEM);
+ writer.endElement(HTML.TBODY_ELEM);
return;
}
@@ -284,6 +281,27 @@
newspaperRows = (last - first) / newspaperColumns;
else newspaperRows = ((last - first) / newspaperColumns) + 1;
boolean newspaperHorizontalOrientation = isNewspaperHorizontalOrientation(component);
+
+ // get the row indizes for which a new TBODY element should be created
+ Integer[] bodyrows = null;
+ String bodyrowsAttr = (String) component.getAttributes().get(JSFAttr.BODYROWS_ATTR);
+ if(bodyrowsAttr != null && !"".equals(bodyrowsAttr))
+ {
+ String[] bodyrowsString = StringUtils.trim(StringUtils.splitShortString(bodyrowsAttr, ','));
+ // parsing with no exception handling, because of JSF-spec:
+ // "If present, this must be a comma separated list of integers."
+ bodyrows = new Integer[bodyrowsString.length];
+ for(int i = 0; i < bodyrowsString.length; i++)
+ {
+ bodyrows[i] = new Integer(bodyrowsString[i]);
+ }
+
+ }
+ else
+ {
+ bodyrows = ZERO_INT_ARRAY;
+ }
+ int bodyrowsCount = 0;
// walk through the newspaper rows
for(int nr = 0; nr < newspaperRows; nr++)
@@ -314,6 +332,23 @@
// first column in table, start new row
beforeRow(facesContext, uiData);
+ // is the current row listed in the bodyrows attribute
+ if(ArrayUtils.contains(bodyrows, currentRow))
+ {
+ // close any preopened TBODY element first
+ if(bodyrowsCount != 0)
+ {
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ writer.endElement(HTML.TBODY_ELEM);
+ }
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ writer.startElement(HTML.TBODY_ELEM, uiData);
+ // Do not attach bodyrowsCount to the first TBODY element, because of backward compatibility
+ writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext) + ":tbody_element" +
+ (bodyrowsCount == 0 ? "" : bodyrowsCount), null);
+ bodyrowsCount++;
+ }
+
HtmlRendererUtils.writePrettyLineSeparator(facesContext);
renderRowStart(facesContext, writer, uiData, styles, nr);
}
@@ -346,6 +381,13 @@
afterRow(facesContext, uiData);
}
+
+ if(bodyrowsCount != 0)
+ {
+ // close the last TBODY element
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ writer.endElement(HTML.TBODY_ELEM);
+ }
}
protected void encodeColumnChild(FacesContext facesContext, ResponseWriter writer,