Author: ekoneil
Date: Mon Feb 21 14:21:32 2005
New Revision: 154732

URL: http://svn.apache.org/viewcvs?view=rev&rev=154732
Log:
Add support for enabling / disabling HTML table row group rendering.  It's now 
possible to toggle the rendering of <tbody>, <thead>, and <tfoot> so that they 
are all present or all omitted.

This also now supports re-ordering <tfoot> and <tbody> when enabled to conform 
to the HTML 4.01 spec.

BEEHIVE-319      data grid needs to support thead / tbody / tfoot reordering

BB: self
DRT: NetUI pass
BVT: NetUI pass


Added:
    
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TBodyTag.java
   (with props)
    
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/rowGroups.jsp
   (with props)
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridRowGroups.xml
   (with props)
Modified:
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/api/rendering/DataGridTagModel.java
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/runtime/rendering/table/TableRenderer.java
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java
    
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/HtmlConstants.java
    
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TFootTag.java
    
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/THeadTag.java
    
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TagRenderingBase.java
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCSSPrefix.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionAttributes.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionJavaScript.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomHeaderStyle.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomTagAttributes.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridEmptyColumnsTag.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridEmptyStylePolicy.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridFooterTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridFormatTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridHeaderCellDecorator.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridHeaderTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridImageAnchorColumnTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridImageColumnTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridJavaScriptSmoke.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridModelTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridNestedJSTL.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerBasic.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerCustomSelect.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerDisable.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerEmpty.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerExplicitHref.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerImplicitHref.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerInCaption.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerInFooter.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerOverride.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerRendererSmoke.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerStickyParam.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridScriptletTagFile.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridSimpleSort.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridSmokeTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridTemplateColumnTest.xml
    
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/XhtmlDataGridSmokeTest.xml

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/api/rendering/DataGridTagModel.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/api/rendering/DataGridTagModel.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/api/rendering/DataGridTagModel.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/api/rendering/DataGridTagModel.java
 Mon Feb 21 14:21:32 2005
@@ -38,15 +38,14 @@
  */
 public class DataGridTagModel {
 
-    /*
-      todo: refactor.
-      need a DataGridURL type that hides URL keys / creation.
-     */
+    /* todo: refactor.  need a DataGridURL type that hides URL keys / 
creation. */
+    
     public static final int RENDER_STATE_START = 10;
     public static final int RENDER_STATE_CAPTION = 20;
-    public static final int RENDER_STATE_GRID = 30;
-    public static final int RENDER_STATE_FOOTER = 40;
-    public static final int RENDER_STATE_END = 50;
+    public static final int RENDER_STATE_HEADER = 30;
+    public static final int RENDER_STATE_GRID = 40;
+    public static final int RENDER_STATE_FOOTER = 50;
+    public static final int RENDER_STATE_END = 60;
     private static final int RENDER_STATE_UNINIT = -1;
 
     private JspContext _jspContext = null;
@@ -55,6 +54,8 @@
 
     private int _renderState = RENDER_STATE_UNINIT;
     private boolean _disableDefaultPagerRendering = false;
+    private boolean _renderRowGroups = false;
+
     private String _name = null;
     private StyleModel _styleModel = null;
     private PagerRenderer _pagerRenderer = null;
@@ -99,6 +100,9 @@
                 _renderState = RENDER_STATE_CAPTION;
                 break;
             case RENDER_STATE_CAPTION:
+                _renderState = RENDER_STATE_HEADER;
+                break;
+            case RENDER_STATE_HEADER:
                 _renderState = RENDER_STATE_GRID;
                 break;
             case RENDER_STATE_GRID:
@@ -152,6 +156,14 @@
 
     public void setDisableDefaultPagerRendering(boolean 
disableDefaultPagerRendering) {
         _disableDefaultPagerRendering = disableDefaultPagerRendering;
+    }
+
+    public boolean isRenderRowGroups() {
+        return _renderRowGroups;
+    }
+
+    public void setRenderRowGroups(boolean renderRowGroups) {
+        _renderRowGroups = renderRowGroups;
     }
 
     public TableRenderer getTableRenderer() {

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/runtime/rendering/table/TableRenderer.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/runtime/rendering/table/TableRenderer.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/runtime/rendering/table/TableRenderer.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/runtime/rendering/table/TableRenderer.java
 Mon Feb 21 14:21:32 2005
@@ -28,22 +28,29 @@
 import org.apache.beehive.netui.tags.rendering.THeadTag;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
 import org.apache.beehive.netui.tags.rendering.TFootTag;
+import org.apache.beehive.netui.tags.rendering.TBodyTag;
 
 /**
  * 
  */
 public final class TableRenderer {
 
+    private static final TableTag.State TABLE_STATE = new TableTag.State();
     private static final CaptionTag.State CAPTION_STATE = new 
CaptionTag.State();
     private static final THeadTag.State THEAD_STATE = new THeadTag.State();
+    private static final TBodyTag.State TBODY_STATE = new TBodyTag.State();
     private static final TFootTag.State TFOOT_STATE = new TFootTag.State();
-    private static final TableTag.State TABLE_STATE = new TableTag.State();
     private static final TrTag.State TR_STATE = new TrTag.State();
 
+    private final HttpServletRequest _request;
+
     private TagRenderingBase _tableRenderer = null;
     private TagRenderingBase _captionRenderer = null;
+
     private TagRenderingBase _theadRenderer = null;
+    private TagRenderingBase _tbodyRenderer = null;
     private TagRenderingBase _tfootRenderer = null;
+
     private TagRenderingBase _trRenderer = null;
     private TagRenderingBase _tdRenderer = null;
     private TagRenderingBase _thRenderer = null;
@@ -51,15 +58,20 @@
     public TableRenderer(HttpServletRequest request) {
         super();
 
-        _tableRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TABLE_TAG, request);
-        _captionRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.CAPTION_TAG, request);
-        _theadRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.THEAD_TAG, request);
-        _trRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TR_TAG, request);
-        _thRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TH_TAG, request);
-        _tdRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TD_TAG, request);
-        _tfootRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TFOOT_TAG, request);
+        _request = request;
+        _tableRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TABLE_TAG, _request);
+
+        _thRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TH_TAG, _request);
+        _trRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TR_TAG, _request);
+        _tdRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TD_TAG, _request);
     }
 
+    /* -------------------------------------------------------------
+
+        Table Rendering
+
+       ------------------------------------------------------------- */
+
     public void openTable(TableTag.State state, AbstractRenderAppender 
appender) {
         if(state == null)
             state = TABLE_STATE;
@@ -75,28 +87,99 @@
         appender.append("\n");
     }
 
-    /* todo: caption style support */
     public void openCaption(CaptionTag.State state, AbstractRenderAppender 
appender) {
         if(state == null)
             state = CAPTION_STATE;
 
         appender.append("\n");
+
+        if(_captionRenderer == null)
+            _captionRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.CAPTION_TAG, _request);
+
         _captionRenderer.doStartTag(appender, state);
     }
 
     public void closeCaption(AbstractRenderAppender appender) {
+        if(_captionRenderer == null)
+            throw new IllegalStateException("Encountered a null THeadTag 
renderer.  Was openCaption called?");
+
         _captionRenderer.doEndTag(appender);
         appender.append("\n");
     }
 
+    /* -------------------------------------------------------------
+
+        Table Row Group Rendering
+
+       ------------------------------------------------------------- */
+
     public final void openTableHead(THeadTag.State state, 
AbstractRenderAppender appender) {
         if(state == null)
             state = THEAD_STATE;
 
+        if(_theadRenderer == null)
+            _theadRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.THEAD_TAG, _request);
+
         appender.append("\n");
         _theadRenderer.doStartTag(appender, state);
     }
 
