You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beehive.apache.org by ek...@apache.org on 2004/11/11 22:00:50 UTC

svn commit: rev 57473 - in incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui: databinding/datagrid/model databinding/datagrid/rendering tags/databinding/datagrid

Author: ekoneil
Date: Thu Nov 11 13:00:49 2004
New Revision: 57473

Modified:
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnModel.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnsModel.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/TableRenderer.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AnchorColumn.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Columns.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.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/ImageColumn.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/LiteralColumn.java
Log:
Grid tag fixup.

- rationalize the relationship between the <dataGrid> tag and the sub-tags that configure various objects set on the DataGridModel.
- centrailze the table rendering in the TableRenderer.  Parameterizing and rendering the HTML table tags is now done through a combination of the TableRenderer and StylePolicy.  

BB: self
Tests: NetUI pass



Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnModel.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnModel.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnModel.java	Thu Nov 11 13:00:49 2004
@@ -21,11 +21,13 @@
  */
 public class ColumnModel {
 
-    private ColumnsModel _columnsModel = null;
+    private ColumnsModel _columnsModel;
+    private DataGridModel _dataGridModel;
 
-    public ColumnModel(ColumnsModel columns)
+    public ColumnModel(DataGridModel dataGridModel, ColumnsModel columnsModel)
     {
-        _columnsModel = columns;
+        _dataGridModel = dataGridModel;
+        _columnsModel = columnsModel;
     }
 
     public boolean isRenderingHeader() {

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnsModel.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnsModel.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/ColumnsModel.java	Thu Nov 11 13:00:49 2004
@@ -28,6 +28,12 @@
 
     private int _renderState = NO_RENDER_STATE;
 
+    private DataGridModel _dataGridModel;
+
+    public ColumnsModel(DataGridModel dataGridModel) {
+        _dataGridModel = dataGridModel;
+    }
+
     public int getRenderState() {
         return _renderState;
     }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java	Thu Nov 11 13:00:49 2004
@@ -66,27 +66,28 @@
         _name = name;
         _jspContext = jspContext;
         _dataSet = dataSet;
-        _pagerModel = new PagerModel(this);
     }
 
-    public void initialize() {
-        HttpServletRequest request = (HttpServletRequest)((PageContext)_jspContext).getRequest();
+    public void beforeRender() {
 
         /* todo: need to move to using absolute page references in the URL */
-        int lastPage = (int)Math.ceil((float)_dataSet.getSize()/(float)_pagerModel.getPageSize());
-        assert lastPage >= 0;
-        int startRenderWindow = (_pagerModel.getCurrentPage()-1)*_pagerModel.getPageSize();
-        int endRenderWindow =
-                _pagerModel.getCurrentPage() != lastPage ?
-                startRenderWindow+ _pagerModel.getPageSize() :
-                _dataSet.getSize();
-
-        assert startRenderWindow <= endRenderWindow;
-
-        // set the calculated render window on the data set
-        _dataSet.createWindow(startRenderWindow, endRenderWindow);
-        _pagerModel.initialize();
-        _tableRenderer = new TableRenderer(request);
+        if (_pagerModel != null) {
+            int lastPage = (int) Math.ceil((float) _dataSet.getSize() / (float) _pagerModel.getPageSize());
+            assert lastPage >= 0;
+            int startRenderWindow = (_pagerModel.getCurrentPage() - 1) * _pagerModel.getPageSize();
+            int endRenderWindow =
+                    _pagerModel.getCurrentPage() != lastPage ?
+                    startRenderWindow + _pagerModel.getPageSize() :
+                    _dataSet.getSize();
+
+            assert startRenderWindow <= endRenderWindow;
+
+            // set the calculated render window on the data set
+            _dataSet.createWindow(startRenderWindow, endRenderWindow);
+
+            assert _pagerModel != null;
+            _pagerModel.initialize();
+        }
     }
 
     public int getRenderState() {
@@ -120,6 +121,10 @@
         return _pagerModel;
     }
 
+    public void setPagerModel(PagerModel pagerModel) {
+        _pagerModel = pagerModel;    
+    }
+
     public void setPagerService(PagerService pagerService) {
         _pagerService = pagerService;
     }
@@ -161,6 +166,10 @@
 
     public TableRenderer getTableRenderer() {
         return _tableRenderer;
+    }
+
+    public void setTableRenderer(TableRenderer tableRenderer) {
+        _tableRenderer = tableRenderer;
     }
 
     /* ===========================================================

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/TableRenderer.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/TableRenderer.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/TableRenderer.java	Thu Nov 11 13:00:49 2004
@@ -27,12 +27,14 @@
 import org.apache.beehive.netui.tags.rendering.CaptionTag;
 import org.apache.beehive.netui.tags.rendering.THeadTag;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
-import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
+import org.apache.beehive.netui.databinding.datagrid.model.StylePolicy;
 
 public class TableRenderer
 {
     private static final CaptionTag.State CAPTION_STATE = new CaptionTag.State();
     private static final THeadTag.State THEAD_STATE = new THeadTag.State();
+    private static final TableTag.State TABLE_STATE = new TableTag.State();
+    private static final TrTag.State TR_STATE = new TrTag.State();
 
     private TagRenderingBase _tableRenderer = null;
     private TagRenderingBase _captionRenderer = null;
@@ -40,10 +42,12 @@
     private TagRenderingBase _trRenderer = null;
     private TagRenderingBase _tdRenderer = null;
     private TagRenderingBase _thRenderer = null;
+    private StylePolicy _stylePolicy = null;
 
-    public TableRenderer(HttpServletRequest request)
+    public TableRenderer(HttpServletRequest request, StylePolicy stylePolicy)
     {
         super();
+        _stylePolicy = stylePolicy;
         _tableRenderer = TagRenderingBase.Factory.getRendering(TagRenderingBase.TABLE_TAG, request);
         _captionRenderer = TagRenderingBase.Factory.getRendering(TagRenderingBase.CAPTION_TAG, request);
         _theadRenderer = TagRenderingBase.Factory.getRendering(TagRenderingBase.THEAD_TAG, request);
@@ -54,6 +58,11 @@
 
     public void openTable(TableTag.State state, AbstractRenderAppender appender)
     {
+        if(state == null)
+            state = new TableTag.State();
+
+        state.styleClass = _stylePolicy.getTableClass();
+
         appender.append("\n");
         _tableRenderer.doStartTag(appender, state);
         appender.append("\n");
@@ -63,6 +72,7 @@
     {
         _tableRenderer.doEndTag(appender);
         appender.append("\n");
+        appender.append("\n");
     }
 
     public void openCaption(AbstractRenderAppender appender)
@@ -79,6 +89,12 @@
 
     public final void openHeaderRow(TrTag.State state, AbstractRenderAppender appender)
     {
+        if(state == null)
+            state = new TrTag.State();
+
+        if(state != null)
+            state.styleClass = _stylePolicy.getHeaderRowClass();
+
         appender.append("\n");
         _theadRenderer.doStartTag(appender, THEAD_STATE);
         appender.append("\n");
@@ -107,6 +123,12 @@
 
     public void openFooterRow(TrTag.State state, AbstractRenderAppender appender)
     {
+        if(state == null)
+            state = new TrTag.State();
+
+        if(state != null)
+            state.styleClass = _stylePolicy.getFooterRowClass();
+
         appender.append("\n");
         _trRenderer.doStartTag(appender, state);
     }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java	Thu Nov 11 13:00:49 2004
@@ -17,6 +17,9 @@
  */
 package org.apache.beehive.netui.tags.databinding.datagrid;
 
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
 import javax.servlet.jsp.tagext.JspTag;
 import javax.servlet.jsp.tagext.JspFragment;
 import javax.servlet.jsp.JspException;
@@ -24,7 +27,6 @@
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.databinding.datagrid.model.ColumnModel;
 import org.apache.beehive.netui.databinding.datagrid.model.ColumnsModel;
-
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
@@ -33,10 +35,6 @@
 import org.apache.beehive.netui.tags.html.FormatTag.Formatter;
 import org.apache.beehive.netui.util.logging.Logger;
 
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-
 /**
  *
  */
@@ -49,10 +47,8 @@
     static final String COLUMN_MODEL_KEY = "column";
 
     private static final String EMPTY_CELL = "&nbsp;";
-    private static final String EMPTY_STRING = "";
 
     private String _headerText = null;
-    private DataGridModel _dataGridModel = null;
     private ArrayList _formatters = null;
 
     /**
@@ -62,7 +58,27 @@
         _headerText = headerText;
     }
 
+    public String getHeaderText() {
+        return _headerText;
+    }
+
+    public void addFormatter(Formatter formatter) {
+        if(_formatters == null)
+            _formatters = new ArrayList();
+
+        _formatters.add(formatter);
+    }
+
+    /**
+     * Indicate that a formatter has reported an error so the formatter should output it's
+     * body text.
+     */
+    public void formatterHasError() {
+        /* todo: error reporting! */
+    }
+
     /**
+     *
      * @throws JspException
      * @throws IOException
      */
@@ -74,9 +90,12 @@
         if (!(parent instanceof Columns))
             throw new JspException("A Column tag must be contained inside of a Columns tag.");
 
-        int gridRenderState = DataGridUtil.getDataGridModel(getJspContext()).getRenderState();
+        DataGridModel dataGridModel = DataGridUtil.getDataGridModel(getJspContext());
+        assert dataGridModel != null;
 
-        // when starting to render, the AbstractColumnModel associated with this tag needs to be created
+        int gridRenderState = dataGridModel.getRenderState();
+
+        /* START_RENDER_STATE is a no-op for columns */
         if (gridRenderState == DataGridModel.START_RENDER_STATE) {
             return;
         }
@@ -84,23 +103,16 @@
         // needs to be fetched from the <columns> tag for the current
         // iteration
         else {
-
-            StringBuilder content = new StringBuilder();
-            AbstractRenderAppender appender = new StringBuilderRenderAppender(content);
-
             ColumnsModel columns = DataGridUtil.getColumnsModel(getJspContext());
             assert columns != null;
 
-            ColumnModel model = new ColumnModel(columns);
-
             int renderState = columns.getRenderState();
-
             assert renderState == ColumnsModel.DATA_RENDER_STATE ||
                    renderState == ColumnsModel.HEADER_RENDER_STATE;
 
-            applyAttributes();
+            ColumnModel model = new ColumnModel(dataGridModel, columns);
 
-            // todo: need to assert that the identityHashCode of 'cm' is well-known
+            applyAttributes();
 
             if (_logger.isDebugEnabled()) {
                 _logger.debug("current column\n\trender state: " + renderState);
@@ -109,78 +121,35 @@
 
             getJspContext().setAttribute(COLUMN_MODEL_KEY, model);
 
-            JspFragment fragment = getJspBody();
-            StringWriter sw = new StringWriter();
-            String bodyContent = null;
-            if (fragment != null) {
-                fragment.invoke(sw);
-                bodyContent = sw.toString();
-            }
+            StringBuilder content = new StringBuilder();
+            AbstractRenderAppender appender = new StringBuilderRenderAppender(content);
 
             if (renderState == ColumnsModel.HEADER_RENDER_STATE) {
-
-                openHeaderCell(appender);
-                if (_headerText != null)
-                    renderHeader(appender);
-                else if (bodyContent != null)
-                    appender.append(bodyContent);
-                closeHeaderCell(appender);
+                renderHeaderCell(appender);
             } else if (renderState == ColumnsModel.DATA_RENDER_STATE) {
-
-                openDataCell(appender);
                 renderDataCell(appender);
-                closeDataCell(appender);
             }
 
             if (content != null && content.length() > 0)
                 getJspContext().getOut().println(content.toString());
-        }
 
-        getJspContext().removeAttribute(COLUMN_MODEL_KEY);
+            getJspContext().removeAttribute(COLUMN_MODEL_KEY);
+        }
 
         return;
     }
 
-    protected abstract void openHeaderCell(AbstractRenderAppender appender);
-
-    protected abstract void closeHeaderCell(AbstractRenderAppender appender);
-
-    protected abstract void openDataCell(AbstractRenderAppender appender);
-
-    protected abstract void closeDataCell(AbstractRenderAppender appender);
+    protected abstract void renderHeaderCell(AbstractRenderAppender appender) throws IOException, JspException;
 
-    public void addFormatter(Formatter formatter) {
-        if(_formatters == null)
-            _formatters = new ArrayList();
+    protected abstract void renderDataCell(AbstractRenderAppender appender) throws IOException, JspException;
 
-        _formatters.add(formatter);
-    }
-
-    /**
-     * Indicate that a formatter has reported an error so the formatter should output it's
-     * body text.
-     */
-    public void formatterHasError() {
-        // todo: error reporting!
+    protected void renderEmptyHeaderCell(AbstractRenderAppender appender) {
+        appender.append(EMPTY_CELL);
     }
 
+    /* todo: apply the global sort / filter attributes here */
     protected void applyAttributes()
         throws JspException {
-        /* todo: apply the global sort / filter attributes here */
-    }
-
-    protected void renderHeader(AbstractRenderAppender appender) {
-
-        if (_headerText == null)
-            renderEmptyCell(appender);
-        else
-            appender.append(_headerText != null ? _headerText.toString() : EMPTY_STRING);
-    }
-
-    protected abstract void renderDataCell(AbstractRenderAppender appender);
-
-    protected void renderEmptyCell(AbstractRenderAppender appender) {
-        appender.append(EMPTY_CELL);
     }
 
     protected String formatText(Object text) {

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java	Thu Nov 11 13:00:49 2004
@@ -17,7 +17,13 @@
  */
 package org.apache.beehive.netui.tags.databinding.datagrid;
 
+import java.io.IOException;
+import java.io.StringWriter;
+import javax.servlet.jsp.tagext.JspFragment;
+import javax.servlet.jsp.JspException;
+
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
+import org.apache.beehive.netui.databinding.datagrid.rendering.TableRenderer;
 import org.apache.beehive.netui.tags.IAttributeConsumer;
 import org.apache.beehive.netui.tags.html.HtmlConstants;
 import org.apache.beehive.netui.tags.rendering.ThTag;
@@ -28,7 +34,6 @@
 
 /**
  * TODO: need to support <netui:attribute> tags for the header table cell
- * TODO: need to support .clear() to whack custom attributes
  */
 public abstract class AbstractHtmlColumn
     extends AbstractColumn
@@ -440,6 +445,71 @@
         }
     }
 
+    protected abstract AbstractHtmlState internalGetHtmlState();
+
+    protected void renderHeaderCell(AbstractRenderAppender appender)
+        throws IOException, JspException {
+
+        DataGridModel dataGridModel = DataGridUtil.getDataGridModel(getJspContext());
+        assert dataGridModel != null;
+
+        TableRenderer tableRenderer = dataGridModel.getTableRenderer();
+        assert tableRenderer != null;
+
+        if (_thState.styleClass == null)
+            _thState.styleClass = dataGridModel.getCssPolicy().getHeaderCellClass();
+
+        tableRenderer.openHeaderCell(_thState, appender);
+        renderHeaderCellContents(appender);
+        tableRenderer.closeHeaderCell(appender);
+    }
+
+    protected void renderDataCell(AbstractRenderAppender appender)
+        throws IOException, JspException {
+        DataGridModel dataGridModel = DataGridUtil.getDataGridModel(getJspContext());
+        assert dataGridModel != null;
+
+        TableRenderer tableRenderer = dataGridModel.getTableRenderer();
+        assert tableRenderer != null;
+
+        if(_tdState.styleClass == null)
+            _tdState.styleClass = dataGridModel.getCssPolicy().getDataCellClass();
+
+        /* todo: this needs to run in order to cause the nested parameter / attribute / etc tags to do their work */
+        /* this could be faster -- would be nice to have the sub-tag *ask* to do this rather than always do it */
+        JspFragment fragment = getJspBody();
+        StringWriter sw = new StringWriter();
+        String bodyContent = null;
+        if (fragment != null) {
+            fragment.invoke(sw);
+            bodyContent = sw.toString();
+        }
+
+        tableRenderer.openTableCell(_tdState, appender);
+        renderDataCellContents(appender);
+        tableRenderer.closeTableCell(appender);
+     }
+
+    protected void renderHeaderCellContents(AbstractRenderAppender appender)
+        throws IOException, JspException {
+
+        JspFragment fragment = getJspBody();
+        StringWriter sw = new StringWriter();
+        String bodyContent = null;
+        if (fragment != null) {
+            fragment.invoke(sw);
+            bodyContent = sw.toString();
+        }
+
+        if (getHeaderText() != null)
+            appender.append(getHeaderText());
+        else if (bodyContent != null)
+            appender.append(bodyContent);
+        else renderEmptyHeaderCell(appender);
+    }
+
+    protected abstract void renderDataCellContents(AbstractRenderAppender appender);
+
     private void addStateAttribute(AbstractHtmlState state, String name, String value, String facet)
     {
         boolean error = false;
@@ -472,8 +542,6 @@
         state.registerAttribute(AbstractHtmlState.ATTR_GENERAL, name, value);
     }
 
-    protected abstract AbstractHtmlState internalGetHtmlState();
-
     private final ThTag.State internalGetThState()
     {
         return _thState;
@@ -483,28 +551,4 @@
     {
         return _tdState;
     }
-
-    public void openHeaderCell(AbstractRenderAppender appender) {
-        DataGridModel dgm = DataGridUtil.getDataGridModel(getJspContext());
-         if (_thState.styleClass == null)
-             _thState.styleClass = dgm.getCssPolicy().getHeaderCellClass();
-
-         dgm.getTableRenderer().openHeaderCell(_thState, appender);
-     }
-
-     public void closeHeaderCell(AbstractRenderAppender appender) {
-         DataGridUtil.getDataGridModel(getJspContext()).getTableRenderer().closeHeaderCell(appender);
-     }
-
-     public void openDataCell(AbstractRenderAppender appender) {
-         DataGridModel dgm = DataGridUtil.getDataGridModel(getJspContext());
-         if(_tdState.styleClass == null)
-             _tdState.styleClass = dgm.getCssPolicy().getDataCellClass();
-
-         dgm.getTableRenderer().openTableCell(_tdState, appender);
-     }
-
-     public void closeDataCell(AbstractRenderAppender appender) {
-         DataGridUtil.getDataGridModel(getJspContext()).getTableRenderer().closeTableCell(appender);
-     }
 }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AnchorColumn.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AnchorColumn.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AnchorColumn.java	Thu Nov 11 13:00:49 2004
@@ -113,7 +113,7 @@
         return _anchorState;
     }
 
