Author: nbelaevski
Date: 2010-05-18 13:55:44 -0400 (Tue, 18 May 2010)
New Revision: 17102
Added:
root/core/trunk/api/src/main/java/org/richfaces/component/MetaComponentEncoder.java
root/core/trunk/api/src/main/java/org/richfaces/event/PreRenderMetaComponentEvent.java
Modified:
root/core/trunk/api/src/main/java/org/richfaces/renderkit/MetaComponentRenderer.java
root/core/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java
root/core/trunk/impl/src/main/java/org/richfaces/component/UISequence.java
root/core/trunk/impl/src/test/java/org/richfaces/context/AjaxTableComponentImpl.java
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/browse/RF-7856
Added:
root/core/trunk/api/src/main/java/org/richfaces/component/MetaComponentEncoder.java
===================================================================
--- root/core/trunk/api/src/main/java/org/richfaces/component/MetaComponentEncoder.java
(rev 0)
+++
root/core/trunk/api/src/main/java/org/richfaces/component/MetaComponentEncoder.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+import java.io.IOException;
+
+import javax.faces.context.FacesContext;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface MetaComponentEncoder {
+
+ public void encodeMetaComponent(FacesContext context, String metaComponentId) throws
IOException;
+
+}
Added:
root/core/trunk/api/src/main/java/org/richfaces/event/PreRenderMetaComponentEvent.java
===================================================================
---
root/core/trunk/api/src/main/java/org/richfaces/event/PreRenderMetaComponentEvent.java
(rev 0)
+++
root/core/trunk/api/src/main/java/org/richfaces/event/PreRenderMetaComponentEvent.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.event;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.PreRenderComponentEvent;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class PreRenderMetaComponentEvent extends PreRenderComponentEvent {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 5755546878106468912L;
+
+ private String metaComponentId;
+
+ public PreRenderMetaComponentEvent(UIComponent component, String metaComponentId) {
+ super(component);
+
+ this.metaComponentId = metaComponentId;
+ }
+
+ /**
+ * @return the metaComponentId
+ */
+ public String getMetaComponentId() {
+ return metaComponentId;
+ }
+}
Modified:
root/core/trunk/api/src/main/java/org/richfaces/renderkit/MetaComponentRenderer.java
===================================================================
---
root/core/trunk/api/src/main/java/org/richfaces/renderkit/MetaComponentRenderer.java 2010-05-18
15:27:51 UTC (rev 17101)
+++
root/core/trunk/api/src/main/java/org/richfaces/renderkit/MetaComponentRenderer.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -32,6 +32,7 @@
*/
public interface MetaComponentRenderer {
- public void encodeMetaComponent(FacesContext context, UIComponent component) throws
IOException;
+ public void encodeMetaComponent(FacesContext context, UIComponent component, String
metaComponentId)
+ throws IOException;
}
Modified: root/core/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java
===================================================================
---
root/core/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-05-18
15:27:51 UTC (rev 17101)
+++
root/core/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -54,9 +54,13 @@
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ComponentSystemEvent;
+import javax.faces.event.ComponentSystemEventListener;
import javax.faces.event.FacesEvent;
+import javax.faces.event.ListenerFor;
import javax.faces.event.PhaseId;
import javax.faces.event.PostValidateEvent;
+import javax.faces.event.PreRenderComponentEvent;
import javax.faces.event.PreValidateEvent;
import javax.faces.render.Renderer;
@@ -77,8 +81,9 @@
*
* @author shura
*/
+@ListenerFor(systemEventClass = PreRenderComponentEvent.class)
public abstract class UIDataAdaptor extends UIComponentBase implements NamingContainer,
- UniqueIdVendor, IterationStateHolder {
+ UniqueIdVendor, IterationStateHolder, ComponentSystemEventListener {
/**
* <p>The standard component family for this component.</p>
@@ -1086,12 +1091,6 @@
}
@Override
- public void encodeBegin(FacesContext context) throws IOException {
- preEncodeBegin(context);
- super.encodeBegin(context);
- }
-
- @Override
public void markInitialState() {
super.markInitialState();
@@ -1325,13 +1324,8 @@
return !idsToVisit.isEmpty();
}
- private boolean visitComponents(Iterator<UIComponent> components, VisitContext
context, VisitCallback callback,
- boolean resetKeyBeforeVisit) {
+ private boolean visitComponents(Iterator<UIComponent> components, VisitContext
context, VisitCallback callback) {
- if (resetKeyBeforeVisit) {
- setRowKey(context.getFacesContext(), null);
- }
-
while (components.hasNext()) {
UIComponent nextChild = components.next();
@@ -1343,14 +1337,14 @@
return false;
}
- protected boolean visitFixedChildren(VisitContext visitContext, VisitCallback
callback, boolean resetKeyBeforeVisit) {
+ protected boolean visitFixedChildren(VisitContext visitContext, VisitCallback
callback) {
- return visitComponents(fixedChildren(), visitContext, callback,
resetKeyBeforeVisit);
+ return visitComponents(fixedChildren(), visitContext, callback);
}
- protected boolean visitDataChildren(VisitContext visitContext, VisitCallback
callback, boolean resetKeyBeforeVisit) {
+ protected boolean visitDataChildren(VisitContext visitContext, VisitCallback
callback, boolean visitRows) {
- if (resetKeyBeforeVisit) {
+ if (visitRows) {
FacesContext facesContext = visitContext.getFacesContext();
DataVisitorForVisitTree dataVisitor = new DataVisitorForVisitTree(callback,
visitContext);
@@ -1358,7 +1352,7 @@
return dataVisitor.getVisitResult();
} else {
- return visitComponents(dataChildren(), visitContext, callback, false);
+ return visitComponents(dataChildren(), visitContext, callback);
}
}
@@ -1403,7 +1397,11 @@
// Visit children, short-circuiting as necessary
if ((result == VisitResult.ACCEPT) && doVisitChildren(visitContext,
visitRows)) {
- if (visitFixedChildren(visitContext, callback, visitRows)) {
+ if (visitRows) {
+ setRowKey(facesContext, null);
+ }
+
+ if (visitFixedChildren(visitContext, callback)) {
return true;
}
@@ -1418,7 +1416,10 @@
VisitContext directChildrenVisitContext =
extendedVisitContext.createNamingContainerVisitContext(this, directSubtreeIdsToVisit);
- if (visitFixedChildren(directChildrenVisitContext,
STUB_CALLBACK, visitRows)) {
+ if (visitRows) {
+ setRowKey(facesContext, null);
+ }
+ if (visitFixedChildren(directChildrenVisitContext,
STUB_CALLBACK)) {
return false;
}
}
@@ -1499,4 +1500,17 @@
public abstract void processComponent(FacesContext context, UIComponent c, Object
argument);
}
+
+ @Override
+ public void processEvent(ComponentSystemEvent event) throws AbortProcessingException
{
+ super.processEvent(event);
+
+ if (event instanceof PreRenderComponentEvent) {
+ preEncodeBegin(getFacesContext());
+ }
+ }
+
+ protected DataComponentState getLocalComponentState() {
+ return componentState;
+ }
}
Modified: root/core/trunk/impl/src/main/java/org/richfaces/component/UISequence.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/richfaces/component/UISequence.java 2010-05-18
15:27:51 UTC (rev 17101)
+++ root/core/trunk/impl/src/main/java/org/richfaces/component/UISequence.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -30,7 +30,6 @@
import javax.el.ValueExpression;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
-import javax.faces.el.ValueBinding;
import javax.faces.model.ArrayDataModel;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
@@ -57,11 +56,18 @@
first, rows, value, iterationStatusVar
}
- private void updateSequenceState(SequenceState state) {
+ protected void updateState(SequenceState state) {
state.setFirst(getActualFirst());
state.setRows(getActualRows());
}
+ protected void updateState() {
+ DataComponentState localState = getLocalComponentState();
+ if (localState instanceof SequenceState) {
+ updateState((SequenceState) localState);
+ }
+ }
+
protected int getActualFirst() {
return getFirst();
}
@@ -114,7 +120,7 @@
protected DataComponentState createComponentState() {
SequenceState state = new SequenceState();
- updateSequenceState(state);
+ updateState(state);
return state;
}
@@ -138,6 +144,7 @@
public void setFirst(int first) {
getStateHelper().put(PropertyKeys.first, first);
+ updateState();
}
public int getRows() {
@@ -146,6 +153,7 @@
public void setRows(int rows) {
getStateHelper().put(PropertyKeys.rows, rows);
+ updateState();
}
public Object getValue() {
@@ -234,10 +242,13 @@
}
}
+ @SuppressWarnings("deprecation")
@Override
- public void setValueBinding(String name, ValueBinding binding) {
+ public void setValueBinding(String name, javax.faces.el.ValueBinding binding) {
if ("value".equals(name)) {
resetDataModel();
+ } else if ("first".equals(name) || "rows".equals(name)) {
+ updateState();
}
super.setValueBinding(name, binding);
@@ -247,6 +258,8 @@
public void setValueExpression(String name, ValueExpression binding) {
if ("value".equals(name)) {
resetDataModel();
+ } else if ("first".equals(name) || "rows".equals(name)) {
+ updateState();
}
super.setValueExpression(name, binding);
@@ -256,9 +269,6 @@
protected void preEncodeBegin(FacesContext context) {
super.preEncodeBegin(context);
- DataComponentState componentState = getComponentState();
- if (componentState instanceof SequenceState) {
- updateSequenceState((SequenceState) componentState);
- }
+ updateState();
}
}
Modified:
root/core/trunk/impl/src/test/java/org/richfaces/context/AjaxTableComponentImpl.java
===================================================================
---
root/core/trunk/impl/src/test/java/org/richfaces/context/AjaxTableComponentImpl.java 2010-05-18
15:27:51 UTC (rev 17101)
+++
root/core/trunk/impl/src/test/java/org/richfaces/context/AjaxTableComponentImpl.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -52,17 +52,11 @@
}
@Override
- protected boolean visitFixedChildren(VisitContext visitContext, VisitCallback
callback,
- boolean resetKeyBeforeVisit) {
+ protected boolean visitFixedChildren(VisitContext visitContext, VisitCallback
callback) {
if (visitContext instanceof ExtendedVisitContext) {
ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext)
visitContext;
- //TODO - review
- if (resetKeyBeforeVisit) {
- setRowKey(visitContext.getFacesContext(), null);
- }
-
if (visitMetaComponent("header", extendedVisitContext, callback))
{
return true;
}
@@ -73,7 +67,7 @@
return false;
} else {
- return super.visitFixedChildren(visitContext, callback,
resetKeyBeforeVisit);
+ return super.visitFixedChildren(visitContext, callback);
}
}
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-18
15:27:51 UTC (rev 17101)
+++
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -27,6 +27,7 @@
import java.util.Map;
import java.util.Set;
+import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.component.visit.VisitCallback;
import javax.faces.component.visit.VisitContext;
@@ -94,7 +95,7 @@
Renderer renderer = getRenderer(context);
try {
- ((MetaComponentRenderer) renderer).encodeMetaComponent(context,
target);
+ ((MetaComponentRenderer) renderer).encodeMetaComponent(context,
target, metaComponentId);
} catch (IOException e) {
if (RENDERKIT_LOG.isErrorEnabled()) {
RENDERKIT_LOG.error(e.getMessage());
@@ -139,15 +140,12 @@
* @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) {
+ protected boolean visitFixedChildren(VisitContext visitContext, VisitCallback
callback) {
if (visitContext instanceof ExtendedVisitContext) {
ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext)
visitContext;
if (extendedVisitContext.getVisitMode() == ExtendedVisitContextMode.RENDER)
{
- if (resetKeyBeforeVisit) {
- setRowKey(visitContext.getFacesContext(), null);
- }
-
+ //TODO nick - call preEncodeBegin(...) and emit PreRenderEvent
MetaComponentRenderVisitCallback rendererCallback = new
MetaComponentRenderVisitCallback(callback);
VisitResult visitResult;
@@ -174,7 +172,7 @@
}
}
- return super.visitFixedChildren(visitContext, callback, resetKeyBeforeVisit);
+ return super.visitFixedChildren(visitContext, callback);
}
@Override
@@ -183,6 +181,7 @@
ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext)
visitContext;
if (extendedVisitContext.getVisitMode() == ExtendedVisitContextMode.RENDER)
{
+ //TODO nick - call preEncodeBegin(...) and emit PreRenderEvent
if (resetKeyBeforeVisit) {
setRowKey(visitContext.getFacesContext(), null);
}
@@ -258,6 +257,8 @@
public void setClientFirst(int clientFirst) {
getStateHelper().put(PropertyKeys.clientFirst, clientFirst);
+
+ updateState();
}
@Override
@@ -272,5 +273,28 @@
public void setClientRows(int clientRows) {
getStateHelper().put(PropertyKeys.clientRows, clientRows);
+
+ updateState();
}
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void setValueBinding(String name, javax.faces.el.ValueBinding binding) {
+ super.setValueBinding(name, binding);
+
+ //TODO nick - clientFirst?
+ if ("clientRows".equals(name)) {
+ updateState();
+ }
+ }
+
+ @Override
+ public void setValueExpression(String name, ValueExpression binding) {
+ super.setValueExpression(name, binding);
+
+ //TODO nick - clientFirst?
+ if ("clientRows".equals(name)) {
+ updateState();
+ }
+ }
}
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-18
15:27:51 UTC (rev 17101)
+++
root/ui-sandbox/tables/trunk/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-05-18
17:55:44 UTC (rev 17102)
@@ -53,7 +53,6 @@
import org.richfaces.component.UIDataTableBase;
import org.richfaces.component.UIExtendedDataTable;
import org.richfaces.component.util.HtmlUtil;
-import org.richfaces.context.ExtendedVisitContext;
@ResourceDependencies({ @ResourceDependency(library = "javax.faces", name =
"jsf-uncompressed.js"),
@ResourceDependency(name = "jquery.js"), @ResourceDependency(name =
"jquery.position.js"),
@@ -64,7 +63,7 @@
private static enum PartName {
frozen, normal
}
-
+
private class Part {
private PartName name;
private List<UIComponent> columns;
@@ -82,21 +81,17 @@
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;
@@ -155,332 +150,15 @@
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();) {
- //TODO nick - review this part of code
- 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;
}
- public void encodeMetaComponent(FacesContext context, UIComponent component) throws
IOException {
- String metaComponentId = (String)
context.getAttributes().get(ExtendedVisitContext.META_COMPONENT_ID);
+ public void encodeMetaComponent(FacesContext context, UIComponent component, String
metaComponentId)
+ throws IOException {
if (UIExtendedDataTable.SCROLL.equals(metaComponentId)) {
final PartialResponseWriter writer =
context.getPartialViewContext().getPartialResponseWriter();
@@ -567,9 +245,7 @@
table.restoreOrigValue(context);
}
} else {
- RendererState state = createRowHolder(context, component);
- state.setElement(metaComponentId);
- partialTableEncoder.encode(state);
+ throw new IllegalArgumentException("Unsupported metaComponentIdentifier:
" + metaComponentId);
}
}
@@ -581,6 +257,12 @@
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);
+ }
}
@@ -598,22 +280,21 @@
table.setRowKey(context, null);
RendererState state = createRowHolder(context, table);
encodeStyle(state);
-
- state.setElement(UIExtendedDataTable.HEADER);
- fullTableEncoder.encode(state);
-
- state.setElement(UIExtendedDataTable.BODY);
- fullTableEncoder.encode(state);
-
- state.setElement(UIExtendedDataTable.FOOTER);
- fullTableEncoder.encode(state);
-
+ encodeHeaderOrFooter(state, "header");
+ encodeBody(state);
+ encodeHeaderOrFooter(state, "footer");
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);
@@ -702,6 +383,149 @@
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();
@@ -732,6 +556,7 @@
writer.endElement(HTML.TR_ELEMENT);
}
+
@Override
protected void doDecode(FacesContext context, UIComponent component) {
super.doDecode(context, component);