+    public void closeTableHead(AbstractRenderAppender appender) {
+        if(_theadRenderer == null)
+            throw new IllegalStateException("Encountered a null THeadTag 
renderer.  Was openTableHead called?");
+
+        appender.append("\n");
+        _theadRenderer.doEndTag(appender);
+        appender.append("\n");
+    }
+
+    public void openTableBody(TBodyTag.State state, AbstractRenderAppender 
appender) {
+        if(state == null)
+            state = TBODY_STATE;
+
+        if(_tbodyRenderer == null)
+            _tbodyRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TBODY_TAG, _request);
+
+        appender.append("\n");
+        _tbodyRenderer.doStartTag(appender, state);
+    }
+
+    public void closeTableBody(AbstractRenderAppender appender) {
+        if(_tbodyRenderer == null)
+            throw new IllegalStateException("Encountered a null TBodyTag 
renderer.  Was openTableBody called?");
+
+        appender.append("\n");
+        _tbodyRenderer.doEndTag(appender);
+    }
+
+    public void openTableFoot(TFootTag.State state, AbstractRenderAppender 
appender) {
+        if(state == null)
+            state = TFOOT_STATE;
+
+        if(_tfootRenderer == null)
+            _tfootRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TFOOT_TAG, _request);
+
+        appender.append("\n");
+        _tfootRenderer.doStartTag(appender, state);
+        appender.append("\n");
+    }
+
+    public void closeTableFoot(AbstractRenderAppender appender) {
+        if(_tfootRenderer == null)
+            throw new IllegalStateException("Encountered a null TFootTag 
renderer.  Was openTableFoot called?");
+
+        appender.append("\n");
+        _tfootRenderer.doEndTag(appender);
+        appender.append("\n");
+    }
+
+
+    /* -------------------------------------------------------------
+
+        Table Row Rendering
+
+       ------------------------------------------------------------- */
+
     public final void openHeaderRow(TrTag.State state, AbstractRenderAppender 
appender) {
         if(state == null)
             state = TR_STATE;
@@ -110,11 +193,6 @@
         _trRenderer.doEndTag(appender);
     }
 
-    public void closeTableHead(AbstractRenderAppender appender) {
-        _theadRenderer.doEndTag(appender);
-        appender.append("\n");
-    }
-
     public void openTableRow(TrTag.State state, AbstractRenderAppender 
appender) {
         appender.append("\n");
         _trRenderer.doStartTag(appender, state);
@@ -133,23 +211,16 @@
         _trRenderer.doStartTag(appender, state);
     }
 
-    public void openTableFoot(TFootTag.State state, AbstractRenderAppender 
appender) {
-        if(state == null)
-            state = TFOOT_STATE;
-
-        appender.append("\n");
-        _tfootRenderer.doStartTag(appender, state);
-    }
-
     public void closeFooterRow(AbstractRenderAppender appender) {
         appender.append("\n");
         _trRenderer.doEndTag(appender);
     }
 
-    public void closeTableFoot(AbstractRenderAppender appender) {
-        appender.append("\n");
-        _tfootRenderer.doEndTag(appender);
-    }
+    /* -------------------------------------------------------------
+
+        Table Cell Rendering
+
+       ------------------------------------------------------------- */
 
     public void openHeaderCell(ThTag.State state, AbstractRenderAppender 
appender) {
         _thRenderer.doStartTag(appender, state);

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
 Mon Feb 21 14:21:32 2005
@@ -39,7 +39,6 @@
 import org.apache.beehive.netui.script.common.DataAccessProviderStack;
 import org.apache.beehive.netui.tags.ExpressionHandling;
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
-import org.apache.beehive.netui.tags.IAttributeConsumer;
 import org.apache.beehive.netui.tags.IBehaviorConsumer;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
@@ -62,8 +61,9 @@
     private String _stylePolicyName = null;
     private String _dataSource = null;
     private String _resourceBundlePath = null;
+    private boolean _renderRowGroups = false;
     private DataGridConfig _dataGridConfig = null;
-    private DataGridTagModel _gridTagModel = null;
+    private DataGridTagModel _dataGridTagModel = null;
 
     public String getTagName() {
         return "DataGrid";
@@ -113,6 +113,13 @@
     }
 
     /**
+     * @netui:attribute required="false" rtexprvalue="true"
+     */
+    public void setRenderRowGroups(boolean renderRowGroups) {
+        _renderRowGroups = renderRowGroups;
+    }
+
+    /**
      * @param name
      * @param value
      * @param facet
@@ -120,8 +127,8 @@
      */
     public void setBehavior(String name, String value, String facet)
         throws JspException {
-        if(facet.equals(FACET_RESOURCE)) {
-            _gridTagModel.addResourceOverride(name, value);
+        if(facet != null && facet.equals(FACET_RESOURCE)) {
+            _dataGridTagModel.addResourceOverride(name, value);
         } else {
             String s = Bundle.getString("Tags_BehaviorFacetNotSupported", new 
Object[]{facet});
             throw new JspException(s);
@@ -154,76 +161,103 @@
         else resourceProvider = 
_dataGridConfig.getResourceProvider(_resourceBundlePath);
         resourceProvider.setLocale(JspUtil.getLocale(jspContext));
 
-        _gridTagModel = new DataGridTagModel(_name, _dataGridConfig, 
jspContext);
-        _gridTagModel.setDataSet(dataSet);
-        _gridTagModel.setStyleModel(styleModel);
-        _gridTagModel.setTableRenderer(tableRenderer);
-        _gridTagModel.setResourceProvider(resourceProvider);
+        _dataGridTagModel = new DataGridTagModel(_name, _dataGridConfig, 
jspContext);
+        _dataGridTagModel.setDataSet(dataSet);
+        _dataGridTagModel.setStyleModel(styleModel);
+        _dataGridTagModel.setTableRenderer(tableRenderer);
+        _dataGridTagModel.setResourceProvider(resourceProvider);
+        _dataGridTagModel.setRenderRowGroups(_renderRowGroups);
 
         JspFragment fragment = getJspBody();
         if(fragment != null) {
-            StringBuilder builder = new StringBuilder(2048);
-            AbstractRenderAppender appender = new 
StringBuilderRenderAppender(builder);
-
             boolean addedDataAccessProvider = false;
             try {
+                StringBuilder builder = new StringBuilder(2048);
+                AbstractRenderAppender appender = new 
StringBuilderRenderAppender(builder);
+
                 /* todo: perf -- this doesn't need to happen when the data set 
is empty */
                 DataAccessProviderStack.addDataAccessProvider(this, 
getJspContext());
-                DataGridUtil.putDataGridTagModel(getJspContext(), 
_gridTagModel);
+                DataGridUtil.putDataGridTagModel(getJspContext(), 
_dataGridTagModel);
                 addedDataAccessProvider = true;
 
+                StringWriter sw = new StringWriter();
                 /*
                    allow sub-tags to do work during START before rendering
                    this makes it possible to have tags out of order and to
                    have rendering work correctly
-
-                   todo: perf -- should you be able to turn this off for perf?
                  */
-                StringWriter sw = new StringWriter();
+                /* todo: perf -- should you be able to turn this off for perf? 
*/
                 fragment.invoke(sw);
 
                 /* todo: this needs to move into the DataGridTagModel */
-                PagerModel pm = 
_gridTagModel.getDataGridState().getPagerModel();
-                _gridTagModel.getDataSet().createWindow(pm.getRow(), 
pm.getRow() + pm.getPageSize());
+                PagerModel pm = 
_dataGridTagModel.getDataGridState().getPagerModel();
+                _dataGridTagModel.getDataSet().createWindow(pm.getRow(), 
pm.getRow() + pm.getPageSize());
 
                 /* now that the model objects have been initialized, it's time 
to start rendering */
-                
_gridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_START);
+                
_dataGridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_START);
 
-                if(!_gridTagModel.isDisableDefaultPagerRendering())
-                    _gridTagModel.renderPager(appender);
+                if(!_dataGridTagModel.isDisableDefaultPagerRendering())
+                    _dataGridTagModel.renderPager(appender);
 
                 TableTag.State tableState = new TableTag.State();
                 tableState.styleClass = styleModel.getTableClass();
                 tableRenderer.openTable(tableState, appender);
 
                 /* render the caption */
-                
_gridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_CAPTION);
+                
_dataGridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_CAPTION);
                 sw = new StringWriter();
                 fragment.invoke(sw);
                 String caption = sw.toString();
-                if(caption != null && !caption.trim().equals("")) {
+                if(caption != null)
                     appender.append(caption);
-                }
 
-                /* render the grid rows (header and data) */
-                
_gridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_GRID);
+                /* render the header */
+                
_dataGridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_HEADER);
                 sw = new StringWriter();
                 fragment.invoke(sw);
-                appender.append(sw.toString());
+                String header = sw.toString();
+                if(header != null)
+                    appender.append(header);
+
+                /* intermediate storage for the body and footer content
+                   these are required by the HTML spec:
+                       
http://www.w3.org/TR/REC-html40/struct/tables.html#h-11.2.3
+                   as when the row groups are used, they must be re-ordered so 
that
+                   <tfoot> preceeds <tbody>
+                 */
+
+                String tbody = null;
+                String tfoot = null;
+
+                /* render the body */
+                
_dataGridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_GRID);
+                sw = new StringWriter();
+                fragment.invoke(sw);
+                tbody = sw.toString();
 
                 /* render the footer */
