Author: ekoneil
Date: Wed Apr 20 15:12:05 2005
New Revision: 162083

URL: http://svn.apache.org/viewcvs?rev=162083&view=rev
Log:
Fixes to the CellRepeater to support rendering HTML tables via the tag 
rendering infrastructure.

Also removes the style bean associated with the CellRepeater.

BB: self
DRT: NetUI pass
BVT: NetUI pass


Removed:
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/cellrepeater/style/
Modified:
    
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/cellrepeater/CellRepeater.java

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/cellrepeater/CellRepeater.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/cellrepeater/CellRepeater.java?rev=162083&r1=162082&r2=162083&view=diff
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/cellrepeater/CellRepeater.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/cellrepeater/CellRepeater.java
 Wed Apr 20 15:12:05 2005
@@ -17,25 +17,30 @@
  */
 package org.apache.beehive.netui.tags.databinding.cellrepeater;
 
-import org.apache.beehive.netui.util.internal.InternalStringBuilder;
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Collections;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.tagext.TryCatchFinally;
 import javax.servlet.jsp.tagext.SimpleTagSupport;
+import javax.servlet.ServletRequest;
 
+import org.apache.beehive.netui.script.common.IDataAccessProvider;
+import org.apache.beehive.netui.script.common.DataAccessProviderStack;
 import org.apache.beehive.netui.tags.AbstractClassicTag;
 import org.apache.beehive.netui.tags.ExpressionHandling;
-import org.apache.beehive.netui.tags.html.HtmlDataSourceTag;
-import 
org.apache.beehive.netui.tags.databinding.cellrepeater.style.CellRepeaterStyleBean;
+import org.apache.beehive.netui.tags.rendering.TagRenderingBase;
+import org.apache.beehive.netui.tags.rendering.TableTag;
+import org.apache.beehive.netui.tags.rendering.TdTag;
+import org.apache.beehive.netui.tags.rendering.TrTag;
+import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
+import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
 import org.apache.beehive.netui.util.Bundle;
 import 
org.apache.beehive.netui.util.exception.LocalizedUnsupportedOperationException;
-import org.apache.beehive.netui.util.logging.Logger;
+import org.apache.beehive.netui.util.internal.InternalStringBuilder;
 import org.apache.beehive.netui.util.iterator.IteratorFactory;
-import org.apache.beehive.netui.script.common.IDataAccessProvider;
-import org.apache.beehive.netui.script.common.DataAccessProviderStack;
+import org.apache.beehive.netui.util.logging.Logger;
 
 /**
  * <p/>
@@ -92,8 +97,7 @@
  * </p>
  *
  * @jsptagref.tagdescription <p>
- * Renders
- * individual cells of an HTML table.  The tag
+ * Renders individual cells of an HTML table.  The tag
  * is data bound to a data set specified in the <code>dataSource</code>
  * attribute.  Other &lt;netui...> tags in the body of 
&lt;netui-data:cellRepeater>
  * can use the expression <code>{container.item}</code>
@@ -146,11 +150,14 @@
  * @netui.tldx:tag 
renderer="workshop.netui.jspdesigner.tldx.CellRepeaterRenderer"
  */
 public class CellRepeater
