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,