-                
_gridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_FOOTER);
+                
_dataGridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_FOOTER);
                 sw = new StringWriter();
                 fragment.invoke(sw);
                 String footer = sw.toString();
                 String trimmed = footer.trim();
-                if(footer != null && !trimmed.trim().equals("")) {
-                    appender.append(footer);
+                if(footer != null && !trimmed.trim().equals(""))
+                    tfoot = footer;
+
+                if(_dataGridTagModel.isRenderRowGroups()) {
+                    if(tfoot != null)
+                        appender.append(tfoot);
+                    appender.append(tbody);
+                }
+                else {
+                    appender.append(tbody);
+                    if(tfoot != null)
+                        appender.append(tfoot);
                 }
 
                 tableRenderer.closeTable(appender);
 
-                
_gridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_END);
+                
_dataGridTagModel.changeRenderState(DataGridTagModel.RENDER_STATE_END);
 
                 /* todo: when rendering using thead / tfoot / tbody, they need 
to be rendered
                          in order.  when not rendering like this, they need to 
be written
@@ -246,11 +280,11 @@
      * ===========================================================
      */
     public int getCurrentIndex() {
-        return _gridTagModel.getCurrentIndex();
+        return _dataGridTagModel.getCurrentIndex();
     }
 
     public Object getCurrentItem() {
-        return _gridTagModel.getCurrentItem();
+        return _dataGridTagModel.getCurrentItem();
     }
 
     public Object getCurrentMetadata() {

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
 Mon Feb 21 14:21:32 2005
@@ -21,8 +21,11 @@
 import java.io.StringWriter;
 import javax.servlet.jsp.tagext.JspFragment;
 import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspContext;
 
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
+import org.apache.beehive.netui.tags.IHtmlEvents;
+import org.apache.beehive.netui.tags.IHtmlI18n;
 import org.apache.beehive.netui.tags.html.HtmlConstants;
 import org.apache.beehive.netui.tags.rendering.AbstractHtmlState;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
@@ -39,7 +42,8 @@
  * @netui.tldx:tag whitespace="indent" renderer=""*
  */
 public class Footer
-    extends AbstractSimpleTag {
+    extends AbstractSimpleTag
+    implements IHtmlEvents, IHtmlI18n {
 
     private TFootTag.State _tfootTag = new TFootTag.State();
 
@@ -233,29 +237,118 @@
         _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.TITLE, title);
     }
 
+    /**
+     * Sets the value of the horizontal align attribute.
+     *
+     * @param align
+     * @jsptagref.attributedescription The horizontal alignment.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_align</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setAlign(String align) {
+        /* todo: should this enforce left|center|right|justify|char as in the 
spec */
+        _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.ALIGN, align);
+    }
+
+    /**
+     * Sets the value of the horizontal alignment character attribute.
+     *
+     * @param alignChar
+     * @jsptagref.attributedescription The horizontal alignment character.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_alignChar</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment character"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setChar(String alignChar) {
+        _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.CHAR, alignChar);
+    }
+
+    /**
+     * Sets the value of the horizontal alignment character offset attribute.
+     *
+     * @param alignCharOff
+     * @jsptagref.attributedescription The horizontal alignment character 
offset
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_alignCharOff</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment character offset"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setCharoff(String alignCharOff) {
+        _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.CHAROFF, alignCharOff);
+    }
+
+    /**
+     * Sets the value of the vertical alignment attribute.
+     *
+     * @param align
+     * @jsptagref.attributedescription The vertical alignment.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_align</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's vertical alignment"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setValign(String align) {
+        /* todo: should this enforce top|middle|bottom|baseline as in the spec 
*/
+        _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.VALIGN, align);
+    }
+
+    /**
+     * Sets the value of the language attribute.
+     *
+     * @param lang
+     * @jsptagref.attributedescription The language.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_lang</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's language"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setLang(String lang) {
+        _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.LANG, lang);
+    }
+
+    /**
+     * Sets the value of the text direction attribute.
+     *
+     * @param dir
+     * @jsptagref.attributedescription The text direction attribute.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_dir</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's text direction"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setDir(String dir) {
+        _tfootTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.DIR, dir);
+    }
+
     public void doTag()
         throws IOException, JspException {
 
-        DataGridTagModel dgm = 
DataGridUtil.getDataGridTagModel(getJspContext());
-        if(dgm == null)
-            throw new JspException("Unable to find a dataGridModel in the 
JspContext");
+        JspContext jspContext = getJspContext();
+        DataGridTagModel dataGridTagModel = 
DataGridUtil.getDataGridTagModel(jspContext);
+        if(dataGridTagModel == null)
+            throw new JspException("Unable to find a Data Grid tag model in 
the JspContext");
 
-        if(dgm.getRenderState() == DataGridTagModel.RENDER_STATE_FOOTER) {
+        if(dataGridTagModel.getRenderState() == 
DataGridTagModel.RENDER_STATE_FOOTER) {
             JspFragment fragment = getJspBody();
             if(fragment != null) {
                 StringWriter sw = new StringWriter();
-                TableRenderer tableRenderer = dgm.getTableRenderer();
-                StyleModel stylePolicy = dgm.getStyleModel();
-                AbstractRenderAppender appender = new 
WriteRenderAppender(getJspContext());
+                TableRenderer tableRenderer = 
dataGridTagModel.getTableRenderer();
+                assert tableRenderer != null;
+                StyleModel styleModel = dataGridTagModel.getStyleModel();
+                assert styleModel != null;
+                AbstractRenderAppender appender = new 
WriteRenderAppender(jspContext);
 
                 TrTag.State trState = new TrTag.State();
-                trState.styleClass = stylePolicy.getFooterRowClass();
+                trState.styleClass = styleModel.getFooterRowClass();
 
-                /*
+                if(dataGridTagModel.isRenderRowGroups()) {
                     if(_tfootTag.styleClass == null)
-                        _tfootTag.styleClass = stylePolicy.getTableFootClass();
+                        _tfootTag.styleClass = styleModel.getTableFootClass();
                     tableRenderer.openTableFoot(_tfootTag, appender);
-                 */
+                }
 
                 tableRenderer.openFooterRow(trState, appender);
 