-    protected void renderDataCell(AbstractRenderAppender appender) {
+    protected void renderDataCellContents(AbstractRenderAppender appender) {
 
         HttpServletRequest request = (HttpServletRequest)((PageContext)getJspContext()).getRequest();
 

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Columns.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Columns.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Columns.java	Thu Nov 11 13:00:49 2004
@@ -27,6 +27,7 @@
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.databinding.datagrid.model.StylePolicy;
 import org.apache.beehive.netui.databinding.datagrid.model.ColumnModel;
+import org.apache.beehive.netui.databinding.datagrid.rendering.TableRenderer;
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
@@ -55,6 +56,8 @@
     {
         JspContext jspContext = getJspContext();
         DataGridModel dataGridModel = DataGridUtil.getDataGridModel(jspContext);
+        assert dataGridModel != null;
+        
         int gridRenderState = dataGridModel.getRenderState();
 
         if(gridRenderState == DataGridModel.CAPTION_RENDER_STATE ||
@@ -65,7 +68,10 @@
         }
         else if(gridRenderState == DataGridModel.GRID_RENDER_STATE)
         {
-            ColumnsModel columnsModel = new ColumnsModel();
+            TableRenderer tableRenderer = dataGridModel.getTableRenderer();
+            assert tableRenderer != null;
+
+            ColumnsModel columnsModel = new ColumnsModel(dataGridModel);
             assert columnsModel != null;
 
             jspContext.setAttribute(COLUMNS_MODEL_KEY, columnsModel);
@@ -77,21 +83,23 @@
 
             // render header row
             columnsModel.setRenderState(ColumnsModel.HEADER_RENDER_STATE);
-            openHeaderRow(appender, dataGridModel);
+            tableRenderer.openHeaderRow(null, appender);
             fragment.invoke(sw);
             content.append(sw.toString());
-            closeHeaderRow(appender, dataGridModel);
+            tableRenderer.closeHeaderRow(appender);
 
             // render data rows
             columnsModel.setRenderState(ColumnsModel.DATA_RENDER_STATE);
             while(dataGridModel.hasNextDataItem())
             {
                 sw = new StringWriter();
-                openDataRow(appender, dataGridModel);
+                TrTag.State trState = new TrTag.State();
+                initDataRowStyle(trState, dataGridModel);
+                tableRenderer.openTableRow(trState, appender);
                 dataGridModel.nextDataItem();
                 fragment.invoke(sw);
                 content.append(sw.toString());
-                closeDataRow(appender, dataGridModel);
+                tableRenderer.closeTableRow(appender);
             }
 
             columnsModel.setRenderState(ColumnsModel.NO_RENDER_STATE);
@@ -101,34 +109,16 @@
         }
     }
 
-    public final void openHeaderRow(AbstractRenderAppender appender, DataGridModel dataGridModel)
-    {
-        StylePolicy stylePolicy = dataGridModel.getCssPolicy();
-        TrTag.State state = new TrTag.State();
-        state.styleClass = stylePolicy.getHeaderRowClass();
+    private final void initDataRowStyle(TrTag.State state, DataGridModel dataGridModel) {
+        assert state != null;
+        assert dataGridModel != null;
 
-        dataGridModel.getTableRenderer().openHeaderRow(state, appender);
-    }
-
-    public void closeHeaderRow(AbstractRenderAppender appender, DataGridModel dataGridModel)
-    {
-        dataGridModel.getTableRenderer().closeHeaderRow(appender);
-    }
+        StylePolicy stylePolicy = dataGridModel.getCssPolicy();
+        assert stylePolicy != null;
 
-    public void openDataRow(AbstractRenderAppender appender, DataGridModel dataGridModel)
-    {
-        TrTag.State state = new TrTag.State();
         int index = dataGridModel.getCurrentIndex();
-        StylePolicy stylePolicy = dataGridModel.getCssPolicy();
         if(index % 2 == 0)
             state.styleClass = stylePolicy.getRowClass();
         else state.styleClass = stylePolicy.getAltRowClass();
-
-        dataGridModel.getTableRenderer().openTableRow(state, appender);
-    }
-
-    public void closeDataRow(AbstractRenderAppender appender, DataGridModel dataGridModel)
-    {
-        dataGridModel.getTableRenderer().closeTableRow(appender);
     }
 }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java	Thu Nov 11 13:00:49 2004
@@ -29,13 +29,11 @@
 
 /**
  * @netui:tag name="configurePager" body-content="empty"
- *            description="Pager tag for the configuring and rendering the pager rendered in the NetUI data grid"
+ * description="Pager tag for the configuring and rendering the pager rendered in the NetUI data grid"
  * @netui.tldx:tag renderer="" whitespace="indent"
  */
 public class ConfigurePager
-    extends AbstractSimpleTag
-{
-    private static final Logger _logger = Logger.getInstance(ConfigurePager.class);
+        extends AbstractSimpleTag {
 
     private static final String FIRST_LAST_PREV_NEXT = "firstPrevNextLast";
     private static final String PREV_NEXT = "prevNext";
@@ -45,86 +43,88 @@
     private String _pageHref = null;
     private String _pageAction = null;
 
-    public String getTagName()
-    {
+    public String getTagName() {
         return "Pager";
     }
 
-   /**
+    /**
      * @jsptagref.attributedescription The maximum page size of data rendered by the NetUI data grid.
      * @jsptagref.databindable true
      * @jsptagref.attributesyntaxvalue <i>int_pageSize</i>
-     *
      * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setPageSize(int pageSize) {_pageSize = pageSize;}
+    public void setPageSize(int pageSize) {
+        _pageSize = pageSize;
+    }
 
     /**
-      * @jsptagref.attributedescription The look and feel to render for the pager
-      * @jsptagref.databindable true
-      * @jsptagref.attributesyntaxvalue <i>String_pagerStyle</i>
-      *
-      * @netui:attribute required="false" rtexprvalue="true"
-      */
-    public void setPagerFormat(String pagerFormat) {_pagerFormat = pagerFormat;}
+     * @jsptagref.attributedescription The look and feel to render for the pager
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>String_pagerStyle</i>
+     * @netui:attribute required="false" rtexprvalue="true"
+     */
+    public void setPagerFormat(String pagerFormat) {
+        _pagerFormat = pagerFormat;
+    }
 
     /**
-      * @jsptagref.attributedescription The URI to access when paging occurs.
-      * @jsptagref.databindable true
-      * @jsptagref.attributesyntaxvalue <i>String_pageUri</i>
-      *
-      * @netui:attribute required="false" rtexprvalue="true"
-      */
-    public void setPageHref(String pageHref) {_pageHref = pageHref;}
+     * @jsptagref.attributedescription The URI to access when paging occurs.
+     * @jsptagref.databindable true
+     * @jsptagref.attributesyntaxvalue <i>String_pageUri</i>
+     * @netui:attribute required="false" rtexprvalue="true"
+     */
+    public void setPageHref(String pageHref) {
+        _pageHref = pageHref;
+    }
 
     /**
      * @jsptagref.attributedescription
      * @jsptagref.databindable true
      * @jsptagref.attributesyntaxvalue <i>String_pageAction</i>
-     *
      * @netui:attribute required="false" rtexprvalue="true"
      * @netui.tldx:attribute category="general" reftype="netui-action-url"
      */
-    public void setPageAction(String pageAction) {_pageAction = pageAction;}
+    public void setPageAction(String pageAction) {
+        _pageAction = pageAction;
+    }
 
     public void doTag()
-        throws JspException
-    {
-        if(_pageSize != null)
-        {
-            DataGridModel dgm = DataGridUtil.getDataGridModel(getJspContext());
-            assert dgm != null;
+            throws JspException {
+        
+        DataGridModel dgm = DataGridUtil.getDataGridModel(getJspContext());
+        assert dgm != null;
 
-            PagerModel pm = dgm.getPagerModel();
-            assert pm != null;
+        PagerModel pm = new PagerModel(dgm);
+        IPagerRenderer pagerRenderer = null;
 
+        if(_pageSize != null)
             pm.setPageSize(_pageSize);
 
-            if(_pagerFormat != null)
-            {
-                IPagerRenderer pagerRenderer = null;
-                if(_pagerFormat.equals(FIRST_LAST_PREV_NEXT))
-                    pagerRenderer = new FirstPreviousNextLastPagerRenderer(dgm, pm);
-                else if(_pagerFormat.equals(PREV_NEXT))
-                    pagerRenderer = new PreviousNextPagerRenderer(dgm, pm);
-                else throw new JspException("The pagerFormat \"" + _pagerFormat + "\" is not supported");
-                
-                dgm.setPagerRenderer(pagerRenderer);
-            }
-
-            if(_pageHref != null && _pageAction != null)
-                throw new JspException("The configurePager tag can't set both the pageAction and pageHref attributes");
+        /* todo: support pluggable pager renderers as opposed to this fixed list */
+        if (_pagerFormat != null) {
+            if (_pagerFormat.equals(FIRST_LAST_PREV_NEXT))
+                pagerRenderer = new FirstPreviousNextLastPagerRenderer(dgm, pm);
+            else if (_pagerFormat.equals(PREV_NEXT))
+                pagerRenderer = new PreviousNextPagerRenderer(dgm, pm);
+            else throw new JspException("The pagerFormat \"" + _pagerFormat + "\" is not supported");
+        }
 
-            if(_pageHref == null && _pageAction == null)
-                throw new JspException("The configurePager tag requires one of the pageAction or pageHref attributes in order to render a pager link.");
+        if (_pageHref != null && _pageAction != null)
+            throw new JspException("The configurePager tag can't set both the pageAction and pageHref attributes");
 
-            if(_pageHref != null)
-                pm.setPageHref(_pageHref);
+        if (_pageHref == null && _pageAction == null)
+            throw new JspException("The configurePager tag requires one of the pageAction or pageHref attributes in order to render a pager link.");
 
-            if(_pageAction != null)
-                pm.setPageAction(_pageAction);
-        }
+        if (_pageHref != null)
+            pm.setPageHref(_pageHref);
+
+        if (_pageAction != null)
+            pm.setPageAction(_pageAction);
+
+        dgm.setPagerModel(pm);
+        dgm.setPagerRenderer(pagerRenderer);
 
         return;
     }
+
 }

Modified: 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/DataGrid.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java	Thu Nov 11 13:00:49 2004
@@ -21,11 +21,14 @@
 import java.io.IOException;
 import java.io.StringWriter;
 import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.SimpleTagSupport;
 import javax.servlet.jsp.tagext.JspFragment;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.databinding.datagrid.model.StylePolicy;
+import org.apache.beehive.netui.databinding.datagrid.model.PagerModel;
 import org.apache.beehive.netui.databinding.datagrid.model.impl.DefaultStylePolicy;
 import org.apache.beehive.netui.databinding.datagrid.model.impl.EmptyStylePolicy;
 import org.apache.beehive.netui.databinding.datagrid.util.PagedDataSet;
@@ -63,8 +66,8 @@
 
     private boolean _disableDefaultPager = false;
     private String _name = null;
-    private String _cssClassPolicy = DEFAULT_STYLE_POLICY_VALUE;
-    private String _cssClassPrefix = null;
+    private String _stylePolicy = DEFAULT_STYLE_POLICY_VALUE;
+    private String _styleClassPrefix = null;
     private String _dataSource = null;
     private DataGridModel _gridModel = null;
 
@@ -91,14 +94,14 @@
      * @netui:attribute required="false" rtexprvalue="true"
      */
     public void setCssClassPolicy(String cssClassPolicy) {
-        _cssClassPolicy = cssClassPolicy;
+        _stylePolicy = cssClassPolicy;
     }
 
     /**
      * @netui:attribute required="false" rtexprvalue="true"
      */
     public void setCssClassPrefix(String cssClassPrefix) {
-        _cssClassPrefix = cssClassPrefix;
+        _styleClassPrefix = cssClassPrefix;
     }
 
     /**
@@ -121,19 +124,20 @@
         Iterator iterator = IteratorFactory.createIterator(ds);
         PagedDataSet dataSet = new PagedDataSet(dataSource, iterator);
 
-        StylePolicy cssPolicy = null;
-        if (_cssClassPrefix != null)
-            cssPolicy = new DefaultStylePolicy(_cssClassPrefix);
-        else if (_cssClassPolicy == DEFAULT_STYLE_POLICY_VALUE || _cssClassPolicy.equals(DEFAULT_STYLE_POLICY_VALUE))
-            cssPolicy = DEFAULT_STYLE_POLICY;
-        else if (_cssClassPolicy.equals(NO_STYLE_POLICY_VALUE))
-            cssPolicy = EMPTY_STYLE_POLICY;
+        StylePolicy stylePolicy = null;
+        if (_styleClassPrefix != null)
+            stylePolicy = new DefaultStylePolicy(_styleClassPrefix);
+        else if (_stylePolicy == DEFAULT_STYLE_POLICY_VALUE || _stylePolicy.equals(DEFAULT_STYLE_POLICY_VALUE))
+            stylePolicy = DEFAULT_STYLE_POLICY;
+        else if (_stylePolicy.equals(NO_STYLE_POLICY_VALUE))
+            stylePolicy = EMPTY_STYLE_POLICY;
 
-        _gridModel = new DataGridModel(getJspContext(), _name, dataSet);
+        HttpServletRequest request = (HttpServletRequest)((PageContext)getJspContext()).getRequest();
+        TableRenderer tableRenderer = new TableRenderer(request, stylePolicy);
 
-        /* todo: optimize -- this doesn't need to happen when the data set is empty */
-        DataAccessProviderStack.addDataAccessProvider(this, getJspContext());
-        getJspContext().setAttribute(DATA_GRID_MODEL_KEY, _gridModel);
+        _gridModel = new DataGridModel(getJspContext(), _name, dataSet);
+        _gridModel.setCssPolicy(stylePolicy);
+        _gridModel.setTableRenderer(tableRenderer);
 
         JspFragment fragment = getJspBody();
         if (fragment == null)
@@ -145,19 +149,33 @@
         StringBuilder builder = new StringBuilder(2048);
         AbstractRenderAppender appender = new StringBuilderRenderAppender(builder);
 
+        /* todo: optimize -- this doesn't need to happen when the data set is empty */
+        DataAccessProviderStack.addDataAccessProvider(this, getJspContext());
+        getJspContext().setAttribute(DATA_GRID_MODEL_KEY, _gridModel);
+
+        /*
+           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: should you be able to turn this off for perf?
+         */
         StringWriter sw = new StringWriter();
         fragment.invoke(sw);
 
-        _gridModel.initialize();
-        _gridModel.setCssPolicy(cssPolicy);
-        _gridModel.setRenderState(DataGridModel.START_RENDER_STATE);
+        if(_gridModel.getPagerModel() == null)
+            _gridModel.setPagerModel(new PagerModel(_gridModel));
 
-        TableRenderer tableRenderer = _gridModel.getTableRenderer();
+        /*
+          now that the model objects have been initialized, it's time to start rendering
+         */
+        _gridModel.beforeRender();
+        _gridModel.setRenderState(DataGridModel.START_RENDER_STATE);
 
         if (!_disableDefaultPager)
             _gridModel.renderPager(appender);
 
-        openTable(appender, cssPolicy, tableRenderer);
+        tableRenderer.openTable(null, appender);
 
         /* render the caption */
         _gridModel.setRenderState(DataGridModel.CAPTION_RENDER_STATE);
@@ -165,9 +183,9 @@
         fragment.invoke(sw);
         String caption = sw.toString();
         if (caption != null && !caption.trim().equals("")) {
-            openCaption(appender, tableRenderer);
+            tableRenderer.openCaption(appender);
             appender.append(caption);
-            closeCaption(appender, tableRenderer);
+            tableRenderer.closeCaption(appender);
         }
 
         /* render the grid rows (header and data) */
@@ -183,12 +201,12 @@
         String footer = sw.toString();
         String trimmed = footer.trim();
         if (footer != null && !trimmed.trim().equals("")) {
-            openFooterRow(appender, cssPolicy, tableRenderer);
+            tableRenderer.openFooterRow(null, appender);
             appender.append(footer);
-            closeFooterRow(appender, tableRenderer);
+            tableRenderer.closeFooterRow(appender);
         }
 
-        closeTable(appender, tableRenderer);
+        tableRenderer.closeTable(appender);
 
         _gridModel.setRenderState(DataGridModel.END_RENDER_STATE);
 
@@ -231,39 +249,5 @@
         IDataAccessProvider dap =
                 (IDataAccessProvider) SimpleTagSupport.findAncestorWithClass(this, IDataAccessProvider.class);
         return dap;
-    }
-
-    private void openTable(AbstractRenderAppender appender, StylePolicy cssPolicy, TableRenderer tableRenderer)
-    {
-        TableTag.State state = new TableTag.State();
-        state.styleClass = cssPolicy.getTableClass();
-        tableRenderer.openTable(state, appender);
-    }
-
-    private void closeTable(AbstractRenderAppender appender, TableRenderer tableRenderer)
-    {
-        tableRenderer.closeTable(appender);
-        appender.append("\n");
-    }
-
-    private void openCaption(AbstractRenderAppender appender, TableRenderer tableRenderer) {
-        tableRenderer.openCaption(appender);
-    }
-
-    private void closeCaption(AbstractRenderAppender appender, TableRenderer tableRenderer) {
-        tableRenderer.closeCaption(appender);
-    }
-
-    public void openFooterRow(AbstractRenderAppender appender, StylePolicy stylePolicy, TableRenderer tableRenderer)
-    {
-        TrTag.State state = new TrTag.State();
-        state.styleClass = stylePolicy.getFooterRowClass();
-
-        tableRenderer.openFooterRow(state, appender);
-    }
-
-    public void closeFooterRow(AbstractRenderAppender appender, TableRenderer tableRenderer)
-    {
-        tableRenderer.closeFooterRow(appender);
     }
 }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ImageColumn.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ImageColumn.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ImageColumn.java	Thu Nov 11 13:00:49 2004
@@ -104,7 +104,7 @@
         return "ImageColumn";
     }
 
-    public void renderDataCell(AbstractRenderAppender appender)
+    public void renderDataCellContents(AbstractRenderAppender appender)
     {
         HttpServletRequest request = (HttpServletRequest)((PageContext)getJspContext()).getRequest();
 

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/LiteralColumn.java
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/LiteralColumn.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/LiteralColumn.java	Thu Nov 11 13:00:49 2004
@@ -60,7 +60,7 @@
         /* todo: need to apply the <span> HTML state information to the ColumnModel here */
     }
 
-    protected void renderDataCell(AbstractRenderAppender appender) {
+    protected void renderDataCellContents(AbstractRenderAppender appender) {
         HttpServletRequest request = (HttpServletRequest)((PageContext)getJspContext()).getRequest();
         TagRenderingBase span = TagRenderingBase.Factory.getRendering(TagRenderingBase.SPAN_TAG, request);