Author: abelevich
Date: 2009-12-21 10:19:30 -0500 (Mon, 21 Dec 2009)
New Revision: 16177
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SortingFilteringVisualModel.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SortingFilteringVisualModelImpl.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ColumnGroupRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRowsRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/HeaderEncodeStrategy.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/SubTableRenderer.java
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/config/faces-config.xml
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumn.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumnGroup.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIToggleControl.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractRowsRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractTableRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolder.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolderBase.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java
root/ui-sandbox/trunk/components/tables/ui/src/main/old_configs/component/tables.xml
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/table.css
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml
Log:
add subTable, columnGroup renderers, expand/collapse subTables on AJAX
Modified: root/ui-sandbox/trunk/components/tables/ui/src/main/config/faces-config.xml
===================================================================
--- root/ui-sandbox/trunk/components/tables/ui/src/main/config/faces-config.xml 2009-12-21
07:22:35 UTC (rev 16176)
+++ root/ui-sandbox/trunk/components/tables/ui/src/main/config/faces-config.xml 2009-12-21
15:19:30 UTC (rev 16177)
@@ -49,7 +49,7 @@
</component-extension>
</component>
<component>
- <component-type>org.richfaces.Colgroup</component-type>
+ <component-type>org.richfaces.ColumnGroup</component-type>
<component-class>org.richfaces.component.html.HtmlColumnGroup</component-class>
<component-extension>
<cdk:generate
xmlns:cdk="http://richfaces.org/cdk/extensions">false</cd...
@@ -78,6 +78,16 @@
<renderer-class>org.richfaces.renderkit.DataTableRenderer</renderer-class>
</renderer>
<renderer>
+ <component-family>org.richfaces.SubTable</component-family>
+ <renderer-type>org.richfaces.SubTableRenderer</renderer-type>
+ <renderer-class>org.richfaces.renderkit.SubTableRenderer</renderer-class>
+ </renderer>
+ <renderer>
+ <component-family>org.richfaces.ColumnGroup</component-family>
+ <renderer-type>org.richfaces.ColumnGroupRenderer</renderer-type>
+ <renderer-class>org.richfaces.renderkit.ColumnGroupRenderer</renderer-class>
+ </renderer>
+ <renderer>
<component-family>org.richfaces.Data</component-family>
<renderer-type>org.richfaces.ExtendedDataTableRenderer</renderer-type>
<renderer-class>org.richfaces.renderkit.ExtendedDataTableRenderer</renderer-class>
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumn.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumn.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumn.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -1,7 +1,11 @@
package org.richfaces.component;
+import org.richfaces.model.Ordering;
+
public abstract class UIColumn extends javax.faces.component.UIColumn implements Column
{
+ private Ordering sortOrder;
+
public abstract int getRowspan();
public abstract void setRowspan(int rowspan);
@@ -9,5 +13,12 @@
public abstract int getColspan();
public abstract void setColspan(int colspan);
-
+
+ public Ordering getSortOrder() {
+ return null;
+ }
+
+ public void setSortOrder(Ordering sortOrder) {
+
+ }
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumnGroup.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumnGroup.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIColumnGroup.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -28,7 +28,7 @@
import javax.faces.context.FacesContext;
import org.ajax4jsf.model.DataVisitor;
-import org.richfaces.renderkit.RowHolder;
+import org.richfaces.renderkit.RowHolderBase;
/**
* JSF component class
@@ -36,9 +36,9 @@
*/
public abstract class UIColumnGroup extends UIPanel implements Row, Column {
- public static final String COMPONENT_TYPE = "org.richfaces.Colgroup";
+ public static final String COMPONENT_TYPE = "org.richfaces.ColumnGroup";
- public static final String COMPONENT_FAMILY = "org.richfaces.Colgroup";
+ public static final String COMPONENT_FAMILY = "org.richfaces.ColumnGroup";
public Iterator<UIComponent> columns() {
return new ColumnsIterator(this);
@@ -57,22 +57,16 @@
}
public void walk(FacesContext context, DataVisitor visitor, Object argument) {
- if (!(argument instanceof RowHolder)) {
+ if (!(argument instanceof RowHolderBase)) {
return;
}
visitor.process(context, null, argument);
}
-
- public String getCellSkinClass() {
- return null;
+
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
}
- public String getRowSkinClass() {
- return null;
- }
-
- public String getFirstRowSkinClass() {
- return null;
- }
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -1,11 +1,17 @@
package org.richfaces.component;
+import java.util.Collection;
+
+import javax.el.ELContext;
+import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import org.ajax4jsf.model.DataComponentState;
import org.richfaces.component.state.DataTableState;
import org.richfaces.model.visual.DataTableVisualModel;
+import org.richfaces.model.visual.SortingFilteringVisualModel;
import org.richfaces.model.visual.impl.DataTableVisualModelImpl;
+import org.richfaces.model.visual.impl.SortingFilteringVisualModelImpl;
/**
* @author Anton Belevich
@@ -14,89 +20,179 @@
public abstract class UIDataTable extends UIDataTableBase {
+ private DataTableVisualModel visualModel;
+
+ private String sortMode;
+
+ private Collection<String> sortPriority;
+
enum PropertyKeys {
- visualModel
+ sortingFilteringVisualModel
}
-
+
+ public void setVisualModel(DataTableVisualModel visualModel) {
+ this.visualModel = visualModel;
+ }
+
+ public DataTableState getCurrentComponentState() {
+ return (DataTableState) getComponentState();
+ }
+
+ public void setSortingFilteringVisualModel(SortingFilteringVisualModel
sortingFilteringVisualModel){
+ getStateHelper().put(PropertyKeys.sortingFilteringVisualModel,
sortingFilteringVisualModel);
+ }
+
+ public SortingFilteringVisualModel getSortingFilteringVisualModel(){
+ return
(SortingFilteringVisualModel)getStateHelper().eval(PropertyKeys.sortingFilteringVisualModel);
+ }
+
public DataTableVisualModel getVisualModel() {
- return (DataTableVisualModel) getStateHelper().eval(PropertyKeys.visualModel);
+
+ DataTableState dataTableState = getCurrentComponentState();
+ DataTableVisualModel model = dataTableState.getVisualModel();
+
+ if(model == null) {
+
+ if(visualModel == null) {
+
+ ELContext elContext = getFacesContext().getELContext();
+ ValueExpression modelExpression =
getValueExpression("visualModel");
+
+ if(modelExpression != null) {
+ model = (DataTableVisualModel) modelExpression.getValue(elContext);
+ }
+
+ if(model == null) {
+ model = new DataTableVisualModelImpl();
+
+ if ((modelExpression != null) &&
(!modelExpression.isReadOnly(elContext))) {
+ modelExpression.setValue(elContext, model);
+ }
+ }
+
+ } else {
+ model = visualModel;
+ }
+
+ if(model.getSortingFilteringVisualModel() == null) {
+ model.setSortingFilteringVisualModel(initSortingFilteringVisualModel());
+ }
+ }
+
+ dataTableState.setVisualModel(model);
+
+ return model;
}
-
- public void setVisualModel(DataTableVisualModel dataTableVisualModel) {
- getStateHelper().put(PropertyKeys.visualModel, dataTableVisualModel);
+
+ protected SortingFilteringVisualModel initSortingFilteringVisualModel() {
+ SortingFilteringVisualModel sortingFilteringVisualModel =
getSortingFilteringVisualModel();
+ if(sortingFilteringVisualModel == null) {
+ sortingFilteringVisualModel = new SortingFilteringVisualModelImpl();
+ }
+
+ sortingFilteringVisualModel.setSortMode(sortMode);
+ sortingFilteringVisualModel.setSortPriority(sortPriority);
+
+ return sortingFilteringVisualModel;
}
+
+ public void setSortMode(String sortMode) {
+ this.sortMode = sortMode;
+ }
+
+ public String getSortMode() {
+ return getVisualModel().getSortingFilteringVisualModel().getSortMode();
+ }
+
+ public void setSortPriority(Collection<String> sortPriority){
+ this.sortPriority = sortPriority;
+ }
+
+ public Collection<String> getSortPriority() {
+ return getVisualModel().getSortingFilteringVisualModel().getSortPriority();
+ }
@Override
protected DataComponentState createComponentState() {
- DataTableState state = new DataTableState(getFirst(), getRows());
- DataTableVisualModel model = getVisualModel();
-
- if (model == null) {
- model = new DataTableVisualModelImpl();
- }
- state.setVisualModel(model);
-
- return state;
+ return new DataTableState(getFirst(), getRows());
}
+
+ public UIComponent getCaption() {
+ return getFacet("caption");
+ }
+
+ public String getTableSkinClass() {
+ return "rich-table";
+ }
- public String getCellSkinClass() {
- return "rich-table-cell";
+ public String getCaptionSkinClass() {
+ return "rich-table-caption";
}
+
+ @Override
+ public String getFirstRowSkinClass() {
+ return "rich-table-first-row";
+ }
+ @Override
public String getRowSkinClass() {
return "rich-table-row";
}
+
+ public String getCellSkinClass() {
+ return "rich-table-cell";
+ }
- public String getFirstRowSkinClass() {
- return "rich-table-firstrow";
+ public String getHeaderSkinClass() {
+ return "rich-table-header";
}
-
+
+ @Override
+ public String getHeaderFirstSkinClass() {
+ return "rich-table-header-first";
+ }
+
public String getHeaderCellSkinClass() {
return "rich-table-header-cell";
}
-
- public String getHeaderRowSkinClass() {
- return "rich-table-header-continue";
+
+ public String getColumnHeaderSkinClass() {
+ return "rich-table-subheader";
}
-
- public String getHeaderFirstRowSkinClass() {
- return "rich-table-header";
+
+ @Override
+ public String getColumnHeaderFirstSkinClass() {
+ return "rich-table-subheader-first";
}
public String getColumnHeaderCellSkinClass() {
return "rich-table-subheader-cell";
}
-
- public String getColumnHeaderSkinClass() {
- return "rich-table-subheader";
+
+ public String getColumnFooterSkinClass() {
+ return "rich-table-subfooter";
}
-
+
@Override
- public String getFooterCellSkinClass() {
- return "rich-table-footer-cell";
+ public String getColumnFooterFirstSkinClass() {
+ return "rich-table-subfooter-first";
}
- @Override
- public String getFooterRowSkinClass() {
- return "rich-table-footer-continue";
+ public String getColumnFooterCellSkinClass() {
+ return "rich-table-subfooter-cell";
}
- @Override
- public String getFooterFirstRowSkinClass() {
+ public String getFooterSkinClass() {
return "rich-table-footer";
}
@Override
- public String getColumnFooterCellSkinClass() {
- return "rich-table-subfooter-cell";
+ public String getFooterFirstSkinClass() {
+ return "rich-table-footer-first";
}
- @Override
- public String getColumnFooterSkinClass() {
- return "rich-table-subfooter-cell";
+ public String getFooterCellSkinClass() {
+ return "rich-table-footer-cell";
}
-
- public UIComponent getCaption() {
- return getFacet("caption");
- }
+
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -29,29 +29,41 @@
return getFacet("footer");
}
- public abstract String getHeaderCellSkinClass();
+ @Override
+ public boolean getRendersChildren() {
+ return true;
+ }
+
+ public abstract String getTableSkinClass();
+
+ public abstract String getFirstRowSkinClass();
- public abstract String getHeaderRowSkinClass();
+ public abstract String getRowSkinClass();
+
+ public abstract String getHeaderCellSkinClass();
- public abstract String getHeaderFirstRowSkinClass();
+ public abstract String getHeaderSkinClass();
- public abstract String getColumnHeaderCellSkinClass();
+ public abstract String getHeaderFirstSkinClass();
+
+ public abstract String getColumnHeaderCellSkinClass();
- public abstract String getColumnHeaderSkinClass();
+ public abstract String getColumnHeaderSkinClass();
+
+ public abstract String getColumnHeaderFirstSkinClass();
- public abstract String getFooterCellSkinClass();
+ public abstract String getFooterCellSkinClass();
- public abstract String getFooterRowSkinClass();
+ public abstract String getFooterSkinClass();
+
+ public abstract String getFooterFirstSkinClass();
- public abstract String getFooterFirstRowSkinClass();
+ public abstract String getColumnFooterCellSkinClass();
- public abstract String getColumnFooterCellSkinClass();
+ public abstract String getColumnFooterSkinClass();
+
+ public abstract String getColumnFooterFirstSkinClass();
+
+ public abstract String getCellSkinClass();
- public abstract String getColumnFooterSkinClass();
-
- @Override
- public boolean getRendersChildren() {
- return true;
- }
-
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -21,6 +21,8 @@
package org.richfaces.component;
+import java.io.IOException;
+
import javax.el.ELContext;
import javax.el.MethodExpression;
import javax.el.ValueExpression;
@@ -31,7 +33,6 @@
import javax.faces.event.PhaseId;
import org.ajax4jsf.model.DataComponentState;
-import org.ajax4jsf.model.DataVisitor;
import org.richfaces.component.state.DataTableState;
import org.richfaces.component.state.SubTableState;
import org.richfaces.event.ToggleEvent;
@@ -68,6 +69,7 @@
public SubTableVisualModel getVisualModel() {
// TODO refactor
+
SubTableVisualModel model = getCurrentComponentState().getCurrentRowModel();
if (model == null) {
@@ -119,11 +121,11 @@
throw new IllegalArgumentException("subtable is not sortable
element");
}
- @Override
- public void walk(FacesContext context, DataVisitor visitor, Object argument) {
- resetDataModel(context);
- super.walk(context, visitor, argument);
- }
+// @Override
+// public void walk(FacesContext context, DataVisitor visitor, Object argument) {
+// resetDataModel(context);
+// super.walk(context, visitor, argument);
+// }
public String getSwichType() {
return (String) getStateHelper().eval(PropertyKeys.switchType,
SWITCH_TYPE_SERVER);
@@ -134,14 +136,12 @@
}
public SubTableState getCurrentComponentState() {
- DataComponentState dataComponentState = getComponentState();
- if (dataComponentState instanceof SubTableState) {
- DataTableState parentState = getParentState();
- parentState.addSubTableState((SubTableState) dataComponentState);
-
- return (SubTableState) dataComponentState;
- }
- return null;
+ DataComponentState dataComponentState = (SubTableState)getComponentState();
+
+ DataTableState parentState = getParentState();
+ parentState.addSubTableState((SubTableState) dataComponentState);
+
+ return (SubTableState) dataComponentState;
}
public DataTableState getParentState() {
@@ -191,11 +191,21 @@
public MethodExpression getToggleListener() {
return (MethodExpression) getStateHelper().eval(PropertyKeys.toggleExpression);
}
-
+
@Override
+ public void encodeAll(FacesContext context) throws IOException {
+ super.encodeAll(context);
+
+ }
+
+ @Override
public void queueEvent(FacesEvent event) {
if (event instanceof ToggleEvent) {
- event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
+ if(getSwichType().equals(SWITCH_TYPE_AJAX)) {
+ event.setPhaseId(PhaseId.INVOKE_APPLICATION);
+ } else {
+ event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
+ }
}
super.queueEvent(event);
}
@@ -234,34 +244,41 @@
@Override
public boolean getRendersChildren() {
- // TODO nick - why "false"?
- return false;
+ return true;
}
-
- public String getCellSkinClass() {
- return "rich-subtable-cell";
+
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
}
-
+
+ @Override
public String getRowSkinClass() {
return "rich-subtable-row";
}
+ @Override
public String getFirstRowSkinClass() {
return "rich-subtable-first-row";
}
- public String getHeaderCellSkinClass() {
- return "rich-subtable-header-cell";
- }
-
public String getHeaderRowSkinClass() {
return "rich-subtable-header-row";
}
public String getHeaderFirstRowSkinClass() {
- return "rich-subtable-header-first-row";
+ return "rich-subtable-header-first";
}
+ public String getCellSkinClass() {
+ return "rich-subtable-cell";
+ }
+
+ public String getHeaderCellSkinClass() {
+ return "rich-subtable-header-cell";
+ }
+
+
public String getColumnHeaderCellSkinClass() {
return "rich-subtable-subheader-cell";
}
@@ -270,29 +287,57 @@
return "rich-subtable-subheader";
}
- @Override
public String getFooterCellSkinClass() {
return "rich-subtable-footer-cell";
}
- @Override
- public String getFooterRowSkinClass() {
- return "rich-subtable-footer-continue";
+ public String getFooterSkinClass() {
+ return "rich-subtable-footer";
}
- @Override
public String getFooterFirstRowSkinClass() {
- return "rich-subtable-footer";
+ return "rich-subtable-footer-first";
}
- @Override
public String getColumnFooterCellSkinClass() {
return "rich-subtable-subfooter-cell";
}
- @Override
public String getColumnFooterSkinClass() {
return "rich-subtable-subfooter-cell";
}
+
+ public String getTableSkinClass() {
+ return null;
+ }
+
+ public String getTableHeadSkinClass() {
+ return null;
+ }
+ @Override
+ public String getColumnFooterFirstSkinClass() {
+ return "rich-subtable-subfooter-first"; }
+
+ @Override
+ public String getColumnHeaderFirstSkinClass() {
+ return "rich-subtable-subheader-first";
+ }
+
+ @Override
+ public String getFooterFirstSkinClass() {
+ return "rich-subtable-footer-first";
+ }
+
+ @Override
+ public String getHeaderFirstSkinClass() {
+ return "rich-subtable-header-first";
+ }
+
+ @Override
+ public String getHeaderSkinClass() {
+ return "rich-subtable-header";
+ }
}
+
+
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIToggleControl.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIToggleControl.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIToggleControl.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -1,15 +1,25 @@
package org.richfaces.component;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+
import javax.faces.component.UIComponentBase;
+import org.omg.CORBA.REBIND;
+
public abstract class UIToggleControl extends UIComponentBase {
public static final String COMPONENT_TYPE = "org.richfaces.ToggleControl";
public static final String COMPONENT_FAMILY =
"org.richfaces.ToggleControl";
-
+
+ private Collection<String> execute;
+
+ private Collection<String> render;
+
+
enum PropertyKeys {
- expandControl, collapseControl, forId, event
+ expandControl, collapseControl, forId, event, execute, render
}
@Override
@@ -49,4 +59,33 @@
public void setEvent(String event) {
getStateHelper().put(PropertyKeys.event, event);
}
+ public Collection<String> getExecute() {
+ Collection<String> execute =
(Collection<String>)getStateHelper().get(PropertyKeys.execute);
+ if(execute == null) {
+ execute = new LinkedHashSet<String>();
+ execute.add("@this");
+ getStateHelper().put(PropertyKeys.execute, execute);
+ }
+ return execute;
+ }
+
+ public void addExecuteId(String id){
+ ((Collection<String>)getStateHelper().get(PropertyKeys.execute)).add(id);
+ }
+
+
+ public Collection<String> getRender() {
+ Collection<String> render =
(Collection<String>)getStateHelper().get(PropertyKeys.render);
+ if(render == null) {
+ render = new LinkedHashSet<String>();
+ render.add("@this");
+ getStateHelper().put(PropertyKeys.render, render);
+ }
+ return render;
+ }
+
+ public void addRenderId(String id){
+ ((Collection<String>)getStateHelper().get(PropertyKeys.render)).add(id);
+ }
+
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -5,4 +5,9 @@
*
*/
public interface DataTableVisualModel {
+
+ public SortingFilteringVisualModel getSortingFilteringVisualModel();
+
+ public void setSortingFilteringVisualModel(SortingFilteringVisualModel
sortingFilteringVisualModel);
+
}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SortingFilteringVisualModel.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SortingFilteringVisualModel.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SortingFilteringVisualModel.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -0,0 +1,15 @@
+package org.richfaces.model.visual;
+
+import java.util.Collection;
+
+public interface SortingFilteringVisualModel {
+
+ public String getSortMode();
+
+ public void setSortMode(String sortMode);
+
+ public Collection<String> getSortPriority();
+
+ public void setSortPriority(Collection<String> sortPriority);
+
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -1,13 +1,24 @@
package org.richfaces.model.visual.impl;
import org.richfaces.model.visual.DataTableVisualModel;
+import org.richfaces.model.visual.SortingFilteringVisualModel;
/**
* @author Anton Belevich
*
*/
public class DataTableVisualModelImpl implements DataTableVisualModel {
-
+
+ private SortingFilteringVisualModel sortingFilteringVisualModel;
+
public DataTableVisualModelImpl() {
}
+
+ public SortingFilteringVisualModel getSortingFilteringVisualModel() {
+ return sortingFilteringVisualModel;
+ }
+
+ public void setSortingFilteringVisualModel(SortingFilteringVisualModel
sortingFilteringVisualModel) {
+ this.sortingFilteringVisualModel = sortingFilteringVisualModel;
+ }
}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SortingFilteringVisualModelImpl.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SortingFilteringVisualModelImpl.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SortingFilteringVisualModelImpl.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -0,0 +1,29 @@
+package org.richfaces.model.visual.impl;
+
+import java.util.Collection;
+
+import org.richfaces.model.visual.SortingFilteringVisualModel;
+
+public class SortingFilteringVisualModelImpl implements SortingFilteringVisualModel {
+
+ private String sortMode;
+
+ private Collection<String> sortPriority;
+
+ public String getSortMode() {
+ return sortMode;
+ }
+
+ public Collection<String> getSortPriority() {
+ return sortPriority;
+ }
+
+ public void setSortMode(String sortMode) {
+ this.sortMode = sortMode;
+ }
+
+ public void setSortPriority(Collection<String> sortPriority) {
+ this.sortPriority = sortPriority;
+ }
+
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractRowsRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractRowsRenderer.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractRowsRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -23,7 +23,9 @@
import java.io.IOException;
+import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
import org.ajax4jsf.model.DataVisitResult;
import org.ajax4jsf.model.DataVisitor;
@@ -41,29 +43,60 @@
* {"onmouseup","onRowMouseUp"},
{"onmousedown","onRowMouseDown"},
{"onmouseover","onRowMouseOver"},
* {"onmouseout","onRowMouseOut"} };
*/
-
- public abstract void encodeRow(RowHolderBase rowHolder) throws IOException;
-
+
public DataVisitResult process(FacesContext context, Object rowKey, Object argument)
{
RowHolderBase holder = (RowHolderBase) argument;
Row row = holder.getRow();
row.setRowKey(context, rowKey);
try {
+ encodeRowBegin(context, holder);
encodeRow(holder);
+ encodeRowEnd(context, holder);
} catch (IOException e) {
// TODO: seems we need add throws IOException ???
}
holder.nextRow();
return DataVisitResult.CONTINUE;
}
-
+
protected void encodeRows(RowHolderBase rowHolder) throws IOException {
rowHolder.getRow().walk(rowHolder.getContext(), this, rowHolder);
}
+
+ public void encodeRowsBegin(ResponseWriter writer, FacesContext context,
RowHolderBase holder) throws IOException {
+ }
+
+ public void encodeRowsEnd(ResponseWriter writer, FacesContext context, RowHolderBase
holder) throws IOException {
+ }
+
+ public abstract void encodeRow(RowHolderBase rowHolder) throws IOException;
+
+ public void encodeRowBegin(FacesContext context, RowHolderBase holder) throws
IOException {
+ }
+
+ public void encodeRowEnd(FacesContext context, RowHolderBase holder) throws
IOException {
+ }
+ @Override
+ protected void doEncodeChildren(ResponseWriter writer, FacesContext context,
UIComponent component)
+ throws IOException {
+ RowHolderBase rowHolder = createRowHolder(context, component);
+ encodeRowsBegin(writer, context, rowHolder);
+ encodeRows(rowHolder);
+ encodeRowsEnd(writer, context, rowHolder);
+ }
+
+ public abstract RowHolderBase createRowHolder(FacesContext context, UIComponent
component);
+
+ protected boolean isEmpty(String style) {
+ return !((style != null) && (style.trim().length() != 0));
+ }
+
+
public boolean getRendersChildren() {
return true;
}
+
/*
* protected void encodeRowEvents(FacesContext context, UIDataAdaptor table) throws
IOException {
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractTableRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractTableRenderer.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/AbstractTableRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -1,20 +1,32 @@
package org.richfaces.renderkit;
+import java.io.IOException;
import java.util.Iterator;
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIColumn;
import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.richfaces.component.Column;
import org.richfaces.component.Row;
import org.richfaces.component.UIDataTableBase;
+import org.richfaces.component.UISubTable;
@ResourceDependencies(value = { @ResourceDependency(library = "javax.faces",
name = "jsf.js"),
@ResourceDependency(name = "jquery.js"), @ResourceDependency(name =
"richfaces.js") })
-public abstract class AbstractTableRenderer extends AbstractRowsRenderer {
-
+public abstract class AbstractTableRenderer extends DataTableRowsRenderer {
+
+ public static final String ROW_CLASS = "rowClass";
+
+ public static final String FIRST_ROW_CLASS = "firstRowClass";
+
+ public static final String CELL_CLASS = "cellClass";
+
+
public boolean isColumnFacetPresent(UIDataTableBase table, String facetName) {
Iterator<UIComponent> columns = table.columns();
boolean result = false;
@@ -56,12 +68,11 @@
// check for exact value in component
Integer span = (Integer) table.getAttributes().get("columns");
int count = (null != span && span.intValue() != Integer.MIN_VALUE) ?
span.intValue()
- : calculateRowColumns(table.columns());
+ : getColumnsCount(table.columns());
return count;
}
- // TODO nick - rename method
- protected int calculateRowColumns(Iterator<UIComponent> col) {
+ protected int getColumnsCount(Iterator<UIComponent> col) {
int count = 0;
int currentLength = 0;
while (col.hasNext()) {
@@ -73,7 +84,7 @@
count = currentLength;
}
// Calculate number of columns in row.
- currentLength = calculateRowColumns(((Row) component).columns());
+ currentLength = getColumnsCount(((Row) component).columns());
// Store max calculated value
if (currentLength > count) {
count = currentLength;
@@ -107,4 +118,264 @@
}
return count;
}
+
+
+ public void encodeTableStructure(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable) throws IOException {
+ }
+
+ public void encodeTableFacets(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable) throws IOException {
+
+ Object key = dataTable.getRowKey();
+ dataTable.captureOrigValue(context);
+ dataTable.setRowKey(context, null);
+
+ encodeTableStructure(writer, context, dataTable);
+ saveToRequest(context, CELL_ELEMENT_KEY, HTML.TH_ELEM);
+ encodeHeaderFacet(writer, context, dataTable);
+ encodeFooterFacet(writer, context, dataTable);
+ saveToRequest(context, CELL_ELEMENT_KEY, HTML.TD_ELEM);
+ dataTable.setRowKey(context, key);
+ dataTable.restoreOrigValue(context);
+
+ }
+
+ @Override
+ protected void doEncodeBegin(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
+ UIDataTableBase dataTable = (UIDataTableBase) component;
+ encodeTableStart(writer, context, dataTable);
+ encodeTableFacets(writer, context, dataTable);
+ }
+
+ public void encodeTableStart(ResponseWriter writer, FacesContext context,
UIDataTableBase component) throws IOException {
+ writer.startElement(HTML.TABLE_ELEMENT, component);
+ String styleClass = component.getTableSkinClass();
+ encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, styleClass);
+ }
+
+ public void encodeTableEnd(ResponseWriter writer, FacesContext context,
UIDataTableBase component) throws IOException {
+ writer.endElement(HTML.TABLE_ELEMENT);
+ }
+
+ public void encodeTableBodyStart(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable)
+ throws IOException {
+ writer.startElement(HTML.TBOBY_ELEMENT, dataTable);
+ getUtils().encodeId(context, dataTable);
+
+ String predefinedStyles = null;
+ if (dataTable instanceof UISubTable) {
+ UISubTable subTable = (UISubTable) dataTable;
+ if (!subTable.isExpanded()) {
+ predefinedStyles = "display: none;";
+ }
+ }
+
+ encodeStyle(writer, context, dataTable, predefinedStyles);
+ }
+
+ public void encodeTableBodyEnd(ResponseWriter writer, FacesContext context,
UIDataTableBase component) throws IOException {
+ writer.endElement(HTML.TBOBY_ELEMENT);
+ }
+
+ public abstract RowHolderBase createRowHolder(FacesContext context, UIComponent
component);
+
+ public void encodeFooterFacet(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable) throws IOException {
+
+ UIComponent footer = dataTable.getFooter();
+ boolean columnFacetPresent = isColumnFacetPresent(dataTable,
"footer");
+
+ if ((footer != null && footer.isRendered()) || columnFacetPresent) {
+ boolean encodeTfoot = containThead();
+ if (encodeTfoot) {
+ writer.startElement(HTML.TFOOT_ELEMENT, dataTable);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-table-tfoot",
null);
+ }
+
+ int columns = getColumnsCount(dataTable);
+
+ if (columnFacetPresent) {
+
+
+ String rowClass = dataTable.getColumnFooterSkinClass();
+ String cellClass = dataTable.getColumnFooterCellSkinClass();
+ String firstClass = dataTable.getColumnFooterFirstSkinClass();
+
+ rowClass = mergeStyleClasses("columnFooterClass", rowClass,
dataTable);
+ cellClass = mergeStyleClasses("columnFooterCellClass",
cellClass, dataTable);
+ firstClass = mergeStyleClasses("firstColumnFooterClass",
firstClass, dataTable);
+
+ saveRowStyles(context, firstClass, rowClass, cellClass);
+
+ writer.startElement(HTML.TR_ELEMENT, dataTable);
+ encodeStyleClass(writer, context, dataTable, null, rowClass);
+ encodeColumnFacet(context, writer, dataTable.columns(),
"footer",columns, cellClass);
+ writer.endElement(HTML.TR_ELEMENT);
+ }
+
+ if (footer != null && footer.isRendered()) {
+
+ String rowClass = dataTable.getFooterSkinClass();
+ String cellClass = dataTable.getFooterCellSkinClass();
+ String firstClass = dataTable.getFooterFirstSkinClass();
+
+ rowClass = mergeStyleClasses("footerClass", rowClass,
dataTable);
+ cellClass = mergeStyleClasses("footerCellClass", cellClass,
dataTable);
+ firstClass = mergeStyleClasses("footerFirstClass", firstClass,
dataTable);
+ // TODO nick - rename method "encodeTableHeaderFacet"
+ saveRowStyles(context, firstClass, rowClass, cellClass);
+ encodeTableFacet(context, writer, columns, footer, "footer",
rowClass, cellClass);
+ }
+
+ if (encodeTfoot) {
+ writer.endElement(HTML.TFOOT_ELEMENT);
+ }
+ }
+
+ }
+
+ protected String mergeStyleClasses(String classAttribibute, String skinClass,
UIComponent component) {
+ String styleClass = null;
+ String resultClass = skinClass;
+
+ if(classAttribibute != null && component != null ) {
+ styleClass = (String)component.getAttributes().get(classAttribibute);
+ }
+
+ if(styleClass != null && styleClass.trim().length() > 0) {
+ resultClass = resultClass + " " + styleClass;
+ }
+
+ return resultClass;
+ }
+
+ public void encodeHeaderFacet(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable) throws IOException {
+
+ UIComponent header = dataTable.getHeader();
+ boolean isEncodeHeaders = isEncodeHeaders(dataTable);
+
+ boolean encodeThead = containThead();
+
+ if ((header != null && header.isRendered()) || isEncodeHeaders) {
+
+ if (encodeThead) {
+ writer.startElement(HTML.THEAD_ELEMENT, dataTable);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-table-thead",
null);
+ }
+
+ int columns = getColumnsCount(dataTable);
+
+ if (header != null && header.isRendered()) {
+
+ String rowClass = dataTable.getHeaderSkinClass();
+ String cellClass = dataTable.getHeaderCellSkinClass();
+ String firstClass = dataTable.getHeaderFirstSkinClass();
+
+ rowClass = mergeStyleClasses("headerClass", rowClass,
dataTable);
+ cellClass = mergeStyleClasses("headerCellClass", cellClass,
dataTable);
+ firstClass = mergeStyleClasses("headerFirstClass", firstClass,
dataTable);
+ saveRowStyles(context, firstClass, rowClass, cellClass);
+
+ encodeTableFacet(context, writer, columns, header, "header",
rowClass, cellClass);
+ }
+
+ if (isEncodeHeaders) {
+
+ String rowClass = dataTable.getColumnHeaderSkinClass();
+ String cellClass = dataTable.getColumnHeaderCellSkinClass();
+ String firstClass = dataTable.getColumnHeaderFirstSkinClass();
+
+ rowClass = mergeStyleClasses("columnHeaderClass", rowClass,
dataTable);
+ cellClass = mergeStyleClasses("columnHeaderCellClass",
cellClass, dataTable);
+ firstClass = mergeStyleClasses("columnHeaderFirstClass",
firstClass, dataTable);
+ saveRowStyles(context, firstClass, rowClass, cellClass);
+
+ writer.startElement(HTML.TR_ELEMENT, dataTable);
+ encodeStyleClass(writer, context, dataTable, null, rowClass);
+
+ encodeColumnFacet(context, writer, dataTable.columns(),
"header", columns, cellClass);
+ writer.endElement(HTML.TR_ELEMENT);
+ }
+
+ if (encodeThead) {
+ writer.endElement(HTML.THEAD_ELEMENT);
+ }
+ }
+
+ }
+
+ protected void encodeColumnFacet(FacesContext context, ResponseWriter writer,
Iterator<UIComponent> headers, String facetName, int colCount, String cellClass)
throws IOException {
+
+ int tColCount = 0;
+ String element = getCellElement(context);
+
+ while (headers.hasNext()) {
+ UIComponent column = headers.next();
+ if (!column.isRendered()) {
+ continue;
+ }
+
+ Integer colspan = (Integer) column.getAttributes().get("colspan");
+ if (colspan != null && colspan.intValue() > 0) {
+ tColCount += colspan.intValue();
+ } else {
+ tColCount++;
+ }
+
+ if (tColCount > colCount) {
+ break;
+ }
+
+ writer.startElement(element, column);
+
+ encodeStyleClass(writer, context, column, null, cellClass);
+
+ writer.writeAttribute("scope", "col", null);
+ getUtils().encodeAttribute(context, column, "colspan");
+
+ HeaderEncodeStrategy strategy = getHeaderEncodeStrategy(column, facetName);
+ strategy.encodeBegin(context, writer, column, facetName);
+
+ UIComponent facet = column.getFacet(facetName);
+ if (facet != null && facet.isRendered()) {
+ renderChild(context, facet);
+ }
+
+ strategy.encodeEnd(context, writer, column, facetName);
+
+ writer.endElement(element);
+ }
+ }
+
+ protected void encodeTableFacet(FacesContext context,ResponseWriter writer, int
columns, UIComponent footer, String facetName, String rowClass, String cellClass) throws
IOException {
+
+ boolean isColumnGroup = (footer instanceof Row);
+ String element = getCellElement(context);
+
+ if(!isColumnGroup) {
+ writer.startElement(HTML.TR_ELEMENT, footer);
+
+ encodeStyleClass(writer, context, footer, null, rowClass);
+
+ writer.startElement(element, footer);
+
+ encodeStyleClass(writer, context, footer, null, cellClass);
+
+ if (columns > 0) {
+ writer.writeAttribute("colspan", String.valueOf(columns),
null);
+ }
+
+ writer.writeAttribute("scope", "colgroup", null);
+ }
+
+ renderChild(context, footer);
+
+ if(!isColumnGroup){
+ writer.endElement(element);
+ writer.endElement(HTML.TR_ELEMENT);
+ }
+ }
+
+ public abstract HeaderEncodeStrategy getHeaderEncodeStrategy(UIComponent column,
String tableFacetName);
+
+
+ public abstract boolean containThead();
}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ColumnGroupRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ColumnGroupRenderer.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ColumnGroupRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -0,0 +1,38 @@
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.faces.component.UIColumn;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.richfaces.component.UIColumnGroup;
+
+public class ColumnGroupRenderer extends DataTableRowsRenderer {
+
+ @Override
+ public void encodeRow(RowHolderBase holder) throws IOException {
+ RowHolder rowHolder = (RowHolder) holder;
+
+ UIColumnGroup row = (UIColumnGroup)rowHolder.getRow();
+ rowHolder.setRowStart(true);
+
+ Iterator<UIComponent> components = row.columns();
+ FacesContext context = rowHolder.getContext();
+ ResponseWriter writer = context.getResponseWriter();
+
+ while(components.hasNext()){
+ UIComponent component = components.next();
+ rowHolder.lastColumn(!components.hasNext());
+ rowHolder = encodeColumn(context, (UIColumn)component, writer, rowHolder);
+ }
+ }
+
+ @Override
+ public RowHolderBase createRowHolder(FacesContext context, UIComponent component) {
+ return new RowHolder(context, (UIColumnGroup)component);
+ }
+
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -12,27 +12,24 @@
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.richfaces.component.Row;
-import org.richfaces.component.UIDataTableBase;
import org.richfaces.component.UIDataTable;
+import org.richfaces.component.UIDataTableBase;
import org.richfaces.component.UISubTable;
+import org.richfaces.component.util.FormUtil;
@ResourceDependencies( { @ResourceDependency(library = "javax.faces", name =
"jsf-uncompressed.js"),
@ResourceDependency(name = "jquery.js"), @ResourceDependency(name =
"richfaces.js"),
@ResourceDependency(name = "datatable.js"), @ResourceDependency(name =
"table.css") })
-public class DataTableRenderer extends AbstractTableRenderer implements
ElementEncodeListener {
+public class DataTableRenderer extends AbstractTableRenderer {
@Override
protected void doDecode(FacesContext context, UIComponent component) {
System.out.println("DataTableRenderer.doDecode()");
}
- protected void encodeTableStructure(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable)
+ public void encodeTableStructure(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable)
throws IOException {
-
- Object key = dataTable.getRowKey();
- dataTable.captureOrigValue(context);
- dataTable.setRowKey(context, null);
-
+
if (dataTable instanceof UIDataTable) {
encodeCaption(writer, context, (UIDataTable) dataTable);
// TODO nick - do we need this element if "columnsWidth" is
absent?
@@ -54,146 +51,60 @@
writer.endElement("colgroup");
}
-
- encodeHeader(writer, context, dataTable);
- encodeFooter(writer, context, dataTable);
-
- dataTable.setRowKey(context, key);
- dataTable.restoreOrigValue(context);
+
}
-
- public void encodeRows(FacesContext context, UIDataTableBase dataTable) throws
IOException {
-
- RowHolder holder = new RowHolder(context, dataTable);
- holder.setCellClass(dataTable.getCellSkinClass());
- holder.setRowClass(dataTable.getRowSkinClass());
- holder.setFirstRowClass(dataTable.getFirstRowSkinClass());
- holder.setHeaderRow(false);
- holder.setCellElement(HTML.TD_ELEM);
-
- encodeRows(holder);
+
+ @Override
+ public RowHolder createRowHolder(FacesContext context, UIComponent component) {
+ return new RowHolder(context, (UIDataTable)component);
}
-
- // TODO: refactor
+
+ @Override
+ public void encodeRowBegin(FacesContext context, RowHolderBase holder) throws
IOException {
+ UIDataTable dataTable = (UIDataTable)holder.getRow();
+
+ String rowClass = dataTable.getRowSkinClass();
+ String cellClass = dataTable.getCellSkinClass();
+ String firstClass = dataTable.getFirstRowSkinClass();
+
+ rowClass = mergeStyleClasses("rowClass", rowClass, dataTable);
+ cellClass = mergeStyleClasses("cellClass", cellClass, dataTable);
+ firstClass = mergeStyleClasses("firstRowClass", firstClass,
dataTable);
+
+ saveRowStyles(context, firstClass, rowClass, cellClass);
+ }
+
public void encodeRow(RowHolderBase holder) throws IOException {
+
FacesContext context = holder.getContext();
- RowHolder rowHolder = (RowHolder) holder;
- boolean rowStart = true;
- boolean bodyStart = false;
+
+ RowHolder rowHolder = (RowHolder)holder;
+
+ rowHolder.setRowStart(true);
+ rowHolder.resetProcessCell();
- int processCell = 0;
-
Row row = rowHolder.getRow();
- int processRow = rowHolder.getCurrentRow();
ResponseWriter writer = context.getResponseWriter();
+ encodeTableBodyStart(writer, context, (UIDataTable) row);
- if (rowHolder.isDataTable()) {
- encodeTableBodyStart(writer, context, (UIDataTable) row);
- bodyStart = true;
- }
-
- Iterator<UIComponent> iterator = row.columns();
- while (iterator.hasNext()) {
-
- UIComponent child = iterator.next();
+ Iterator<UIComponent> components = row.columns();
+ while (components.hasNext()) {
+
+ UIComponent child = components.next();
if (child instanceof Row) {
-
- Row childRow = (Row) child;
- RowHolder childRowHolder = new RowHolder(context, childRow);
- childRowHolder.setCurrentRow(processRow);
- childRowHolder.setCellElement(rowHolder.getCellElement());
-
- if (rowHolder.isHeaderRow()) {
- childRowHolder.setRowClass(rowHolder.getRowClass());
- childRowHolder.setFirstRowClass(rowHolder.getFirstRowClass());
- childRowHolder.setCellClass(rowHolder.getCellClass());
- childRowHolder.setCellElement(HTML.TH_ELEM);
- } else {
- childRowHolder.setRowClass(childRow.getRowSkinClass());
- childRowHolder.setFirstRowClass(childRow.getFirstRowSkinClass());
- childRowHolder.setCellClass(childRow.getCellSkinClass());
- childRowHolder.setCellElement(HTML.TD_ELEM);
+ encodeTableBodyEnd(writer, context, (UIDataTable) row);
+ renderChild(context, (UISubTable) child);
+ if (components.hasNext()) {
+ encodeTableBodyStart(writer, context, (UIDataTable) row);
}
- childRowHolder.setHeaderRow(rowHolder.isHeaderRow());
-
- if (child instanceof UISubTable) {
- // ecode subTable header facet
- UISubTable subTable = (UISubTable) child;
-
- if (bodyStart) {
- encodeTableBodyEnd(writer, context, (UIDataTableBase) row);
- bodyStart = false;
- }
- // subTable.setRowKey(childRowHolder.getCurrentRow());
-
- /*
- * Object key = subTable.getRowKey();
subTable.captureOrigValue(context);
- * subTable.setRowKey(context, null);
- */
-
- encodeTableBodyStart(writer, context, subTable);
- encodeHeader(writer, context, subTable);
-
- encodeRows(childRowHolder);
-
- encodeFooter(writer, context, subTable);
-
- /*
- * subTable.setRowKey(context, key);
subTable.restoreOrigValue(context);
- */
-
- // encodeHiddenInput(context, writer, subTable);
- encodeTableBodyEnd(writer, context, subTable);
-
- bodyStart = false;
- if (iterator.hasNext()) {
- encodeTableBodyStart(writer, context, (UIDataTableBase) row);
- bodyStart = true;
- }
-
- } else {
- encodeRows(childRowHolder);
- }
-
} else if (child instanceof UIColumn) {
-
- if (child instanceof org.richfaces.component.UIColumn) {
- org.richfaces.component.UIColumn column =
(org.richfaces.component.UIColumn) child;
- if (column.isBreakBefore() && processCell != 0) {
- encodeRowEnd(writer, context, column);
- rowHolder.nextRow();
- rowStart = true;
- }
- }
-
- if (rowStart) {
- if (processRow == 0) {
- encodeFirstRowStart(writer, context, child, rowHolder);
- } else {
- encodeRowStart(writer, context, child, rowHolder);
- }
-
- rowStart = false;
- }
-
- encodeCellStart(writer, context, child, rowHolder);
- encodeCellEnd(writer, context, child, rowHolder);
-
- if (!iterator.hasNext()) {
- if (processRow == 0) {
- encodeFirstRowEnd(writer, context, child);
- } else {
- encodeRowEnd(writer, context, child);
- }
- }
- processCell++;
- }
+ rowHolder.lastColumn(!components.hasNext());
+ rowHolder = encodeColumn(context, (UIColumn)child, writer, rowHolder);
+ }
}
- if (bodyStart && rowHolder.isDataTable()) {
- encodeTableBodyEnd(writer, context, (UIDataTableBase) row);
- }
+ encodeTableBodyEnd(writer, context, (UIDataTableBase) row);
}
/*
@@ -209,31 +120,6 @@
*/
@Override
- protected void doEncodeBegin(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
- if (!shouldProceed(component)) {
- return;
- }
- UIDataTableBase dataTable = (UIDataTableBase) component;
- encodeTableStart(writer, context, dataTable);
- encodeTableStructure(writer, context, dataTable);
- }
-
- @Override
- protected void doEncodeChildren(ResponseWriter writer, FacesContext context,
UIComponent component)
- throws IOException {
-
- if (!shouldProceed(component)) {
- return;
- }
-
- UIDataTableBase dataTable = (UIDataTableBase) component;
- // encodeTableBodyStart(writer, context, dataTable);
- encodeRows(context, dataTable);
- // encodeTableBodyEnd(writer, context, dataTable);
-
- }
-
- @Override
protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
if (!shouldProceed(component)) {
@@ -252,93 +138,7 @@
protected Class<? extends UIComponent> getComponentClass() {
return UIDataTable.class;
}
-
- public void encodeCellEnd(ResponseWriter writer, FacesContext context, UIComponent
component, RowHolder holder)
- throws IOException {
- writer.endElement(holder.getCellElement());
- }
-
- public void encodeCellStart(ResponseWriter writer, FacesContext context, UIComponent
component, RowHolder holder)
- throws IOException {
- // anton - TODO: scope attribute
- writer.startElement(holder.getCellElement(), component);
- String cellClass = holder.getCellClass();
- encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, cellClass);
-
- if (component instanceof org.richfaces.component.UIColumn) {
- org.richfaces.component.UIColumn column = (org.richfaces.component.UIColumn)
component;
-
- int rowspan = column.getRowspan();
- if (rowspan != Integer.MIN_VALUE) {
- writer.writeAttribute("rowspan", Integer.valueOf(rowspan),
null);
- }
-
- int colspan = column.getColspan();
- if (colspan != Integer.MIN_VALUE) {
- writer.writeAttribute("colspan", Integer.valueOf(colspan),
null);
- }
- }
- renderChildren(context, component);
- }
-
- public void encodeFirstRowEnd(ResponseWriter writer, FacesContext context,
UIComponent component)
- throws IOException {
- writer.endElement(HTML.TR_ELEMENT);
- }
-
- public void encodeFirstRowStart(ResponseWriter writer, FacesContext context,
UIComponent component, RowHolder holder)
- throws IOException {
- writer.startElement(HTML.TR_ELEMENT, component);
- getUtils().encodeId(context, component);
- String styleClass = holder.getRowClass() + " " +
holder.getFirstRowClass();
- encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, styleClass);
- }
-
- public void encodeRowEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
- writer.endElement(HTML.TR_ELEMENT);
- }
-
- public void encodeRowStart(ResponseWriter writer, FacesContext context, UIComponent
component, RowHolder holder)
- throws IOException {
- writer.startElement(HTML.TR_ELEMENT, component);
- getUtils().encodeId(context, component);
- String styleClass = holder.getRowClass();
- encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, styleClass);
- }
-
- public void encodeTableBodyEnd(ResponseWriter writer, FacesContext context,
UIDataTableBase component)
- throws IOException {
- writer.endElement(HTML.TBOBY_ELEMENT);
- }
-
- public void encodeTableBodyStart(ResponseWriter writer, FacesContext context,
UIDataTableBase component)
- throws IOException {
- writer.startElement(HTML.TBOBY_ELEMENT, component);
- getUtils().encodeId(context, component);
-
- String predefinedStyles = null;
- if (component instanceof UISubTable) {
- UISubTable subTable = (UISubTable) component;
- if (!subTable.isExpanded()) {
- predefinedStyles = "display: none;";
- }
- }
-
- encodeStyle(writer, context, component, predefinedStyles);
- }
-
- public void encodeTableEnd(ResponseWriter writer, FacesContext context,
UIDataTableBase component)
- throws IOException {
- writer.endElement(HTML.TABLE_ELEMENT);
- }
-
- public void encodeTableStart(ResponseWriter writer, FacesContext context,
UIDataTableBase component)
- throws IOException {
- writer.startElement(HTML.TABLE_ELEMENT, component);
- String styleClass = getTableSkinClass();
- encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, styleClass);
- }
-
+
public void encodeCaption(ResponseWriter writer, FacesContext context, UIDataTable
dataTable) throws IOException {
UIComponent caption = dataTable.getCaption();
@@ -354,7 +154,7 @@
writer.startElement(HTML.CAPTION_ELEMENT, dataTable);
String captionClass = (String)
dataTable.getAttributes().get("captionClass");
- String captionSkinClass = getCaptionSkinClass();
+ String captionSkinClass = dataTable.getCaptionSkinClass();
captionClass = captionClass != null ? captionClass + " " + captionClass
: captionSkinClass;
writer.writeAttribute(HTML.CLASS_ATTRIBUTE, captionClass,
"captionClass");
@@ -369,250 +169,73 @@
writer.endElement(HTML.CAPTION_ELEMENT);
}
-
- public void encodeFooter(ResponseWriter writer, FacesContext context, UIDataTableBase
dataTable) throws IOException {
-
- Iterator<UIComponent> tableColumns = dataTable.columns();
-
- UIComponent footer = dataTable.getFooter();
- boolean columnFacetPresent = isColumnFacetPresent(dataTable,
"footer");
-
- if ((footer != null && footer.isRendered()) || columnFacetPresent) {
- boolean encodeTfoot = (dataTable instanceof UIDataTable);
- String cellElement = HTML.TD_ELEM;
-
- if (encodeTfoot) {
- writer.startElement(HTML.TFOOT_ELEMENT, dataTable);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-table-tfoot",
null);
- cellElement = HTML.TH_ELEM;
- }
-
- String footerClass = (String)
dataTable.getAttributes().get("footerClass");
- int columns = getColumnsCount(dataTable);
-
- if (columnFacetPresent) {
- writer.startElement(HTML.TR_ELEMENT, dataTable);
-
- encodeStyleClass(writer, context, dataTable, "footerClass",
dataTable.getColumnFooterSkinClass());
- // TODO nick - rename method "encodeHeaderFacets"
- encodeHeaderFacets(context, writer, tableColumns,
dataTable.getColumnFooterCellSkinClass(),
- footerClass, "footer", cellElement, columns);
- writer.endElement(HTML.TR_ELEMENT);
- }
-
- if (footer != null && footer.isRendered()) {
- // TODO nick - rename method "encodeTableHeaderFacet"
- encodeTableHeaderFacet(context, columns, writer, footer,
dataTable.getFooterFirstRowSkinClass(),
- dataTable.getFooterRowSkinClass(),
dataTable.getFooterCellSkinClass(), footerClass, cellElement);
- }
-
- if (encodeTfoot) {
- writer.endElement(HTML.TFOOT_ELEMENT);
- }
- }
-
+
+
+ @Override
+ public HeaderEncodeStrategy getHeaderEncodeStrategy(UIComponent column, String
tableFacetName) {
+
+ return ((column instanceof org.richfaces.component.UIColumn &&
"header".equals(tableFacetName)) ?
+ new RichHeaderEncodeStrategy() : new SimpleHeaderEncodeStrategy());
}
+
+ protected class RichHeaderEncodeStrategy implements HeaderEncodeStrategy {
- public void encodeHeader(ResponseWriter writer, FacesContext context, UIDataTableBase
dataTable) throws IOException {
-
- UIComponent header = dataTable.getHeader();
- boolean isEncodeHeaders = isEncodeHeaders(dataTable);
-
- boolean encodeThead = (dataTable instanceof UIDataTable);
-
- if ((header != null && header.isRendered()) || isEncodeHeaders) {
-
- String cellElement = HTML.TD_ELEM;
-
- if (encodeThead) {
- writer.startElement(HTML.THEAD_ELEMENT, dataTable);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rich-table-thead",
null);
- cellElement = HTML.TH_ELEM;
-
+ public void encodeBegin(FacesContext context, ResponseWriter writer, UIComponent
column, String facetName)
+ throws IOException {
+
+ org.richfaces.component.UIColumn col = (org.richfaces.component.UIColumn)
column;
+
+ String columnClientId = col.getClientId(context);
+ String clientId = columnClientId + facetName;
+ writer.writeAttribute("id", clientId, null);
+ boolean sortableColumn = isSortable(col);
+
+ if (sortableColumn && col.isSelfSorted()) {
+ FormUtil.throwEnclFormReqExceptionIfNeed(context, column.getParent());
+ writer.writeAttribute(HTML.ONCLICK_ATTRIBUTE, createFunction(context,
col) , null);
+ writer.writeAttribute(HTML.STYLE_ATTRIBUTE, "cursor: pointer;",
null);
}
- // TODO anton - maybe we should have separate css class for column header???
- String headerClass = (String)
dataTable.getAttributes().get("headerClass");
-
- int columns = getColumnsCount(dataTable);
-
- if (header != null && header.isRendered()) {
-
- encodeTableHeaderFacet(context, columns, writer, header,
dataTable.getHeaderFirstRowSkinClass(),
- dataTable.getHeaderRowSkinClass(),
dataTable.getHeaderCellSkinClass(),
- // "rich-table-header",
- // TODO nick - rename classes!!!
- // "rich-table-header-continue",
- // "rich-table-headercell",
- headerClass, cellElement);
+
+ writer.startElement(HTML.DIV_ELEM, column);
+// writer.writeAttribute(HTML.ID_ATTRIBUTE, clientId + SORT_DIV, null);
+
+ if (sortableColumn) {
+ writer.startElement(HTML.SPAN_ELEM, column);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
"rich-table-sortable-header", null);
}
-
- if (isEncodeHeaders) {
- writer.startElement(HTML.TR_ELEMENT, dataTable);
- encodeStyleClass(writer, context, dataTable, "headerClass",
dataTable.getColumnHeaderSkinClass());// "rich-table-subheader");
- encodeHeaderFacets(context, writer, dataTable.columns(),
- dataTable.getColumnHeaderCellSkinClass()/*
"rich-table-subheadercell" */, headerClass, "header",
- cellElement, columns);
- writer.endElement(HTML.TR_ELEMENT);
- }
-
- if (encodeThead) {
- writer.endElement(HTML.THEAD_ELEMENT);
- }
}
- }
+ public void encodeEnd(FacesContext context, ResponseWriter writer, UIComponent
column, String facetName)
+ throws IOException {
- protected void encodeTableHeaderFacet(FacesContext context, int columns,
ResponseWriter writer, UIComponent footer,
- String skinFirstRowClass, String skinRowClass, String skinCellClass, String
footerClass, String element)
- throws IOException {
-
- if (footer instanceof Row) {
- Row row = (Row) footer;
-
- RowHolder holder = new RowHolder(context, row);
- holder.setCellElement(element);
- holder.setFirstRowClass(skinFirstRowClass);
- holder.setRowClass(skinRowClass);
- holder.setCellClass(skinCellClass);
- // holder.resetCurrentRow();
- holder.setHeaderRow(true);
-
- encodeRows(holder);
-
- } else {
- writer.startElement(HTML.TR_ELEMENT, footer);
-
- String rowClass = skinFirstRowClass;
- String cellClass = skinCellClass;
- if (footerClass != null && footerClass.trim().length() != 0) {
- rowClass = rowClass + " " + footerClass;
- cellClass = cellClass + " " + footerClass;
- }
-
- encodeStyleClass(writer, context, footer, null, rowClass);
-
- writer.startElement(element, footer);
-
- encodeStyleClass(writer, context, footer, null, cellClass);
-
- if (columns > 0) {
- writer.writeAttribute("colspan", String.valueOf(columns),
null);
- }
-
- writer.writeAttribute("scope", "colgroup", null);
-
- renderChild(context, footer);
-
- writer.endElement(element);
- writer.endElement(HTML.TR_ELEMENT);
}
- }
- protected void encodeHeaderFacets(FacesContext context, ResponseWriter writer,
Iterator<UIComponent> headers,
- String skinCellClass, String headerClass, String facetName, String element, int
colCount) throws IOException {
-
- int tColCount = 0;
-
- while (headers.hasNext()) {
- UIComponent column = headers.next();
- if (!column.isRendered()) {
- continue;
- }
-
- Integer colspan = (Integer) column.getAttributes().get("colspan");
- if (colspan != null && colspan.intValue() > 0) {
- tColCount += colspan.intValue();
- } else {
- tColCount++;
- }
-
- if (tColCount > colCount) {
- break;
- }
-
- String classAttribute = facetName + "Class";
-
- String columnHeaderClass = (String)
column.getAttributes().get(classAttribute);
-
- String styleClass = skinCellClass;
- if (headerClass != null && headerClass.trim().length() != 0) {
- styleClass = styleClass + " " + headerClass;
- }
-
- if (columnHeaderClass != null && columnHeaderClass.trim().length() !=
0) {
- styleClass = styleClass + " " + columnHeaderClass;
- }
-
- writer.startElement(element, column);
-
- encodeStyleClass(writer, context, column, null, styleClass);
-
- writer.writeAttribute("scope", "col", null);
- getUtils().encodeAttribute(context, column, "colspan");
-
- UIComponent facet = column.getFacet(facetName);
- if (facet != null && facet.isRendered()) {
- renderChild(context, facet);
- }
-
- writer.endElement(element);
+ public boolean isSortable(UIColumn column) {
+ return (column.getAttributes().get("sortBy") != null);
}
- }
-
- protected void encodeStyleClass(ResponseWriter writer, FacesContext context,
UIComponent component,
- String styleClassAttribute, String styleClass) throws IOException {
- boolean isEmpty = isEmptyAttr(component, styleClassAttribute);
- if (isEmpty && !(styleClass != null && styleClass.trim().length()
!= 0)) {
- return;
+
+ public String createFunction(FacesContext context,
org.richfaces.component.UIColumn column) {
+ //build script
+ return null;
}
- String componentStyleClass = isEmpty ? styleClass : styleClass + " "
- + component.getAttributes().get(styleClassAttribute);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE, componentStyleClass, null);
}
+
+ protected class SimpleHeaderEncodeStrategy implements HeaderEncodeStrategy {
- protected boolean isEmptyAttr(UIComponent component, String attribute) {
- if (attribute == null) {
- return true;
- }
- String value = (String) component.getAttributes().get(attribute);
- return !(value != null && value.trim().length() != 0);
- }
+ public void encodeBegin(FacesContext context, ResponseWriter writer, UIComponent
column, String facetName)
+ throws IOException {
- protected void encodeStyle(ResponseWriter writer, FacesContext context, UIComponent
component,
- String predefinedStyles) throws IOException {
- StringBuffer toEncode = new StringBuffer();
-
- if (!isEmptyAttr(component, HTML.STYLE_ATTRIBUTE)) {
- String style = ((String)
component.getAttributes().get(HTML.STYLE_ATTRIBUTE)).trim();
- style = style.endsWith(";") ? style : style + ";";
- toEncode.append(style);
}
- if (!isEmpty(predefinedStyles)) {
- String style = predefinedStyles.endsWith(";") ? predefinedStyles :
predefinedStyles + ";";
- toEncode.append(style);
- }
+ public void encodeEnd(FacesContext context, ResponseWriter writer, UIComponent
column, String facetName)
+ throws IOException {
- if (toEncode.length() > 0) {
- writer.writeAttribute(HTML.STYLE_ATTRIBUTE, toEncode.toString(), null);
}
}
- protected boolean isEmpty(String style) {
- return !((style != null) && (style.trim().length() != 0));
+ @Override
+ public boolean containThead() {
+ return true;
}
-
- protected String getTableSkinClass() {
- return "rich-table";
- }
-
- protected String getTableHeadSkinClass() {
- return "rich-table-head";
- }
-
- protected String getCaptionSkinClass() {
- return "rich-table-caption";
- }
-
}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRowsRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRowsRenderer.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRowsRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -0,0 +1,180 @@
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+
+import javax.faces.component.UIColumn;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
+
+
+public abstract class DataTableRowsRenderer extends AbstractRowsRenderer {
+
+ public static final String ROW_CLASS_KEY = "rowClass";
+
+ public static final String FIRST_ROW_CLASS_KEY = "firstRowClass";
+
+ public static final String CELL_CLASS_KEY = "cellClass";
+
+ public static final String CELL_ELEMENT_KEY = "cellElement";
+
+
+ public RowHolder encodeColumn(FacesContext context, UIColumn component,
ResponseWriter writer, RowHolder holder) throws IOException {
+
+ if (component instanceof org.richfaces.component.UIColumn) {
+ org.richfaces.component.UIColumn column = (org.richfaces.component.UIColumn)
component;
+ if (column.isBreakBefore() && holder.getProcessCell() != 0) {
+ encodeRowEnd(writer, context, column);
+ holder.nextRow();
+ holder.setRowStart(true);
+ }
+ }
+
+ if (holder.isRowStart()) {
+ if (holder.getCurrentRow() == 0) {
+ encodeFirstRowStart(writer, context, component, holder);
+ } else {
+ encodeRowStart(writer, context, component, holder);
+ }
+
+ holder.setRowStart(false);
+ }
+
+ encodeColumnStart(writer, context, component, holder);
+ renderChildren(context, component);
+ encodeColumnEnd(writer, context, component, holder);
+
+ if (holder.isLastColumn()) {
+ if (holder.getCurrentRow() == 0) {
+ encodeFirstRowEnd(writer, context, component);
+ } else {
+ encodeRowEnd(writer, context, component);
+ }
+ }
+ holder.nextCell();
+
+ return holder;
+ }
+
+ public void encodeColumnStart(ResponseWriter writer, FacesContext context,
UIComponent component, RowHolderBase holder) throws IOException {
+ writer.startElement(getCellElement(context), component);
+ String cellClass = getCellClass(holder.getContext());
+ encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, cellClass);
+
+ if (component instanceof org.richfaces.component.UIColumn) {
+ org.richfaces.component.UIColumn column = (org.richfaces.component.UIColumn)
component;
+
+ int rowspan = column.getRowspan();
+ if (rowspan != Integer.MIN_VALUE) {
+ writer.writeAttribute("rowspan", Integer.valueOf(rowspan),
null);
+ }
+
+ int colspan = column.getColspan();
+ if (colspan != Integer.MIN_VALUE) {
+ writer.writeAttribute("colspan", Integer.valueOf(colspan),
null);
+ }
+ }
+ }
+
+ public void encodeColumnEnd(ResponseWriter writer, FacesContext context, UIComponent
component, RowHolderBase holder) throws IOException {
+ writer.endElement(getCellElement(context));
+ }
+
+ public void encodeFirstRowStart(ResponseWriter writer, FacesContext context,
UIComponent component, RowHolderBase holder) throws IOException {
+ writer.startElement(HTML.TR_ELEMENT, component);
+ getUtils().encodeId(context, component);
+ String styleClass = getFirstRowClass(holder.getContext());
+ encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, styleClass);
+ }
+
+ public void encodeFirstRowEnd(ResponseWriter writer, FacesContext context,
UIComponent component)throws IOException {
+ writer.endElement(HTML.TR_ELEMENT);
+ }
+
+ public void encodeRowStart(ResponseWriter writer, FacesContext context, UIComponent
component, RowHolderBase holder) throws IOException {
+ writer.startElement(HTML.TR_ELEMENT, component);
+ getUtils().encodeId(context, component);
+ String styleClass = getRowClass(holder.getContext());
+ encodeStyleClass(writer, context, component, HTML.STYLE_CLASS_ATTR, styleClass);
+ }
+
+ public void encodeRowEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
+ writer.endElement(HTML.TR_ELEMENT);
+ }
+
+
+ protected String getFirstRowClass(FacesContext context) {
+ return getFromRequest(context, FIRST_ROW_CLASS_KEY);
+ }
+
+ protected String getRowClass(FacesContext context) {
+ return getFromRequest(context, ROW_CLASS_KEY);
+ }
+
+ protected String getCellClass(FacesContext context) {
+ return getFromRequest(context, CELL_CLASS_KEY);
+ }
+
+ protected String getCellElement(FacesContext context) {
+ return getFromRequest(context, CELL_ELEMENT_KEY);
+ }
+
+ private String getFromRequest(FacesContext context, String key) {
+ return (String)context.getExternalContext().getRequestMap().get(key);
+ }
+
+ protected void saveToRequest(FacesContext context, String key, String value) {
+ context.getExternalContext().getRequestMap().put(key, value);
+ }
+
+ protected void saveRowStyles(FacesContext context, String firstRowClass, String
rowClass, String cellClass) {
+ saveToRequest(context, FIRST_ROW_CLASS_KEY, firstRowClass);
+ saveToRequest(context, ROW_CLASS_KEY, rowClass);
+ saveToRequest(context, CELL_CLASS_KEY, cellClass);
+ }
+
+ public void encodeStyleClass(ResponseWriter writer, FacesContext context, UIComponent
component,
+ String styleClassAttribute, String styleClass) throws IOException {
+
+ boolean isEmpty = isEmptyAttr(component, styleClassAttribute);
+ if (isEmpty && !(styleClass != null &&
styleClass.trim().length() != 0)) {
+ return;
+ }
+
+ String componentStyleClass = isEmpty ? styleClass : styleClass + "
"
+ + component.getAttributes().get(styleClassAttribute);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE, componentStyleClass, null);
+ }
+
+ protected boolean isEmptyAttr(UIComponent component, String attribute) {
+ if (attribute == null) {
+ return true;
+ }
+
+ String value = (String) component.getAttributes().get(attribute);
+ return !(value != null && value.trim().length() != 0);
+ }
+
+ protected void encodeStyle(ResponseWriter writer, FacesContext context, UIComponent
component,
+ String predefinedStyles) throws IOException {
+
+ StringBuffer toEncode = new StringBuffer();
+
+ if (!isEmptyAttr(component, HTML.STYLE_ATTRIBUTE)) {
+ String style = ((String)
component.getAttributes().get(HTML.STYLE_ATTRIBUTE)).trim();
+ style = style.endsWith(";") ? style : style + ";";
+ toEncode.append(style);
+ }
+
+ if (!isEmpty(predefinedStyles)) {
+ String style = predefinedStyles.endsWith(";") ? predefinedStyles :
predefinedStyles + ";";
+ toEncode.append(style);
+ }
+
+ if (toEncode.length() > 0) {
+ writer.writeAttribute(HTML.STYLE_ATTRIBUTE, toEncode.toString(), null);
+ }
+ }
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -330,4 +330,36 @@
}
return width;
}
+
+
+
+ @Override
+ public void encodeTableStructure(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable)
+ throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public RowHolder createRowHolder(FacesContext context, UIComponent component) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ protected void encodeTableFacet(FacesContext context, ResponseWriter writer, int
columns, UIComponent facet,
+ String facetName, String rowClass, String cellClass) throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean containThead() {
+ return false;
+ }
+
+ @Override
+ public HeaderEncodeStrategy getHeaderEncodeStrategy(UIComponent column, String
tableFacetName) {
+ return null;
+ }
}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/HeaderEncodeStrategy.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/HeaderEncodeStrategy.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/HeaderEncodeStrategy.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -0,0 +1,38 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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 library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+public interface HeaderEncodeStrategy {
+
+ public abstract void encodeBegin(FacesContext context, ResponseWriter writer,
+ UIComponent column, String facetName) throws IOException;
+
+ public abstract void encodeEnd(FacesContext context, ResponseWriter writer,
+ UIComponent column, String facetName) throws IOException;
+
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolder.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolder.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolder.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -3,87 +3,60 @@
import javax.faces.context.FacesContext;
import org.richfaces.component.Row;
-import org.richfaces.component.UIColumnGroup;
-import org.richfaces.component.UIDataTable;
-import org.richfaces.component.UISubTable;
public class RowHolder extends RowHolderBase {
- private String cellElement;
+ private Row row;
+
+ private int processCell;
+
+ private boolean isLastColumn;
+
+ private boolean isRowStart;
- private String cellClass;
-
- private String rowClass;
-
- private String firstRowClass;
-
- private boolean headerRow;
- private Row row;
-
+ public Row getRow() {
+ return this.row;
+ }
+
public RowHolder(FacesContext context, Row row) {
+ this(context, row, 0, true);
+
+ }
+
+ public RowHolder(FacesContext context, Row row, int processCell, boolean isRowStart)
{
super(context);
this.row = row;
+ this.processCell = processCell;
+ this.isRowStart = isRowStart;
}
- public boolean isHeaderRow() {
- return headerRow;
+ public int getProcessCell() {
+ return processCell;
}
- public void setHeaderRow(boolean headerRow) {
- this.headerRow = headerRow;
+ public void resetProcessCell() {
+ this.processCell = 0;
}
-
- public String getCellClass() {
- return this.cellClass;
+
+ public void nextCell(){
+ processCell++;
}
-
- public void setCellClass(String cellClass) {
- this.cellClass = cellClass;
+
+ public boolean isLastColumn() {
+ return isLastColumn;
}
- public String getRowClass() {
- return this.rowClass;
+ public void lastColumn(boolean lastColumn) {
+ this.isLastColumn = lastColumn;
}
-
- public void setRowClass(String rowClass) {
- this.rowClass = rowClass;
+
+ public boolean isRowStart() {
+ return isRowStart;
}
- public String getFirstRowClass() {
- return this.firstRowClass;
+ public void setRowStart(boolean isRowStart) {
+ this.isRowStart = isRowStart;
}
-
- public void setFirstRowClass(String firstRowClass) {
- this.firstRowClass = firstRowClass;
- }
-
- public String getCellElement() {
- return cellElement;
- }
-
- public void setCellElement(String cellElement) {
- this.cellElement = cellElement;
- }
-
- public Row getRow() {
- return this.row;
- }
-
- public void setRow(Row row) {
- this.row = row;
- }
-
- public boolean isColGroup() {
- return row instanceof UIColumnGroup;
- }
-
- public boolean isSubTable() {
- return row instanceof UISubTable;
- }
-
- public boolean isDataTable() {
- return row instanceof UIDataTable;
- }
-
+
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolderBase.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolderBase.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/RowHolderBase.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -8,10 +8,15 @@
private FacesContext context;
- private int currentRow = 0;
+ private int currentRow;
public RowHolderBase(FacesContext context) {
+ this(context, 0);
+ }
+
+ public RowHolderBase(FacesContext context, int currentRow) {
this.context = context;
+ currentRow = 0;
}
public FacesContext getContext() {
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/SubTableRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/SubTableRenderer.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/SubTableRenderer.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -0,0 +1,80 @@
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.faces.component.UIColumn;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.richfaces.component.Row;
+import org.richfaces.component.UIDataTableBase;
+import org.richfaces.component.UISubTable;
+
+public class SubTableRenderer extends AbstractTableRenderer {
+
+ @Override
+ public void encodeTableFacets(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable)
+ throws IOException {
+ UISubTable subTable = (UISubTable)dataTable;
+
+ encodeHeaderFacet(writer, context, subTable);
+
+ String rowClass = subTable.getRowSkinClass();
+ String cellClass = subTable.getCellSkinClass();
+ String firstClass = subTable.getFirstRowSkinClass();
+
+ rowClass = mergeStyleClasses("rowClass", rowClass, subTable);
+ cellClass = mergeStyleClasses("cellClass", cellClass, subTable);
+ firstClass = mergeStyleClasses("firstRowClass", firstClass, subTable);
+
+ saveRowStyles(context, firstClass, rowClass, cellClass);
+ }
+
+ @Override
+ public void encodeTableStart(ResponseWriter writer, FacesContext context,
UIDataTableBase dataTable) throws IOException {
+ saveToRequest(context, CELL_ELEMENT_KEY, HTML.TD_ELEM);
+ UISubTable subTable = (UISubTable)dataTable;
+ encodeTableBodyStart(writer, context, subTable);
+ }
+
+ @Override
+ public RowHolderBase createRowHolder(FacesContext context, UIComponent component) {
+ return new RowHolder(context, (UISubTable)component);
+ }
+
+ @Override
+ public void encodeRow(RowHolderBase holder) throws IOException {
+ RowHolder rowHolder = (RowHolder)holder;
+ Row row = rowHolder.getRow();
+ Iterator<UIComponent> components = row.columns();
+ FacesContext context = rowHolder.getContext();
+ ResponseWriter writer = context.getResponseWriter();
+
+ while(components.hasNext()) {
+ UIColumn column = (UIColumn)components.next();
+ rowHolder.lastColumn(!components.hasNext());
+ encodeColumn(context, column, writer, rowHolder);
+ }
+ }
+
+ @Override
+ protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
+ UISubTable subTable = (UISubTable)component;
+ encodeFooterFacet(writer, context, subTable);
+ encodeTableBodyEnd(writer, context, subTable);
+ }
+
+ @Override
+ public boolean containThead() {
+ return false;
+ }
+
+ @Override
+ public HeaderEncodeStrategy getHeaderEncodeStrategy(UIComponent column, String
tableFacetName) {
+ // TODO implement column header facet
+ return null;
+ }
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java 2009-12-21
15:19:30 UTC (rev 16177)
@@ -13,6 +13,7 @@
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.javascript.ScriptUtils;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
import org.ajax4jsf.renderkit.RendererBase;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.richfaces.component.Expandable;
@@ -25,7 +26,7 @@
*
*/
@ResourceDependencies( {@ResourceDependency(library = "javax.faces", name =
"jsf-uncompressed.js"),
- @ResourceDependency(name = "richfaces.js"), @ResourceDependency(name =
"toggler.js")})
+ @ResourceDependency(name = "richfaces.js"),
@ResourceDependency(name="richfaces-queue.js"), @ResourceDependency(name =
"toggler.js")})
public abstract class ToggleControlRendererBase extends RendererBase {
private static final String MANAGER_SCRIPT =
"RichFaces.ui.ToggleManager.addToggler(new
RichFaces.ui.Toggle(''{0}'', {1}));";
@@ -61,11 +62,15 @@
boolean newState = Boolean.valueOf(state).booleanValue();
UIComponent processed = findComponent(context, toggle);
if (processed instanceof Expandable) {
-
+
boolean prevState = ((Expandable) processed).isExpanded();
if (newState != prevState) {
new ToggleEvent(processed, newState).queue();
}
+//
toggle.getExecute().add((String)processed.getAttributes().get("clientId"));
+//
toggle.getRender().add((String)processed.getAttributes().get("clientId"));
+
toggle.addExecuteId((String)processed.getAttributes().get("clientId"));
+
toggle.addRenderId((String)processed.getAttributes().get("clientId"));
}
}
}
@@ -146,6 +151,10 @@
options.put("formId", formId);
options.put("forId", forId);
options.put("initialState", (Boolean) subTable.isExpanded());
+ options.put("eventName", toggleControl.getEvent());
+ if(subTable.getSwichType().equals(UISubTable.SWITCH_TYPE_AJAX)) {
+ options.put("ajax", AjaxRendererUtils.buildEventOptions(context,
subTable));
+ }
return ScriptUtils.toScript(options);
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/old_configs/component/tables.xml
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/old_configs/component/tables.xml 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/old_configs/component/tables.xml 2009-12-21
15:19:30 UTC (rev 16177)
@@ -29,7 +29,7 @@
<classname>org.richfaces.component.html.HtmlToggleControl</classname>
<superclass>org.richfaces.component.UIToggleControl</superclass>
- <renderer generate="true" override="true">
+ <renderer>
<name>org.richfaces.renderkit.html.ToggleControlRenderer</name>
<template>org/richfaces/renderkit/html/toggle-control.template.xml</template>
</renderer>
@@ -43,14 +43,10 @@
</component>
<component>
- <name>org.richfaces.Colgroup</name>
- <family>org.richfaces.Colgroup</family>
+ <name>org.richfaces.ColumnGroup</name>
+ <family>org.richfaces.ColumnGroup</family>
<classname>org.richfaces.component.html.HtmlColumnGroup</classname>
<superclass>org.richfaces.component.UIColumnGroup</superclass>
- <renderer generate="true">
- <name>org.richfaces.renderkit.html.SimpleColgroupRenderer</name>
- <template>org/richfaces/renderkit/html/colgroup.template.xml</template>
- </renderer>
<tag>
<name>colGroup</name>
<classname>
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/table.css
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/table.css 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/table.css 2009-12-21
15:19:30 UTC (rev 16177)
@@ -9,7 +9,7 @@
.rich-table-row{
}
-.rich-table-firstrow{
+.rich-table-first-row{
}
.rich-table-cell{
@@ -41,7 +41,7 @@
.rich-table-header{
}
-.rich-table-header-continue{
+.rich-table-header-first {
}
.rich-table-header-cell{
@@ -58,6 +58,9 @@
.rich-table-subheader{
}
+.rich-table-subheader-first {
+}
+
.rich-table-subheader-cell{
border-bottom:1px solid #C0C0C0;
border-right:1px solid #C0C0C0;
@@ -67,6 +70,12 @@
padding:4px;
}
+.rich-table-subfooter {
+}
+
+.rich-table-subfooter-first {
+}
+
.rich-table-subfooter-cell{
border-bottom:1px solid #C0C0C0;
border-right:1px solid #C0C0C0;
@@ -83,7 +92,7 @@
.rich-table-footer{
}
-.rich-table-footer-continue{
+.rich-table-footer-first{
}
.rich-table-footer-cell{
@@ -97,7 +106,8 @@
text-align:left;
}
-.rich-subtable-footer{
+/*--------------------------------------------*/
+.rich-subtable-footer {
background-color: #7878B4;
}
@@ -114,7 +124,6 @@
.rich-subtable-header-row {
background-color: grey;
-
}
.rich-subtable-header-cell {
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js 2009-12-21
15:19:30 UTC (rev 16177)
@@ -121,13 +121,13 @@
},
ajaxToggle: function(expand){
- if(richfaces.ajax && typeof richfaces.ajax == 'function') {
this.saveState(expand);
var source = this.id;
var event = this.options.eventName;
var params = this.options.ajax;
+ params['org.richfaces.ajax.component'] = source;
jsf.ajax.request(source, event, params);
- }
+
},
command: function(name, element){
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml 2009-12-21
07:22:35 UTC (rev 16176)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml 2009-12-21
15:19:30 UTC (rev 16177)
@@ -27,15 +27,15 @@
<tag>
<tag-name>colGroup</tag-name>
<component>
- <component-type>org.richfaces.Colgroup</component-type>
- <!-- renderer-type>org.richfaces.ColumnGroupRenderer</renderer-type -->
+ <component-type>org.richfaces.ColumnGroup</component-type>
+ <renderer-type>org.richfaces.ColumnGroupRenderer</renderer-type>
</component>
</tag>
<tag>
<tag-name>subTable</tag-name>
<component>
<component-type>org.richfaces.SubTable</component-type>
- <!--
renderer-type>org.richfaces.renderkit.SubTableRenderer</renderer-type-->
+ <renderer-type>org.richfaces.SubTableRenderer</renderer-type>
<handler-class>org.richfaces.taglib.SubTableHandler</handler-class>
</component>
</tag>