@@ -264,9 +357,8 @@
 
                 tableRenderer.closeFooterRow(appender);
 
-                /*
+                if(dataGridTagModel.isRenderRowGroups())
                     tableRenderer.closeTableFoot(appender);
-                 */
             }
         }
     }

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
 Mon Feb 21 14:21:32 2005
@@ -24,6 +24,8 @@
 import javax.servlet.jsp.JspContext;
 
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
+import org.apache.beehive.netui.tags.IHtmlI18n;
+import org.apache.beehive.netui.tags.IHtmlEvents;
 import org.apache.beehive.netui.tags.html.HtmlConstants;
 import org.apache.beehive.netui.tags.rendering.THeadTag;
 import org.apache.beehive.netui.tags.rendering.TrTag;
@@ -39,7 +41,8 @@
  * @netui.tldx:tag whitespace="indent"
  */
 public class Header
-    extends AbstractSimpleTag {
+    extends AbstractSimpleTag
+    implements IHtmlEvents, IHtmlI18n {
 
     private THeadTag.State _theadTag = new THeadTag.State();
 
@@ -233,31 +236,119 @@
         _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.TITLE, title);
     }
 
+    /**
+     * Sets the value of the horizontal align attribute.
+     *
+     * @param align
+     * @jsptagref.attributedescription The horizontal alignment.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_align</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setAlign(String align) {
+        /* todo: should this enforce left|center|right|justify|char as in the 
spec */
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.ALIGN, align);
+    }
+
+    /**
+     * Sets the value of the horizontal alignment character attribute.
+     *
+     * @param alignChar
+     * @jsptagref.attributedescription The horizontal alignment character.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_alignChar</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment character"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setChar(String alignChar) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.CHAR, alignChar);
+    }
+
+    /**
+     * Sets the value of the horizontal alignment character offset attribute.
+     *
+     * @param alignCharOff
+     * @jsptagref.attributedescription The horizontal alignment character 
offset
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_alignCharOff</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment character offset"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setCharoff(String alignCharOff) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.CHAROFF, alignCharOff);
+    }
+
+    /**
+     * Sets the value of the vertical alignment attribute.
+     *
+     * @param align
+     * @jsptagref.attributedescription The vertical alignment.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_align</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's vertical alignment"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setValign(String align) {
+        /* todo: should this enforce top|middle|bottom|baseline as in the spec 
*/
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.VALIGN, align);
+    }
+
+    /**
+     * Sets the value of the languageattribute.
+     *
+     * @param lang
+     * @jsptagref.attributedescription The language.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_lang</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's language"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setLang(String lang) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.LANG, lang);
+    }
+
+    /**
+     * Sets the value of the text direction attribute.
+     *
+     * @param dir
+     * @jsptagref.attributedescription The text direction attribute.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_dir</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's text direction"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setDir(String dir) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.DIR, dir);
+    }
+
     public void doTag()
         throws JspException, IOException {
 
         JspContext jspContext = getJspContext();
         DataGridTagModel dataGridModel = 
DataGridUtil.getDataGridTagModel(jspContext);
         if(dataGridModel == null)
-            throw new JspException("Unable to find a dataGridModel in the 
JspContext");
+            throw new JspException("Unable to find a Data Grid tag model in 
the JspContext");
 
         int gridRenderState = dataGridModel.getRenderState();
-        if(gridRenderState == DataGridTagModel.RENDER_STATE_GRID) {
+        if(gridRenderState == DataGridTagModel.RENDER_STATE_HEADER) {
 
             StringBuilder content = new StringBuilder();
             AbstractRenderAppender appender = new 
StringBuilderRenderAppender(content);
 
-            StyleModel stylePolicy = dataGridModel.getStyleModel();
-            assert stylePolicy != null;
+            StyleModel styleModel = dataGridModel.getStyleModel();
+            assert styleModel != null;
 
             TableRenderer tableRenderer = dataGridModel.getTableRenderer();
             assert tableRenderer != null;
 
-            _theadTag.styleClass = (_theadTag.styleClass != null ? 
_theadTag.styleClass : stylePolicy.getTableHeadClass());
-            tableRenderer.openTableHead(_theadTag, appender);
+            if(dataGridModel.isRenderRowGroups()) {
+                _theadTag.styleClass = (_theadTag.styleClass != null ? 
_theadTag.styleClass : styleModel.getTableHeadClass());
+                tableRenderer.openTableHead(_theadTag, appender);
+            }
 
             TrTag.State trState = new TrTag.State();
-            trState.styleClass = stylePolicy.getHeaderRowClass();
+            trState.styleClass = styleModel.getHeaderRowClass();
             tableRenderer.openHeaderRow(trState, appender);
 
             JspFragment fragment = getJspBody();
@@ -269,9 +360,10 @@
 
             tableRenderer.closeHeaderRow(appender);
 
-            tableRenderer.closeTableHead(appender);
+            if(dataGridModel.isRenderRowGroups())
+                tableRenderer.closeTableHead(appender);
 
-            getJspContext().getOut().write(content.toString());
+            jspContext.getOut().write(content.toString());
         }
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java
 Mon Feb 21 14:21:32 2005
@@ -27,9 +27,14 @@
 import org.apache.beehive.netui.databinding.datagrid.api.rendering.StyleModel;
 import 
org.apache.beehive.netui.databinding.datagrid.runtime.rendering.table.TableRenderer;
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
+import org.apache.beehive.netui.tags.IHtmlEvents;
+import org.apache.beehive.netui.tags.IHtmlI18n;
+import org.apache.beehive.netui.tags.html.HtmlConstants;
 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
 import org.apache.beehive.netui.tags.rendering.TrTag;
+import org.apache.beehive.netui.tags.rendering.TBodyTag;
+import org.apache.beehive.netui.tags.rendering.AbstractHtmlState;
 
 /**
  * @netui:tag name="rows" description="Container tag for columsn that will 
render in the grid"
@@ -38,12 +43,287 @@
  * whitespace="indent" requiredparent="dataGrid"
  */
 public class Rows
