Author: nbelaevski
Date: 2010-05-11 20:07:47 -0400 (Tue, 11 May 2010)
New Revision: 16997
Modified:
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
Log:
https://jira.jboss.org/jira/browse/RF-8630
Fixed wrong rendering (missing TBODY element)
Modified:
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java
===================================================================
---
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-05-11
23:50:13 UTC (rev 16996)
+++
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-05-12
00:07:47 UTC (rev 16997)
@@ -23,7 +23,9 @@
package org.richfaces.component;
import java.io.IOException;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import javax.faces.component.UIComponent;
import javax.faces.component.visit.VisitCallback;
@@ -32,7 +34,6 @@
import javax.faces.context.FacesContext;
import javax.faces.render.Renderer;
-import org.ajax4jsf.model.DataComponentState;
import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.Range;
import org.richfaces.context.ExtendedVisitContext;
@@ -46,14 +47,27 @@
* @author Anton Belevich
*
*/
-public class UIExtendedDataTable extends UIDataTableBase {
+public class UIExtendedDataTable extends UIDataTableBase implements MetaComponentResolver
{
public static final String SCROLL = "scroll";
+ public static final String HEADER = "header";
+ public static final String FOOTER = "footer";
+ public static final String BODY = "body";
+
public static final String SUBMITTED_CLIENT_FIRST =
"submittedClientFirst";
public static final String OLD_CLIENT_FIRST = "oldClientFirst";
private static final Logger RENDERKIT_LOG = RichfacesLogger.RENDERKIT.getLogger();
+ private static final Set<String> SUPPORTED_META_COMPONENTS = new
HashSet<String>();
+
+ static {
+ SUPPORTED_META_COMPONENTS.add(SCROLL);
+ SUPPORTED_META_COMPONENTS.add(HEADER);
+ SUPPORTED_META_COMPONENTS.add(FOOTER);
+ SUPPORTED_META_COMPONENTS.add(BODY);
+ }
+
private final class MetaComponentRenderVisitCallback implements VisitCallback {
private VisitCallback delegateCallback;
@@ -67,12 +81,16 @@
public VisitResult visit(VisitContext visitContext, UIComponent target) {
if (UIExtendedDataTable.this.equals(target)) {
FacesContext context = visitContext.getFacesContext();
- if
(SCROLL.equals(context.getAttributes().get(ExtendedVisitContext.META_COMPONENT_ID))) {
- Map<String, Object> attributes = getAttributes();
- Integer submittedClientFirst = (Integer)
attributes.remove(SUBMITTED_CLIENT_FIRST);
- if (submittedClientFirst != null) {
- attributes.put(OLD_CLIENT_FIRST, getClientFirst());
- setClientFirst(submittedClientFirst);
+ String metaComponentId = (String)
context.getAttributes().get(ExtendedVisitContext.META_COMPONENT_ID);
+ if (SUPPORTED_META_COMPONENTS.contains(metaComponentId)) {
+
+ if (SCROLL.equals(metaComponentId)) {
+ Map<String, Object> attributes = getAttributes();
+ Integer submittedClientFirst = (Integer)
attributes.remove(SUBMITTED_CLIENT_FIRST);
+ if (submittedClientFirst != null) {
+ attributes.put(OLD_CLIENT_FIRST, getClientFirst());
+ setClientFirst(submittedClientFirst);
+ }
}
Renderer renderer = getRenderer(context);
@@ -100,6 +118,68 @@
}
@Override
+ public String resolveClientId(FacesContext facesContext, UIComponent
contextComponent, String metaComponentId) {
+ if (SUPPORTED_META_COMPONENTS.contains(metaComponentId)) {
+ Object oldRowKey = getRowKey();
+
+ try {
+ setRowKey(facesContext, null);
+ return getClientId(facesContext) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + metaComponentId;
+ } finally {
+ try {
+ setRowKey(facesContext, oldRowKey);
+ } catch (Exception e) {
+ RENDERKIT_LOG.error(e.getMessage(), e);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see
org.richfaces.component.UIDataAdaptor#visitFixedChildren(javax.faces.component.visit.VisitContext,
javax.faces.component.visit.VisitCallback, boolean)
+ */
+ @Override
+ protected boolean visitFixedChildren(VisitContext visitContext, VisitCallback
callback, boolean resetKeyBeforeVisit) {
+ if (visitContext instanceof ExtendedVisitContext) {
+ ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext)
visitContext;
+
+ if (extendedVisitContext.getVisitMode() == ExtendedVisitContextMode.RENDER)
{
+ if (resetKeyBeforeVisit) {
+ setRowKey(visitContext.getFacesContext(), null);
+ }
+
+ MetaComponentRenderVisitCallback rendererCallback = new
MetaComponentRenderVisitCallback(callback);
+
+ VisitResult visitResult;
+
+ visitResult = extendedVisitContext.invokeMetaComponentVisitCallback(this,
rendererCallback, HEADER);
+
+ if (visitResult == VisitResult.ACCEPT) {
+ //TODO nick - visit header?
+ } else if (visitResult == VisitResult.COMPLETE) {
+ return true;
+ }
+
+ visitResult = extendedVisitContext.invokeMetaComponentVisitCallback(this,
rendererCallback, FOOTER);
+
+ if (visitResult == VisitResult.ACCEPT) {
+ //TODO nick - visit footer?
+ } else if (visitResult == VisitResult.COMPLETE) {
+ return true;
+ }
+
+ if (visitResult == VisitResult.REJECT) {
+ return false;
+ }
+ }
+ }
+
+ return super.visitFixedChildren(visitContext, callback, resetKeyBeforeVisit);
+ }
+
+ @Override
protected boolean visitDataChildren(VisitContext visitContext, final VisitCallback
callback, boolean resetKeyBeforeVisit) {
if (visitContext instanceof ExtendedVisitContext) {
ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext)
visitContext;
@@ -109,12 +189,31 @@
setRowKey(visitContext.getFacesContext(), null);
}
- VisitResult result =
extendedVisitContext.invokeMetaComponentVisitCallback(this,
- new MetaComponentRenderVisitCallback(callback), SCROLL);
+ MetaComponentRenderVisitCallback rendererCallback = new
MetaComponentRenderVisitCallback(callback);
+
+ VisitResult result;
- if (result != VisitResult.ACCEPT) {
- return result == VisitResult.COMPLETE;
+ result = extendedVisitContext.invokeMetaComponentVisitCallback(this,
rendererCallback, SCROLL);
+
+ if (result == VisitResult.ACCEPT) {
+ //TODO nick - visit scroll?
+ } else if (result == VisitResult.COMPLETE) {
+ return true;
}
+
+ //TODO nick - scroll vs body?
+
+ result = extendedVisitContext.invokeMetaComponentVisitCallback(this,
rendererCallback, BODY);
+
+ if (result == VisitResult.ACCEPT) {
+ //TODO nick - visit body?
+ } else if (result == VisitResult.COMPLETE) {
+ return true;
+ }
+
+ if (result == VisitResult.REJECT) {
+ return false;
+ }
}
}
Modified:
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
===================================================================
---
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-05-11
23:50:13 UTC (rev 16996)
+++
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-05-12
00:07:47 UTC (rev 16997)
@@ -64,7 +64,7 @@
private static enum PartName {
frozen, normal
}
-
+
private class Part {
private PartName name;
private List<UIComponent> columns;
@@ -82,17 +82,21 @@
return columns;
}
+ public boolean hasColumns() {
+ return !columns.isEmpty();
+ }
}
private class RendererState extends RowHolderBase{
private UIDataTableBase table;
private List<Part> parts;
+
private Part current;
+
private Iterator<Part> partIterator;
+ private String element;
-
-
public RendererState(FacesContext context, UIDataTableBase table) {
super(context);
this.table = table;
@@ -151,8 +155,324 @@
return partIterator.hasNext();
}
+ public void setElement(String element) {
+ this.element = element;
+ }
+
+ public String getElement() {
+ return element;
+ }
}
+ private abstract class TableEncoder {
+ final void encodeTableFacets(RendererState state) throws IOException {
+ FacesContext context = state.getContext();
+ UIDataTableBase table = state.getRow();
+ String facetName = state.getElement();
+
+ UIComponent facet = table.getFacet(facetName);
+ if (facet != null && facet.isRendered()) {
+ String facetId = table.getClientId(context) + ":" + facetName +
"Facet";
+
+ encodeStartUpdate(context, facetId);
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement(HTML.DIV_ELEM, facet);
+ writer.writeAttribute(HTML.ID_ATTRIBUTE, facetId, null);
+ facet.encodeAll(context);
+ writer.endElement(HTML.DIV_ELEM);
+
+ encodeEndUpdate(context);
+ }
+ }
+
+ final void encodeColumnFacets(RendererState state) throws IOException {
+ UIDataTableBase table = state.getRow();
+ String facetName = state.getElement();
+
+ if (table.isColumnFacetPresent(facetName)) {
+ encodeColumnFacetsProlog(state);
+ for (state.startIterate(); state.hasNextPart();) {
+ state.nextPart();
+ encodeColumnFacetsPart(state);
+ }
+
+ encodeColumnFacetsEpilog(state);
+ }
+ }
+
+ final void encodeColumnFacetsPart(RendererState state) throws IOException {
+ Part part = state.getPart();
+ if (part.hasColumns()) {
+ encodeColumnPartProlog(state);
+ encodeColumnPart(state);
+ encodeColumnPartEpilog(state);
+ }
+ }
+
+ final void encodeColumnPart(RendererState state) throws IOException {
+ FacesContext context = state.getContext();
+ UIDataTableBase table = state.getRow();
+ ResponseWriter writer = context.getResponseWriter();
+ Part part = state.getPart();
+ Iterator<UIComponent> columns = part.getColumns().iterator();
+ String facetName = state.getElement();
+
+ String partElementId = getPartElementId(context, table, part.getName(),
facetName);
+
+ encodeStartUpdate(context, partElementId);
+
+ writer.startElement(HTML.TABLE_ELEMENT, table);
+ writer.writeAttribute(HTML.ID_ATTRIBUTE, partElementId, null);
+ writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
+ writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
+ writer.startElement(HTML.TBOBY_ELEMENT, table);
+ writer.startElement(HTML.TR_ELEMENT, table);
+ while (columns.hasNext()) {
+ UIComponent column = columns.next();
+
+ if (column.isRendered()) {
+
+ String classAttribute = facetName + "Class";
+ writer.startElement(HTML.TD_ELEM, column);
+ if ("header".equals(facetName)) {
+ writer.startElement(HTML.DIV_ELEM, column);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-resizer-holder rich-extable-cell-width-"
+ + column.getId(), null);
+ writer.startElement(HTML.DIV_ELEM, column);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-resizer", null);
+ writer.endElement(HTML.DIV_ELEM);
+ writer.endElement(HTML.DIV_ELEM);
+ }
+ writer.startElement(HTML.DIV_ELEM, column);
+ writer
+ .writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rich-extable-" + facetName + "-cell",
+ "rich-extable-cell-width-" + column.getId(),
(String) column.getAttributes().get(classAttribute)),
+ null);
+ writer.startElement(HTML.DIV_ELEM, column);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-"
+ facetName + "-cell-content", null);
+ UIComponent facet = column.getFacet(facetName);
+ if (facet != null && facet.isRendered()) {
+ facet.encodeAll(context);
+ }
+ writer.endElement(HTML.DIV_ELEM);
+ writer.endElement(HTML.DIV_ELEM);
+ writer.endElement(HTML.TD_ELEM);
+ }
+ }
+ writer.endElement(HTML.TR_ELEMENT);
+ writer.endElement(HTML.TBOBY_ELEMENT);
+ writer.endElement(HTML.TABLE_ELEMENT);
+
+ encodeEndUpdate(context);
+ }
+
+ final void encodeBody(RendererState state) throws IOException {
+ FacesContext context = state.getContext();
+ ResponseWriter writer = context.getResponseWriter();
+ UIDataTableBase table = state.getRow();
+ String bodyElementId = table.getClientId(context) + ":b";
+
+ encodeStartUpdate(context, bodyElementId);
+
+ writer.startElement(HTML.DIV_ELEM, table);
+ writer.writeAttribute(HTML.ID_ATTRIBUTE, bodyElementId, null);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-body",
null);
+ if (table.getRowCount() == 0) {
+ UIComponent facet = table.getFacet("noData");
+ if (facet != null && facet.isRendered()) {
+ facet.encodeAll(context);
+ } else {
+ Object noDataLabel =
table.getAttributes().get("noDataLabel");
+ if (noDataLabel != null) {
+ writer.writeText(noDataLabel, "noDataLabel");
+ }
+ }
+ } else {
+ table.getAttributes().put("clientFirst", 0);
+ writer.startElement(HTML.DIV_ELEM, table);
+ writer.startElement(HTML.DIV_ELEM, table);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-spacer", null);
+ writer.endElement(HTML.DIV_ELEM);
+ writer.startElement(HTML.TABLE_ELEMENT, table);
+ writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
+ writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
+ writer.startElement(HTML.TBOBY_ELEMENT, table);
+ writer.startElement(HTML.TR_ELEMENT, table);
+ for (state.startIterate(); state.hasNextPart();) {
+ writer.startElement(HTML.TD_ELEM, table);
+ writer.startElement(HTML.DIV_ELEM, table);
+ PartName partName = state.nextPart().getName();
+ if (PartName.normal.equals(partName)) {
+ writer.writeAttribute(HTML.ID_ATTRIBUTE,
table.getClientId(context) + ":body", null);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-part rich-extable-part-width", null);
+ }
+ writer.startElement(HTML.TABLE_ELEMENT, table);
+ writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0",
null);
+ writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0",
null);
+ writer.startElement(HTML.TBOBY_ELEMENT, table);
+ writer.writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":tb"
+ + partName.toString().charAt(0), null);
+ encodeRows(state);
+ writer.endElement(HTML.TBOBY_ELEMENT);
+ writer.endElement(HTML.TABLE_ELEMENT);
+ writer.endElement(HTML.DIV_ELEM);
+ writer.endElement(HTML.TD_ELEM);
+ }
+ writer.endElement(HTML.TR_ELEMENT);
+ writer.endElement(HTML.TBOBY_ELEMENT);
+ writer.endElement(HTML.TABLE_ELEMENT);
+ writer.endElement(HTML.DIV_ELEM);
+ }
+ writer.endElement(HTML.DIV_ELEM);
+
+ encodeEndUpdate(context);
+ }
+
+ private String getPartElementId(FacesContext context, UIComponent table, PartName
partName, String name) {
+ //TODO nick - better id is necessary here
+ return table.getClientId(context) + ":" + partName + name +
"Table";
+ }
+
+ public void encode(RendererState state) throws IOException {
+ String element = state.getElement();
+
+ if (UIExtendedDataTable.HEADER.equals(element)) {
+ encodeTableFacets(state);
+ encodeColumnFacets(state);
+ } else if (UIExtendedDataTable.FOOTER.equals(element)) {
+ encodeColumnFacets(state);
+ encodeTableFacets(state);
+ } else if (UIExtendedDataTable.BODY.equals(element)) {
+ encodeBody(state);
+ } else {
+ throw new IllegalArgumentException(element);
+ }
+ }
+
+ public abstract void encodeColumnFacetsProlog(RendererState state) throws
IOException;
+
+ public abstract void encodeColumnFacetsEpilog(RendererState state) throws
IOException;
+
+ public abstract void encodeColumnPartProlog(RendererState state) throws
IOException;
+
+ public abstract void encodeColumnPartEpilog(RendererState state) throws
IOException;
+
+ public abstract void encodeStartUpdate(FacesContext context, String targetId)
throws IOException;
+
+ public abstract void encodeEndUpdate(FacesContext context) throws IOException;
+ }
+
+ private class FullTableEncoder extends TableEncoder {
+ @Override
+ public void encodeStartUpdate(FacesContext context, String targetId) throws
IOException {
+ //not applicable
+ }
+
+ @Override
+ public void encodeEndUpdate(FacesContext context) throws IOException {
+ //not applicable
+ }
+
+ @Override
+ public void encodeColumnFacetsProlog(RendererState state) throws IOException {
+ FacesContext context = state.getContext();
+ UIDataTableBase table = state.getRow();
+ String facetName = state.getElement();
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement(HTML.DIV_ELEM, table);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rich-extable-" + facetName, (String) table
+ .getAttributes().get(facetName + "Class")), null);
+ writer.startElement(HTML.TABLE_ELEMENT, table);
+ writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
+ writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
+ writer.startElement(HTML.TBOBY_ELEMENT, table);
+ writer.startElement(HTML.TR_ELEMENT, table);
+ }
+
+ @Override
+ public void encodeColumnFacetsEpilog(RendererState state) throws IOException {
+ ResponseWriter writer = state.getContext().getResponseWriter();
+ writer.endElement(HTML.TR_ELEMENT);
+ writer.endElement(HTML.TBOBY_ELEMENT);
+ writer.endElement(HTML.TABLE_ELEMENT);
+ writer.endElement(HTML.DIV_ELEM);
+ }
+
+ @Override
+ public void encodeColumnPartProlog(RendererState state) throws IOException {
+ FacesContext context = state.getContext();
+ UIDataTableBase table = state.getRow();
+ PartName partName = state.getPart().getName();
+ String facetName = state.getElement();
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement(HTML.TD_ELEM, table);
+ if (PartName.frozen.equals(partName) &&
"footer".equals(facetName)) {
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-footer-align", null);
+ }
+ writer.startElement(HTML.DIV_ELEM, table);
+ if (PartName.frozen.equals(partName)) {
+ if ("header".equals(facetName)) {
+ writer
+ .writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":frozenHeader", null);
+ }
+ } else {
+ writer.writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":" + facetName, null);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable"
+ + ("footer".equals(facetName) ? "-footer" :
"") + "-part rich-extable-part-width", null);
+ }
+ }
+
+ @Override
+ public void encodeColumnPartEpilog(RendererState state) throws IOException {
+ ResponseWriter writer = state.getContext().getResponseWriter();
+ writer.endElement(HTML.DIV_ELEM);
+ writer.endElement(HTML.TD_ELEM);
+ }
+ };
+
+ private class PartialTableEncoder extends TableEncoder {
+
+ @Override
+ public void encodeStartUpdate(FacesContext context, String targetId) throws
IOException {
+ PartialResponseWriter writer =
context.getPartialViewContext().getPartialResponseWriter();
+ writer.startUpdate(targetId);
+ }
+
+ @Override
+ public void encodeEndUpdate(FacesContext context) throws IOException {
+ PartialResponseWriter writer =
context.getPartialViewContext().getPartialResponseWriter();
+ writer.endUpdate();
+ }
+
+ @Override
+ public void encodeColumnFacetsProlog(RendererState state) throws IOException {
+ //not applicable
+ }
+
+ @Override
+ public void encodeColumnFacetsEpilog(RendererState state) throws IOException {
+ //not applicable
+ }
+
+ @Override
+ public void encodeColumnPartProlog(RendererState state) throws IOException {
+ //not applicable
+ }
+
+ @Override
+ public void encodeColumnPartEpilog(RendererState state) throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+ };
+
+ private final TableEncoder fullTableEncoder = new FullTableEncoder();
+
+ private final TableEncoder partialTableEncoder = new PartialTableEncoder();
+
@Override
protected Class<? extends UIComponent> getComponentClass() {
return UIExtendedDataTable.class;
@@ -249,7 +569,9 @@
table.restoreOrigValue(context);
}
} else {
- throw new IllegalArgumentException("Unsupported metaComponentIdentifier:
" + metaComponentId);
+ RendererState state = createRowHolder(context, component);
+ state.setElement(metaComponentId);
+ partialTableEncoder.encode(state);
}
}
@@ -261,12 +583,6 @@
writer.writeAttribute(HTML.ID_ATTRIBUTE, component.getClientId(context), null);
writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rich-extable", (String)
attributes.get("styleClass")), null);
getUtils().writeAttribute(writer, HTML.STYLE_ATTRIBUTE,
attributes.get("style"));
- UIComponent header = component.getFacet("header");
- if (header != null && header.isRendered()) {
- writer.startElement(HTML.DIV_ELEM, component);
- header.encodeAll(context);
- writer.endElement(HTML.DIV_ELEM);
- }
}
@@ -284,21 +600,22 @@
table.setRowKey(context, null);
RendererState state = createRowHolder(context, table);
encodeStyle(state);
- encodeHeaderOrFooter(state, "header");
- encodeBody(state);
- encodeHeaderOrFooter(state, "footer");
+
+ state.setElement(UIExtendedDataTable.HEADER);
+ fullTableEncoder.encode(state);
+
+ state.setElement(UIExtendedDataTable.BODY);
+ fullTableEncoder.encode(state);
+
+ state.setElement(UIExtendedDataTable.FOOTER);
+ fullTableEncoder.encode(state);
+
table.setRowKey(context, key);
table.restoreOrigValue(context);
}
@Override
protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
- UIComponent facet = component.getFacet("footer");
- if (facet != null && facet.isRendered()) {
- writer.startElement(HTML.DIV_ELEM, component);
- facet.encodeAll(context);
- writer.endElement(HTML.DIV_ELEM);
- }
writer.startElement(HTML.DIV_ELEM, component);
writer.writeAttribute(HTML.ID_ATTRIBUTE, component.getClientId(context) +
":d", null);
writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-drag",
null);
@@ -324,6 +641,7 @@
writer.write(" ");
writer.endElement(HTML.TD_ELEM);
writer.endElement(HTML.TR_ELEMENT);
+ writer.endElement(HTML.TBOBY_ELEMENT);
writer.endElement(HTML.TABLE_ELEMENT);
writer.startElement(HTML.DIV_ELEM, component);
writer.writeAttribute(HTML.ID_ATTRIBUTE, component.getClientId(context) +
":rm", null);
@@ -386,149 +704,6 @@
writer.endElement("style");
}
- private void encodeHeaderOrFooter(RendererState state, String name) throws
IOException {
- FacesContext context = state.getContext();
- ResponseWriter writer = context.getResponseWriter();
- UIDataTableBase table = state.getRow();
- if (table.isColumnFacetPresent(name)) {
- writer.startElement(HTML.DIV_ELEM, table);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rich-extable-" + name, (String) table
- .getAttributes().get(name + "Class")), null);
- writer.startElement(HTML.TABLE_ELEMENT, table);
- writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
- writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
- writer.startElement(HTML.TBOBY_ELEMENT, table);
- writer.startElement(HTML.TR_ELEMENT, table);
- for (state.startIterate(); state.hasNextPart();) {
- Part part = state.nextPart();
- PartName partName = part.getName();
- Iterator<UIComponent> columns = part.getColumns().iterator();
- if (columns.hasNext()) {
- writer.startElement(HTML.TD_ELEM, table);
- if (PartName.frozen.equals(partName) &&
"footer".equals(name)) {
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-footer-align", null);
- }
- writer.startElement(HTML.DIV_ELEM, table);
- if (PartName.frozen.equals(partName)) {
- if ("header".equals(name)) {
- writer
- .writeAttribute(HTML.ID_ATTRIBUTE,
table.getClientId(context) + ":frozenHeader", null);
- }
- } else {
- writer.writeAttribute(HTML.ID_ATTRIBUTE,
table.getClientId(context) + ":" + name, null);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable"
- + ("footer".equals(name) ? "-footer" :
"") + "-part rich-extable-part-width", null);
- }
- writer.startElement(HTML.TABLE_ELEMENT, table);
- writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0",
null);
- writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0",
null);
- writer.startElement(HTML.TBOBY_ELEMENT, table);
- writer.startElement(HTML.TR_ELEMENT, table);
- while (columns.hasNext()) {
- encodeHeaderOrFooterCell(context, writer, columns.next(), name);
- }
- writer.endElement(HTML.TR_ELEMENT);
- writer.endElement(HTML.TBOBY_ELEMENT);
- writer.endElement(HTML.TABLE_ELEMENT);
- writer.endElement(HTML.DIV_ELEM);
- writer.endElement(HTML.TD_ELEM);
- }
- }
- writer.endElement(HTML.TR_ELEMENT);
- writer.endElement(HTML.TBOBY_ELEMENT);
- writer.endElement(HTML.TABLE_ELEMENT);
- writer.endElement(HTML.DIV_ELEM);
- }
- }
-
- private void encodeBody(RendererState state) throws IOException {
- FacesContext context = state.getContext();
- ResponseWriter writer = context.getResponseWriter();
- UIDataTableBase table = state.getRow();
- writer.startElement(HTML.DIV_ELEM, table);
- writer.writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":b", null);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-body",
null);
- if (table.getRowCount() == 0) {
- UIComponent facet = table.getFacet("noData");
- if (facet != null && facet.isRendered()) {
- facet.encodeAll(context);
- } else {
- Object noDataLabel = table.getAttributes().get("noDataLabel");
- if (noDataLabel != null) {
- writer.writeText(noDataLabel, "noDataLabel");
- }
- }
- } else {
- table.getAttributes().put("clientFirst", 0);
- writer.startElement(HTML.DIV_ELEM, table);
- writer.startElement(HTML.DIV_ELEM, table);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-spacer",
null);
- writer.endElement(HTML.DIV_ELEM);
- writer.startElement(HTML.TABLE_ELEMENT, table);
- writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
- writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
- writer.startElement(HTML.TBOBY_ELEMENT, table);
- writer.startElement(HTML.TR_ELEMENT, table);
- for (state.startIterate(); state.hasNextPart();) {
- writer.startElement(HTML.TD_ELEM, table);
- writer.startElement(HTML.DIV_ELEM, table);
- PartName partName = state.nextPart().getName();
- if (PartName.normal.equals(partName)) {
- writer.writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":body", null);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-part
rich-extable-part-width", null);
- }
- writer.startElement(HTML.TABLE_ELEMENT, table);
- writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
- writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
- writer.startElement(HTML.TBOBY_ELEMENT, table);
- writer.writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":tb"
- + partName.toString().charAt(0), null);
- encodeRows(state);
- writer.endElement(HTML.TBOBY_ELEMENT);
- writer.endElement(HTML.TABLE_ELEMENT);
- writer.endElement(HTML.DIV_ELEM);
- writer.endElement(HTML.TD_ELEM);
- }
- writer.endElement(HTML.TR_ELEMENT);
- writer.endElement(HTML.TBOBY_ELEMENT);
- writer.endElement(HTML.TABLE_ELEMENT);
- writer.endElement(HTML.DIV_ELEM);
- }
- writer.endElement(HTML.DIV_ELEM);
- }
-
- private void encodeHeaderOrFooterCell(FacesContext context, ResponseWriter writer,
UIComponent column,
- String facetName) throws IOException {
- if (column.isRendered()) {
-
- String classAttribute = facetName + "Class";
- writer.startElement(HTML.TD_ELEM, column);
- if ("header".equals(facetName)) {
- writer.startElement(HTML.DIV_ELEM, column);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-resizer-holder rich-extable-cell-width-"
- + column.getId(), null);
- writer.startElement(HTML.DIV_ELEM, column);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-extable-resizer", null);
- writer.endElement(HTML.DIV_ELEM);
- writer.endElement(HTML.DIV_ELEM);
- }
- writer.startElement(HTML.DIV_ELEM, column);
- writer
- .writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rich-extable-" + facetName + "-cell",
- "rich-extable-cell-width-" + column.getId(), (String)
column.getAttributes().get(classAttribute)),
- null);
- writer.startElement(HTML.DIV_ELEM, column);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-extable-" +
facetName + "-cell-content", null);
- UIComponent facet = column.getFacet(facetName);
- if (facet != null && facet.isRendered()) {
- facet.encodeAll(context);
- }
- writer.endElement(HTML.DIV_ELEM);
- writer.endElement(HTML.DIV_ELEM);
- writer.endElement(HTML.TD_ELEM);
- }
- }
-
@Override
public void encodeRow(RowHolderBase rowHolder) throws IOException {
FacesContext context = rowHolder.getContext();
@@ -559,7 +734,6 @@
writer.endElement(HTML.TR_ELEMENT);
}
-
@Override
protected void doDecode(FacesContext context, UIComponent component) {
super.doDecode(context, component);