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 <netui...> tags in the body of
<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(" ");
+ _tdRenderer.doEndTag(_appender);
+/*
addContent(" ");
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(" ");
+/*
addContent(renderCellTag(computeStyleIndex(_currentRow,
_currentColumn)));
addContent(" ");
+*/
}
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);