-    extends AbstractSimpleTag {
+    extends AbstractSimpleTag
+    implements IHtmlEvents, IHtmlI18n {
+
+    private TBodyTag.State _tbodyTag = new TBodyTag.State();
 
     public String getTagName() {
         return "Rows";
     }
 
+    /**
+     * Sets the onClick javascript event.
+     *
+     * @param onClick - the onClick event.
+     * @jsptagref.attributedescription The onClick JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onClick</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onClick JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnClick(String onClick) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONCLICK, onClick);
+    }
+
+    /**
+     * Sets the onDblClick javascript event.
+     *
+     * @param onDblClick - the onDblClick event.
+     * @jsptagref.attributedescription The onDblClick JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onDblClick</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onDblClick JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnDblClick(String onDblClick) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONDBLCLICK, onDblClick);
+    }
+
+    /**
+     * Sets the onKeyDown javascript event.
+     *
+     * @param onKeyDown - the onKeyDown event.
+     * @jsptagref.attributedescription The onKeyDown JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onKeyDown</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onKeyDown JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnKeyDown(String onKeyDown) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONKEYDOWN, onKeyDown);
+    }
+
+    /**
+     * Sets the onKeyUp javascript event.
+     *
+     * @param onKeyUp - the onKeyUp event.
+     * @jsptagref.attributedescription The onKeyUp JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onKeyUp</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onKeyUp JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnKeyUp(String onKeyUp) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONKEYUP, onKeyUp);
+    }
+
+    /**
+     * Sets the onKeyPress javascript event.
+     *
+     * @param onKeyPress - the onKeyPress event.
+     * @jsptagref.attributedescription The onKeyPress JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onKeyPress</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onKeyPress JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnKeyPress(String onKeyPress) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONKEYPRESS, onKeyPress);
+    }
+
+    /**
+     * Sets the onMouseDown javascript event.
+     *
+     * @param onMouseDown - the onMouseDown event.
+     * @jsptagref.attributedescription The onMouseDown JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseDown</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseDown JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseDown(String onMouseDown) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEDOWN, onMouseDown);
+    }
+
+    /**
+     * Sets the onMouseUp javascript event.
+     *
+     * @param onMouseUp - the onMouseUp event.
+     * @jsptagref.attributedescription The onMouseUp JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseUp</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseUp JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseUp(String onMouseUp) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEUP, onMouseUp);
+    }
+
+    /**
+     * Sets the onMouseMove javascript event.
+     *
+     * @param onMouseMove - the onMouseMove event.
+     * @jsptagref.attributedescription The onMouseMove JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseMove</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseMove JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseMove(String onMouseMove) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEMOVE, onMouseMove);
+    }
+
+    /**
+     * Sets the onMouseOut javascript event.
+     *
+     * @param onMouseOut - the onMouseOut event.
+     * @jsptagref.attributedescription The onMouseOut JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseOut</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseOut JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseOut(String onMouseOut) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEOUT, onMouseOut);
+    }
+
+    /**
+     * Sets the onMouseOver javascript event.
+     *
+     * @param onMouseOver - the onMouseOver event.
+     * @jsptagref.attributedescription The onMouseOver JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseOver</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseOver JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseOver(String onMouseOver) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEOVER, onMouseOver);
+    }
+
+    /**
+     * Sets the style of the rendered html tag.
+     *
+     * @param style - the html style.
+     * @jsptagref.attributedescription The style.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_style</i>
+     * @netui:attribute required="false"  rtexprvalue="true" description="The 
style."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.JspStyleProperty" 
category="format"
+     */
+    public void setStyle(String style) {
+        if("".equals(style)) return;
+
+        _tbodyTag.style = style;
+    }
+
+    /**
+     * Sets the style class of the rendered html tag.
+     *
+     * @param styleClass - the html style class.
+     * @jsptagref.attributedescription The style class.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_style_class</i>
+     * @netui:attribute required="false"  rtexprvalue="true" description="The 
style class."
+     * @netui.tldx:attribute category="Format"
+     */
+    public void setStyleClass(String styleClass) {
+        if("".equals(styleClass)) return;
+
+        _tbodyTag.styleClass = styleClass;
+    }
+
+    /**
+     * Sets the value of the title attribute.
+     *
+     * @param title
+     * @jsptagref.attributedescription The title.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_title</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
title. "
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setTitle(String title) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.TITLE, title);
+    }
+
+    /**
+     * Sets the value of the horizontal align attribute.
+     *
+     * @param align
+     * @jsptagref.attributedescription The horizontal alignment.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_align</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setAlign(String align) {
+        /* todo: should this enforce left|center|right|justify|char as in the 
spec */
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.ALIGN, align);
+    }
+
+    /**
+     * Sets the value of the horizontal alignment character attribute.
+     *
+     * @param alignChar
+     * @jsptagref.attributedescription The horizontal alignment character.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_alignChar</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment character"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setChar(String alignChar) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.CHAR, alignChar);
+    }
+
+    /**
+     * Sets the value of the horizontal alignment character offset attribute.
+     *
+     * @param alignCharOff
+     * @jsptagref.attributedescription The horizontal alignment character 
offset
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_alignCharOff</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's horizontal alignment character offset"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setCharoff(String alignCharOff) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.CHAROFF, alignCharOff);
+    }
+
+    /**
+     * Sets the value of the vertical alignment attribute.
+     *
+     * @param align
+     * @jsptagref.attributedescription The vertical alignment.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_align</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's vertical alignment"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setValign(String align) {
+        /* todo: should this enforce top|middle|bottom|baseline as in the spec 
*/
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.VALIGN, align);
+    }
+
+    /**
+     * Sets the value of the languageattribute.
+     *
+     * @param lang
+     * @jsptagref.attributedescription The language.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_lang</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's language"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setLang(String lang) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.LANG, lang);
+    }
+
+    /**
+     * Sets the value of the text direction attribute.
+     *
+     * @param dir
+     * @jsptagref.attributedescription The text direction attribute.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>string_dir</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
cell's text direction"
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setDir(String dir) {
+        _tbodyTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.DIR, dir);
+    }
+
     public void doTag()
         throws IOException, JspException {
         JspContext jspContext = getJspContext();
@@ -53,8 +333,8 @@
             throw new JspException("Unable to find a dataGridModel in the 
JspContext");
 
         if(dataGridModel.getRenderState() == 
DataGridTagModel.RENDER_STATE_GRID) {
-            StyleModel stylePolicy = dataGridModel.getStyleModel();
-            assert stylePolicy != null;
+            StyleModel styleModel = dataGridModel.getStyleModel();
+            assert styleModel != null;
 
             TableRenderer tableRenderer = dataGridModel.getTableRenderer();
             assert tableRenderer != null;
@@ -63,15 +343,18 @@
             AbstractRenderAppender appender = new 
StringBuilderRenderAppender(content);
             JspFragment fragment = getJspBody();
 
+            if(dataGridModel.isRenderRowGroups())
+                tableRenderer.openTableBody(_tbodyTag, appender);
+
             while(dataGridModel.hasNextDataItem()) {
                 StringWriter sw = new StringWriter();
                 TrTag.State trState = new TrTag.State();
 
                 int index = dataGridModel.getCurrentIndex();
                 if(index % 2 == 0)
-                    trState.styleClass = stylePolicy.getRowClass();
+                    trState.styleClass = styleModel.getRowClass();
                 else
-                    trState.styleClass = stylePolicy.getAltRowClass();
+                    trState.styleClass = styleModel.getAltRowClass();
 
                 tableRenderer.openTableRow(trState, appender);
                 dataGridModel.nextDataItem();
@@ -79,6 +362,9 @@
                 content.append(sw.toString());
                 tableRenderer.closeTableRow(appender);
             }
+
+            if(dataGridModel.isRenderRowGroups())
+                tableRenderer.closeTableBody(appender);
 
             jspContext.getOut().write(content.toString());
         }

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/HtmlConstants.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/HtmlConstants.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/HtmlConstants.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/HtmlConstants.java
 Mon Feb 21 14:21:32 2005
@@ -550,6 +550,11 @@
     static final String TABLE = "table";
 
     /**
+     * The name of the <code>tbody</code> element.
+     */
+    static final String TBODY = "tbody";
+    
+    /**
      * The name of the <code>td</code> element.
      */
     static final String TD = "td";