-        extends AbstractClassicTag
-        implements IDataAccessProvider, TryCatchFinally {
+    extends AbstractClassicTag
+    implements IDataAccessProvider, TryCatchFinally {
 
     private static final Logger LOGGER = 
Logger.getInstance(CellRepeater.class);
     private static final int DEFAULT_DIMENSION_VALUE = -1;
+    private static final TableTag.State TABLE_STATE = new TableTag.State();
+    private static final TrTag.State TR_STATE = new TrTag.State();
+    private static final TdTag.State TD_STATE = new TdTag.State();
 
     private boolean _valid = true;
     private boolean _verticalRepeat = false;
@@ -159,12 +166,24 @@
     private int _currentRow = -1;
     private int _currentColumn = -1;
     private int _rows = DEFAULT_DIMENSION_VALUE;
-    private InternalStringBuilder _contentBuffer = null;
     private ArrayList _dataList = null;
     private Object _currentItem = null;
-    private CellRepeaterStyleBean _styleContext = new CellRepeaterStyleBean();
     private String _dataSource = null;
 
+    private String _altCellClass = null;
+    private String _cellClass = null;
+
+    private TagRenderingBase _tableRenderer = null;
+    private TagRenderingBase _trRenderer = null;
+    private TagRenderingBase _tdRenderer = null;
+
+    private TableTag.State _tableState = null;
+    private TdTag.State _tdState = null;
+    private TrTag.State _trState = null;
+
+    private InternalStringBuilder _sb = null;
+    private AbstractRenderAppender _appender = null;
+
     /**
      * Get the name of this tag.  This is used to identify the type of this tag
      * for reporting tag errors.
@@ -184,24 +203,8 @@
      * @param content content that this tag should render.
      */
     public void addContent(String content) {
-        if(_contentBuffer == null) {
-            int size = (content != null ? (5 * content.length()) : 512);
-            _contentBuffer = new InternalStringBuilder(size);
-        }
-
-        _contentBuffer.append(content);
-    }
-
-    /**
-     * Get the content which should be rendered by this tag.
-     *
-     * @return the content String if there is content; null otherwise
-     */
-    public String getContent() {
-        if(_contentBuffer == null)
-            return null;
-        else
-            return _contentBuffer.toString();
+        assert _appender != null : "Found null appender buffer";
+        _appender.append(content);
     }
 
     /**
@@ -223,7 +226,10 @@
      * @netui:attribute required="false"
      */
     public void setTableClass(String tableClass) {
-        _styleContext.setTableClass(tableClass);
+        if("".equals(tableClass))
+            return;
+        _tableState = new TableTag.State();
+        _tableState.styleClass = tableClass;
     }
 
     /**
@@ -246,7 +252,11 @@
      * @netui.tldx:attribute
      */
     public void setRowClass(String rowClass) {
-        _styleContext.setRowClass(rowClass);
+        if("".equals(rowClass))
+            return;
+
+        _tdState = new TdTag.State();
+        _tdState.styleClass = rowClass;
     }
 
     /**
@@ -268,7 +278,7 @@
      * @netui:attribute required="false"
      */
     public void setCellClass(String cellClass) {
-        _styleContext.setCellClass(cellClass);
+        _cellClass = cellClass;
     }
 
     /**
@@ -294,7 +304,7 @@
      * @netui:attribute required="false"
      */
     public void setAlternatingCellClass(String alternatingCellClass) {
-        _styleContext.setAlternatingCellClass(alternatingCellClass);
+        _altCellClass = alternatingCellClass;
     }
 
     /**
@@ -370,24 +380,27 @@
      */
     public int doStartTag()
             throws JspException {
-        Object source = null;
-        if(getDataSource() != null)
-            source = evaluateDataSource();
+        ServletRequest request = pageContext.getRequest();
+
+        _tableRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TABLE_TAG, request);
+        _trRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TR_TAG, request);
+        _tdRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.TD_TAG, request);
+
+        _sb = new InternalStringBuilder(1024);
+        _appender = new StringBuilderRenderAppender(_sb);
+
+        Object source = evaluateDataSource();
 
         if(hasErrors())
             return SKIP_BODY;
 
         if(source != null) {
-            Iterator iterator = null;
-            iterator = IteratorFactory.createIterator(source);
+            Iterator iterator = IteratorFactory.createIterator(source);
             if(iterator == null) {
                 LOGGER.info("CellRepeater: The data structure from which to 
create an iterator is null.");
-                iterator = IteratorFactory.EMPTY_ITERATOR;
+                iterator = Collections.EMPTY_LIST.iterator();
             }
 
-            if(hasErrors())
-                return SKIP_BODY;
-
             if(iterator != null) {
                 _dataList = new ArrayList();
                 while(iterator.hasNext()) {
@@ -396,9 +409,6 @@
             }
         }
 
-        if(hasErrors())
-            return SKIP_BODY;
-
         if(_rows == DEFAULT_DIMENSION_VALUE || _columns == 
DEFAULT_DIMENSION_VALUE) {
             /* try to guess the dimensions of the table */
             if(_dataList != null && _dataList.size() > 0) {
@@ -421,7 +431,7 @@
         if(hasErrors())
             return SKIP_BODY;
 
-        addContent(renderTableTag());
+        renderTableTag(_appender, _tableState);
 
         _currentRow = 0;
         _currentColumn = 0;
@@ -430,21 +440,30 @@
 
         boolean item = ensureItem(0, _dataList);
         if(item) {
+            renderRowTag(_appender, _trState);
+            renderCellTag(_appender, _currentColumn + (_currentRow % 2 == 0 ? 
0 : 1));
+/*
             addContent(renderRowTag());
             addContent(renderCellTag(_currentColumn + (_currentRow % 2 == 0 ? 
0 : 1)));
-
+*/
             return EVAL_BODY_BUFFERED;
         }
         else {
             // special case -- with no items, render the entire table here
             for(int i = 0; i < _rows; i++) {
-                addContent(renderRowTag());
+                renderRowTag(_appender, _trState);
                 for(int j = 0; j < _columns; j++) {
-                    addContent(renderCellTag(computeStyleIndex(i, j)));
+                    renderCellTag(_appender, computeStyleIndex(i, j));
+                    _appender.append("&nbsp;");
+                    _tdRenderer.doEndTag(_appender);
+/*
                     addContent("&nbsp;");
                     addContent("</td>");
+*/
                 }
-                addContent("</tr>\n");
+                _trRenderer.doEndTag(_appender);
+                _appender.append("\n");
+                //addContent("</tr>\n");
             }
             _currentRow = _rows;
             _currentColumn = _columns;
@@ -473,13 +492,14 @@
             _currentColumn++;
 
             // close the last cell
-            addContent("</td>");
+            _tdRenderer.doEndTag(_appender);
 
             // new row; close last row
             if(_currentColumn == _columns) {
                 _currentRow++;
                 _currentColumn = 0;
-                addContent("</tr>\n");
+                _trRenderer.doEndTag(_appender);
+                _appender.append("\n");
             }
 
             // end
@@ -487,7 +507,8 @@
                 return SKIP_BODY;
 
             if(_currentColumn == 0)
-                addContent((renderRowTag()));
+                renderRowTag(_appender, _trState != null ? _trState : 
TR_STATE);
+                //addContent((renderRowTag()));
 
             if(_verticalRepeat)
                 haveNext = ensureItem(_currentColumn * _rows + _currentRow, 
_dataList);
@@ -498,11 +519,18 @@
                 LOGGER.debug("missing next at location (" + _currentRow + ", " 
+ _currentColumn + ")");
 
                 // render empty cell
+                renderCellTag(_appender, computeStyleIndex(_currentRow,  
_currentColumn)) ;
+                _appender.append("&nbsp;");
+/*
                 addContent(renderCellTag(computeStyleIndex(_currentRow, 
_currentColumn)));
                 addContent("&nbsp;");
+*/
             }
             else {
+                renderCellTag(_appender, computeStyleIndex(_currentRow,  
_currentColumn)) ;
+/*
                 addContent(renderCellTag(computeStyleIndex(_currentRow, 
_currentColumn)));
+*/
                 return EVAL_BODY_AGAIN;
             }
         }
@@ -523,14 +551,12 @@
             reportErrors();
         }
         else if(_valid) {
-            addContent("</table>");
-            write(getContent());
+            _tableRenderer.doEndTag(_appender);
+            write(_sb.toString());
         }
 
         DataAccessProviderStack.removeDataAccessProvider(pageContext);
 
-        pageContext.removeAttribute("container");
-
         return EVAL_PAGE;
     }
 
@@ -615,10 +641,19 @@
         _verticalRepeat = false;
         _dataList = null;
         _currentItem = null;
-        _styleContext = new CellRepeaterStyleBean();
         _valid = true;
-        _contentBuffer = null;
         _dataSource = null;
+
+        if(_tdState != null)
+            _tdState.clear();
+        if(_trState != null)
+            _trState = null;
+        if(_tableState != null)
+            _tableState = null;
+
+        _tableRenderer = null;
+        _tdRenderer = null;
+        _trRenderer = null;
     }
 
     private void reportBasicError(String message)