Added: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TBodyTag.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TBodyTag.java?view=auto&rev=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TBodyTag.java
 (added)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TBodyTag.java
 Mon Feb 21 14:21:32 2005
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.tags.rendering;
+
+import org.apache.beehive.netui.tags.html.HtmlConstants;
+
+import java.util.HashMap;
+
+/**
+ *
+ */
+public abstract class TBodyTag
+    extends TagHtmlBase
+{
+
+    public static void add(HashMap html, HashMap htmlQuirks, HashMap xhtml)
+    {
+        html.put(TBODY_TAG, new 
org.apache.beehive.netui.tags.rendering.TBodyTag.Rendering());
+        htmlQuirks.put(TBODY_TAG, new 
org.apache.beehive.netui.tags.rendering.TBodyTag.Rendering());
+        xhtml.put(TBODY_TAG, new 
org.apache.beehive.netui.tags.rendering.TBodyTag.Rendering());
+    }
+
+    public static class State
+        extends AbstractHtmlState
+    {
+        public void clear()
+        {
+            super.clear();
+        }
+    }
+
+    private static class Rendering
+        extends TBodyTag
+        implements HtmlConstants
+    {
+
+        // @todo: need to support %coreattrs, %i18n, %events, %cellhalign, 
%cellvalign on <tbody>
+        public void doStartTag(AbstractRenderAppender sb, AbstractTagState 
renderState)
+        {
+            assert(sb != null) : "Parameter 'sb' must not be null";
+            assert(renderState != null) : "Parameter 'renderState' must not be 
null";
+            assert(renderState instanceof State) : "Paramater 'renderState' 
must be an instance of TBodyTag.State";
+
+            State state = (State) renderState;
+
+            renderTag(sb, TBODY);
+
+            renderAttribute(sb, ID, state.id);
+            renderAttribute(sb, CLASS, state.styleClass);
+
+            renderAttributes(AbstractHtmlState.ATTR_GENERAL, sb, state);
+            renderAttribute(sb, STYLE, state.style);
+            renderAttributes(AbstractHtmlState.ATTR_JAVASCRIPT, sb, state);
+            sb.append(">");
+        }
+
+        public void doEndTag(AbstractRenderAppender sb)
+        {
+            renderEndTag(sb, TBODY);
+        }
+    }
+}
\ No newline at end of file

Propchange: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TBodyTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TFootTag.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TFootTag.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TFootTag.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TFootTag.java
 Mon Feb 21 14:21:32 2005