@@ -663,18 +698,26 @@
         }
     }
 
-    private final String renderTableTag() {
+    private final void renderTableTag(AbstractRenderAppender appender, 
TableTag.State tableState) {
+        if(tableState == null)
+            tableState = TABLE_STATE;
+        _tableRenderer.doStartTag(appender, tableState);
+/*
         if(_styleContext == null)
             return "<table>";
 
         InternalStringBuilder buf = new InternalStringBuilder("<table");
         buf.append(_styleContext.renderTableStyle());
         buf.append(">");
-
         return buf.toString();
+*/
     }
 
-    private final String renderRowTag() {
+    private final void renderRowTag(AbstractRenderAppender appender, 
TrTag.State trState) {
+        if(trState == null)
+            trState = TR_STATE;
+        _trRenderer.doStartTag(appender, trState);
+/*
         if(_styleContext == null)
             return "<tr>";
 
@@ -683,9 +726,23 @@
         buf.append(">");
 
         return buf.toString();
+*/
     }
 
-    private final String renderCellTag(int index) {
+    private final void renderCellTag(AbstractRenderAppender appender, int 
index) {
+        TdTag.State tdState = TD_STATE;
+        /* todo: need to clear the TdTag.State here rather than recreate */
+        if(_cellClass != null) {
+            tdState = new TdTag.State();
+            if(index % 2 == 0)
+                tdState.styleClass = _cellClass;
+            else tdState.styleClass = (_altCellClass != null ? _altCellClass : 
_cellClass);
+        }
+
+        _tdRenderer.doStartTag(appender, tdState);
+    }
+
+/*
         if(_styleContext == null)
             return "<td>";
 
@@ -697,7 +754,7 @@
         buf.append(">");
 
         return buf.toString();
-    }
+*/
 
     private final int computeStyleIndex(int r, int c) {
         return c + (r % 2);


Reply via email to