@@ -55,7 +55,7 @@
         {
             assert(sb != null) : "Parameter 'sb' must not be null";
             assert(renderState != null) : "Parameter 'renderState' must not be 
null";
-            assert(renderState instanceof State) : "Paramater 'renderState' 
must be an instance of TdTag.State";
+            assert(renderState instanceof State) : "Paramater 'renderState' 
must be an instance of TFootTag.State";
 
             State state = (State) renderState;
 

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/THeadTag.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/THeadTag.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/THeadTag.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/THeadTag.java
 Mon Feb 21 14:21:32 2005
@@ -51,7 +51,7 @@
         {
             assert(sb != null) : "Parameter 'sb' must not be null";
             assert(renderState != null) : "Parameter 'renderState' must not be 
null";
-            assert(renderState instanceof State) : "Paramater 'renderState' 
must be an instance of TdTag.State";
+            assert(renderState instanceof State) : "Paramater 'renderState' 
must be an instance of THeadTag.State";
 
             State state = (State) renderState;
 

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TagRenderingBase.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TagRenderingBase.java?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TagRenderingBase.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/TagRenderingBase.java
 Mon Feb 21 14:21:32 2005
@@ -117,6 +117,7 @@
     public static final Object SPAN_TAG = new Object();
     public static final Object DIV_TAG = new Object();
     public static final Object TABLE_TAG = new Object();
+    public static final Object TBODY_TAG = new Object();
     public static final Object TD_TAG = new Object();
     public static final Object TEXT_AREA_TAG = new Object();
     public static final Object TH_TAG = new Object();
@@ -313,6 +314,7 @@
             SelectTag.add(_html, _htmlQuirks, _xhtml);
             SpanTag.add(_html, _htmlQuirks, _xhtml);
             TableTag.add(_html, _htmlQuirks, _xhtml);
+            TBodyTag.add(_html, _htmlQuirks, _xhtml);
             TdTag.add(_html, _htmlQuirks, _xhtml);
             TextAreaTag.add(_html, _htmlQuirks, _xhtml);
             ThTag.add(_html, _htmlQuirks, _xhtml);

Added: 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/rowGroups.jsp
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/rowGroups.jsp?view=auto&rev=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/rowGroups.jsp
 (added)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/rowGroups.jsp
 Mon Feb 21 14:21:32 2005
@@ -0,0 +1,35 @@
+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
+<%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0"; prefix="netui"%>
+<%@ taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0"; 
prefix="netui-data"%>
+<%@ taglib uri="http://beehive.apache.org/netui/tags-template-1.0"; 
prefix="netui-template"%>
+<%@ taglib prefix="datagrid" 
tagdir="/WEB-INF/tags/org/apache/beehive/netui/test/databinding/tagfiles" %>
+
+<netui-template:template templatePage="../site/template.jsp">
+    <netui-template:setAttribute name="title" value="Row Groups Test"/>
+    <netui-template:section name="body">
+    <p>
+    <datagrid:portfolioXmlBean/>
+    <br/>
+    <netui-data:dataGrid dataSource="pageScope.stocks" name="portfolio" 
renderRowGroups="true">
+    <netui-data:header>
+        <netui-data:headerCell headerText="Symbol"/>
+        <netui-data:headerCell headerText="Price"/>
+        <netui-data:headerCell headerText="Web"/>
+    </netui-data:header>
+    <netui-data:footer>
+        <tr>
+            <td colspan="3" align="center">This space intentionally left 
blank.</td>
+        </tr>
+    </netui-data:footer>
+    <netui-data:rows>
+        <netui-data:spanCell value="${container.item.symbol}"/>
+        <netui-data:spanCell value="${container.item.price}"/>
+        <netui-data:anchorCell href="${container.item.web}" 
value="${container.item.name}">
+            <netui:parameter name="rowid" value="${container.index}"/>
+            <netui:parameter name="symbol" value="${container.item.symbol}"/>
+        </netui-data:anchorCell>
+    </netui-data:rows>
+    </netui-data:dataGrid>
+    </netui-template:section>
+</netui-template:template>
+

Propchange: 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/rowGroups.jsp
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
 Mon Feb 21 14:21:32 2005
@@ -3006,6 +3006,21 @@
          </features>
       </test>
       <test>
+         <name>DataGridRowGroups</name>
+         <description>DataGridRowGroups</description>
+         <webapp>coreWeb</webapp>
+         <categories>
+            <category>bvt</category>
+            <category>bvt.struts11</category>
+            <category>databinding</category>
+            <category>datagrid</category>
+         </categories>
+         <features>
+            <feature>Databinding</feature>
+            <feature>Data Grid</feature>
+         </features>
+      </test>
+      <test>
          <name>DataGridScriptletTagFile</name>
          <description>DataGridScriptletTagFile</description>
          <webapp>coreWeb</webapp>

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCSSPrefix.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCSSPrefix.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCSSPrefix.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCSSPrefix.xml
 Mon Feb 21 14:21:32 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession 
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session";>
    <ses:sessionName>DataGridCSSPrefix</ses:sessionName>
    <ses:tester>ekoneil</ses:tester>
-   <ses:startDate>06 Feb 2005, 04:16:22.520 PM MST</ses:startDate>
+   <ses:startDate>21 Feb 2005, 02:27:07.148 PM MST</ses:startDate>
    <ses:description>ekoneil</ses:description>
    <ses:tests>
       <ses:test>
@@ -18,7 +18,7 @@
             <ses:cookies>
                <ses:cookie>
                   <ses:name>JSESSIONID</ses:name>
-                  <ses:value>CE256718D71E3C9A0853F71E1F1132B1</ses:value>
+                  <ses:value>F729A7431C101AA4DE3DE928CBC96828</ses:value>
                </ses:cookie>
             </ses:cookies>
             <ses:headers>
@@ -44,7 +44,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>cookie</ses:name>
-                  <ses:value>$Version=0; 
JSESSIONID=CE256718D71E3C9A0853F71E1F1132B1; $Path=/coreWeb</ses:value>
+                  <ses:value>$Version=0; 
JSESSIONID=F729A7431C101AA4DE3DE928CBC96828; $Path=/coreWeb</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>host</ses:name>
@@ -56,7 +56,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>testrecorder.playback.testid</ses:name>
-                  <ses:value>-3df8ceb0:101e9f0162f:-7d8b</ses:value>
+                  <ses:value>4d9cca5e:10236ad19f8:-7f41</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
@@ -99,7 +99,9 @@
 <table class="foo">
 
     
-<thead class="foo">
+        
+    
+    
 <tr class="foo-header">
         <th class="foo">Symbol</th>
 
@@ -111,8 +113,10 @@
 
 
     
-</tr></thead>
-
+</tr>
+        
+    
+    
         
 <tr class="foo-even">
             <td class="foo"><span>BEAS</span></td>
@@ -172,9 +176,9 @@
          </ses:testResults>
       </ses:test>
    </ses:tests>
-   <ses:endDate>06 Feb 2005, 04:16:23.852 PM MST</ses:endDate>
+   <ses:endDate>21 Feb 2005, 02:27:08.350 PM MST</ses:endDate>
    <ses:sessionStatus>fail</ses:sessionStatus>
    <ses:testCount>1</ses:testCount>
    <ses:passedCount>0</ses:passedCount>
    <ses:failedCount>1</ses:failedCount>
-</ses:recorderSession>
+</ses:recorderSession>
\ No newline at end of file

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionAttributes.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionAttributes.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionAttributes.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionAttributes.xml
 Mon Feb 21 14:21:32 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession 
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session";>
    <ses:sessionName>DataGridCaptionAttributes</ses:sessionName>
    <ses:tester>ekoneil</ses:tester>
-   <ses:startDate>06 Feb 2005, 04:16:14.658 PM MST</ses:startDate>
+   <ses:startDate>21 Feb 2005, 02:26:58.446 PM MST</ses:startDate>
    <ses:description>ekoneil</ses:description>
    <ses:tests>
       <ses:test>
@@ -15,12 +15,7 @@
             
<ses:uri>/coreWeb/databinding/datagrid/misc/captionAttributes.jsp</ses:uri>
             <ses:method>GET</ses:method>
             <ses:parameters/>
-            <ses:cookies>
-               <ses:cookie>
-                  <ses:name>JSESSIONID</ses:name>
-                  <ses:value>CE256718D71E3C9A0853F71E1F1132B1</ses:value>
-               </ses:cookie>
-            </ses:cookies>
+            <ses:cookies/>
             <ses:headers>
                <ses:header>
                   <ses:name>accept</ses:name>
@@ -43,10 +38,6 @@
                   <ses:value>keep-alive</ses:value>
                </ses:header>
                <ses:header>
-                  <ses:name>cookie</ses:name>
-                  <ses:value>$Version=0; 
JSESSIONID=CE256718D71E3C9A0853F71E1F1132B1; $Path=/coreWeb</ses:value>
-               </ses:header>
-               <ses:header>
                   <ses:name>host</ses:name>
                   <ses:value>localhost:8080</ses:value>
                </ses:header>
@@ -56,7 +47,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>testrecorder.playback.testid</ses:name>
-                  <ses:value>-3df8ceb0:101e9f0162f:-7d91</ses:value>
+                  <ses:value>4d9cca5e:10236ad19f8:-7f47</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
@@ -114,7 +105,6 @@
         
         
     
-<thead class="datagrid">
 <tr class="datagrid-header">
         <th class="datagrid">Symbol</th>
 
@@ -123,8 +113,12 @@
 
 
     
-</tr></thead>
-
+</tr>
+        
+    
+        
+        
+    
         
 <tr class="datagrid-even">
             <td class="datagrid"><span>BEAS</span></td>
@@ -185,7 +179,6 @@
         
         
     
-<thead class="datagrid">
 <tr class="datagrid-header">
         <th class="datagrid">Symbol</th>
 
@@ -194,8 +187,12 @@
 
 
     
-</tr></thead>
-
+</tr>
+        
+    
+        
+        
+    
         
 <tr class="datagrid-even">
             <td class="datagrid"><span>BEAS</span></td>
@@ -253,7 +250,6 @@
         
         
     
-<thead class="datagrid">
 <tr class="datagrid-header">
         <th class="datagrid">Symbol</th>
 
@@ -262,8 +258,12 @@
 
 
     
-</tr></thead>
-
+</tr>
+        
+    
+        
+        
+    
         
 <tr class="datagrid-even">
             <td class="datagrid"><span>BEAS</span></td>
@@ -318,7 +318,7 @@
          </ses:testResults>
       </ses:test>
    </ses:tests>
-   <ses:endDate>06 Feb 2005, 04:16:18.003 PM MST</ses:endDate>
+   <ses:endDate>21 Feb 2005, 02:27:02.572 PM MST</ses:endDate>
    <ses:sessionStatus>fail</ses:sessionStatus>
    <ses:testCount>1</ses:testCount>
    <ses:passedCount>0</ses:passedCount>

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionJavaScript.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionJavaScript.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionJavaScript.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionJavaScript.xml
 Mon Feb 21 14:21:32 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession 
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session";>
    <ses:sessionName>DataGridCaptionJavaScript</ses:sessionName>
    <ses:tester>ekoneil</ses:tester>
-   <ses:startDate>06 Feb 2005, 04:16:20.667 PM MST</ses:startDate>
+   <ses:startDate>21 Feb 2005, 02:27:05.866 PM MST</ses:startDate>
    <ses:description>ekoneil</ses:description>
    <ses:tests>
       <ses:test>
@@ -18,7 +18,7 @@
             <ses:cookies>
                <ses:cookie>
                   <ses:name>JSESSIONID</ses:name>
-                  <ses:value>CE256718D71E3C9A0853F71E1F1132B1</ses:value>
+                  <ses:value>F729A7431C101AA4DE3DE928CBC96828</ses:value>
                </ses:cookie>
             </ses:cookies>
             <ses:headers>
@@ -44,7 +44,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>cookie</ses:name>
-                  <ses:value>$Version=0; 
JSESSIONID=CE256718D71E3C9A0853F71E1F1132B1; $Path=/coreWeb</ses:value>
+                  <ses:value>$Version=0; 
JSESSIONID=F729A7431C101AA4DE3DE928CBC96828; $Path=/coreWeb</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>host</ses:name>
@@ -56,7 +56,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>testrecorder.playback.testid</ses:name>
-                  <ses:value>-3df8ceb0:101e9f0162f:-7d8d</ses:value>
+                  <ses:value>4d9cca5e:10236ad19f8:-7f43</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
@@ -106,7 +106,6 @@
         
         
         
-<thead class="datagrid">
 <tr class="datagrid-header">
             <th class="datagrid">Symbol</th>
 
@@ -115,8 +114,12 @@
 
 
         
-</tr></thead>
-
+</tr>
+        
+    
+        
+        
+        
         
 <tr class="datagrid-even">
             <td class="datagrid"><span>BEAS</span></td>
@@ -174,7 +177,7 @@
          </ses:testResults>
       </ses:test>
    </ses:tests>
-   <ses:endDate>06 Feb 2005, 04:16:22.450 PM MST</ses:endDate>
+   <ses:endDate>21 Feb 2005, 02:27:07.078 PM MST</ses:endDate>
    <ses:sessionStatus>fail</ses:sessionStatus>
    <ses:testCount>1</ses:testCount>
    <ses:passedCount>0</ses:passedCount>

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionTest.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionTest.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionTest.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCaptionTest.xml
 Mon Feb 21 14:21:32 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession 
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session";>
    <ses:sessionName>DataGridCaptionTest</ses:sessionName>
    <ses:tester>ekoneil</ses:tester>
-   <ses:startDate>06 Feb 2005, 04:16:18.063 PM MST</ses:startDate>
+   <ses:startDate>21 Feb 2005, 02:27:02.802 PM MST</ses:startDate>
    <ses:description>ekoneil</ses:description>
    <ses:tests>
       <ses:test>
@@ -18,7 +18,7 @@
             <ses:cookies>
                <ses:cookie>
                   <ses:name>JSESSIONID</ses:name>
-                  <ses:value>CE256718D71E3C9A0853F71E1F1132B1</ses:value>
+                  <ses:value>F729A7431C101AA4DE3DE928CBC96828</ses:value>
                </ses:cookie>
             </ses:cookies>
             <ses:headers>
@@ -44,7 +44,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>cookie</ses:name>
-                  <ses:value>$Version=0; 
JSESSIONID=CE256718D71E3C9A0853F71E1F1132B1; $Path=/coreWeb</ses:value>
+                  <ses:value>$Version=0; 
JSESSIONID=F729A7431C101AA4DE3DE928CBC96828; $Path=/coreWeb</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>host</ses:name>
@@ -56,7 +56,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>testrecorder.playback.testid</ses:name>
-                  <ses:value>-3df8ceb0:101e9f0162f:-7d8f</ses:value>
+                  <ses:value>4d9cca5e:10236ad19f8:-7f45</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
@@ -105,7 +105,6 @@
 
     
     
-<thead class="datagrid">
 <tr class="datagrid-header">
         <th class="datagrid">Symbol</th>
 
@@ -117,9 +116,12 @@
 
 
     
-</tr></thead>
+</tr>
+    
 
     
+    
+    
 <tr class="datagrid-even">
         <td class="datagrid"><span>BEAS</span></td>
 
@@ -188,9 +190,9 @@
          </ses:testResults>
       </ses:test>
    </ses:tests>
-   <ses:endDate>06 Feb 2005, 04:16:20.607 PM MST</ses:endDate>
+   <ses:endDate>21 Feb 2005, 02:27:05.816 PM MST</ses:endDate>
    <ses:sessionStatus>fail</ses:sessionStatus>
    <ses:testCount>1</ses:testCount>
    <ses:passedCount>0</ses:passedCount>
    <ses:failedCount>1</ses:failedCount>
-</ses:recorderSession>
+</ses:recorderSession>
\ No newline at end of file

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomHeaderStyle.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomHeaderStyle.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomHeaderStyle.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomHeaderStyle.xml
 Mon Feb 21 14:21:32 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession 
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session";>
    <ses:sessionName>DataGridCustomHeaderStyle</ses:sessionName>
    <ses:tester>ekoneil</ses:tester>
-   <ses:startDate>06 Feb 2005, 04:16:23.922 PM MST</ses:startDate>
+   <ses:startDate>21 Feb 2005, 02:27:08.400 PM MST</ses:startDate>
    <ses:description>ekoneil</ses:description>
    <ses:tests>
       <ses:test>
@@ -18,7 +18,7 @@
             <ses:cookies>
                <ses:cookie>
                   <ses:name>JSESSIONID</ses:name>
-                  <ses:value>CE256718D71E3C9A0853F71E1F1132B1</ses:value>
+                  <ses:value>F729A7431C101AA4DE3DE928CBC96828</ses:value>
                </ses:cookie>
             </ses:cookies>
             <ses:headers>
@@ -44,7 +44,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>cookie</ses:name>
-                  <ses:value>$Version=0; 
JSESSIONID=CE256718D71E3C9A0853F71E1F1132B1; $Path=/coreWeb</ses:value>
+                  <ses:value>$Version=0; 
JSESSIONID=F729A7431C101AA4DE3DE928CBC96828; $Path=/coreWeb</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>host</ses:name>
@@ -56,7 +56,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>testrecorder.playback.testid</ses:name>
-                  <ses:value>-3df8ceb0:101e9f0162f:-7d89</ses:value>
+                  <ses:value>4d9cca5e:10236ad19f8:-7f3f</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
@@ -102,7 +102,9 @@
 <table class="foo">
 
     
-<thead class="foo">
+        
+    
+    
 <tr class="foo-header">
         <th class="custom-header">Symbol</th>
 
@@ -114,8 +116,10 @@
 
 
     
-</tr></thead>
-
+</tr>
+        
+    
+    
         
 <tr class="foo-even">
             <td class="foo"><span>BEAS</span></td>
@@ -175,9 +179,9 @@
          </ses:testResults>
       </ses:test>
    </ses:tests>
-   <ses:endDate>06 Feb 2005, 04:16:25.734 PM MST</ses:endDate>
+   <ses:endDate>21 Feb 2005, 02:27:10.183 PM MST</ses:endDate>
    <ses:sessionStatus>fail</ses:sessionStatus>
    <ses:testCount>1</ses:testCount>
    <ses:passedCount>0</ses:passedCount>
    <ses:failedCount>1</ses:failedCount>
-</ses:recorderSession>
+</ses:recorderSession>
\ No newline at end of file

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomTagAttributes.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomTagAttributes.xml?view=diff&r1=154731&r2=154732
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomTagAttributes.xml
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridCustomTagAttributes.xml
 Mon Feb 21 14:21:32 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession 
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session";>
    <ses:sessionName>DataGridCustomTagAttributes</ses:sessionName>
    <ses:tester>ekoneil</ses:tester>
-   <ses:startDate>21 Feb 2005, 10:28:16.468 AM MST</ses:startDate>
+   <ses:startDate>21 Feb 2005, 03:11:08.606 PM MST</ses:startDate>
    <ses:description>ekoneil</ses:description>
    <ses:tests>
       <ses:test>
@@ -18,7 +18,7 @@
             <ses:cookies>
                <ses:cookie>
                   <ses:name>JSESSIONID</ses:name>
-                  <ses:value>E4BC5A8D8A2B2548F6B41028CBFDCFA6</ses:value>
+                  <ses:value>3D846B0FFB3E10011276E70866CCB47B</ses:value>
                </ses:cookie>
             </ses:cookies>
             <ses:headers>
@@ -44,7 +44,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>cookie</ses:name>
-                  <ses:value>$Version=0; 
JSESSIONID=E4BC5A8D8A2B2548F6B41028CBFDCFA6; $Path=/coreWeb</ses:value>
+                  <ses:value>$Version=0; 
JSESSIONID=3D846B0FFB3E10011276E70866CCB47B; $Path=/coreWeb</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>host</ses:name>
@@ -56,7 +56,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>testrecorder.playback.testid</ses:name>
-                  <ses:value>354d10c9:10235f1bd0e:-7d6b</ses:value>
+                  <ses:value>-7891b722:10236f6cf22:-7f5a</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
@@ -101,7 +101,9 @@
 <table class="datagrid">
 
     
-<thead class="datagrid">
+        
+    
+    
 <tr class="datagrid-header">
         <th class="datagrid">Symbol</th>
 
@@ -113,8 +115,10 @@
 
 
     
-</tr></thead>
-
+</tr>
+        
+    
+    
         
 <tr class="datagrid-even">
             <td class="datagrid"><span attr-test-symbol="BEAS" 
onclick="javascript:alert(this)">BEAS</span></td>
@@ -180,7 +184,7 @@
          </ses:testResults>
       </ses:test>
    </ses:tests>
-   <ses:endDate>21 Feb 2005, 10:28:17.609 AM MST</ses:endDate>
+   <ses:endDate>21 Feb 2005, 03:11:09.808 PM MST</ses:endDate>
    <ses:sessionStatus>fail</ses:sessionStatus>
    <ses:testCount>1</ses:testCount>
    <ses:passedCount>0</ses:passedCount>


Reply via email to