[jboss-user] [Beginners Corner] - a4j help
philbrowndotcom
do-not-reply at jboss.com
Wed Jun 20 13:39:36 EDT 2007
I'm trying to create a jsf custom table component extending HtmlDataTable. I need to implement pagination so I want to incorporate command links for first, last, next, and prev. How do I get the commandLinks to fire the methods in the component to update its attributes and reRender the entire component. I was moving in the direction of using A4J, but could not get the reRendering to occur. Here is what I have so far.
|
| /*
| * Created on Jul 19, 2004
| *
| */
| package net.em.com.components;
|
| import java.util.ArrayList;
| import javax.el.ValueExpression;
| import javax.faces.context.FacesContext;
| import javax.faces.component.html.HtmlDataTable;
| import javax.faces.component.html.HtmlOutputText;
| import net.em.com.tags.table.ListAlgorithm;
| import org.ajax4jsf.ajax.html.HtmlAjaxCommandLink;
| import org.ajax4jsf.framework.ajax.AjaxEvent;
| import org.ajax4jsf.framework.ajax.AjaxListener;
| import org.apache.commons.logging.Log;
| import org.apache.commons.logging.LogFactory;
|
| public class UITable extends HtmlDataTable implements AjaxListener {
|
| private static final Log log = LogFactory.getLog(UITable.class);
|
| // To support commands on the data prior to sorting and pagination
| private Class algorithm = null;
| private String algorithmCriteria = "";
| private boolean algorithmApplied = false ;
|
| // To Support pagination
| private boolean paginate = false ;
| private int pageSize = 10 ;
| private int currentPage = 1 ;
| private String firstTxt = "First" ;
| private String lastTxt = "Last" ;
|
| //To Support AJAX
| private String reRender ;
| private String eventsQueue = "dummy" ;
| private int requestDelay = 10 ;
|
| public void processAjax(AjaxEvent event) {
| Object j = event ;
| }
|
| public Object saveState(FacesContext context) {
| return super.saveState(context);
| }
| public void restoreState(FacesContext context, Object state) {
| super.setRendered(true) ;
| this.currentPage = 3 ;
| super.restoreState(context, state);
|
| }
| public String getFamily(){
| return "em.EmTable";
| }
| public String getRendererType(){
| return "javax.faces.Table";
| }
|
| public String getAlgorithmCriteria() {
| return algorithmCriteria;
| }
|
| public void setAlgorithmCriteria(String algorithmCriteria) {
| this.algorithmCriteria = algorithmCriteria;
| }
|
| public String getAlgorithmClass() {
| return (this.algorithm != null) ? this.algorithm.toString() : "";
| }
|
| public void setAlgorithmClass(String val) {
| if(val.length() > 0) {
| try {
| this.algorithm = Class.forName(val);
| if(!IterableAlgorithm.class.isAssignableFrom(this.algorithm)) {
| this.algorithm = null;
| }
| } catch (Exception e) {
| this.algorithm = null;
| }
| } else {
| this.algorithm = null;
| }
| if(this.algorithm == null) {
| log.info(this.getClass().toString() + ":setAlgorithm(String className)");
| log.info(val + "not of type: " + ListAlgorithm.class.toString());
| } else {
| this.algorithmApplied = false ;
| }
| }
|
| public void setValue(Object value) {
| this.algorithmApplied = false ;
| if(!Iterable.class.isAssignableFrom(value.getClass())) {
| ArrayList list = new ArrayList() ;
| list.add(value) ;
| super.setValue(list) ;
| } else {
| super.setValue(value) ;
| }
| }
|
| public Object getValue() {
| if(this.algorithmApplied == false && this.algorithm != null) {
| this.algorithmApplied = true ;
| setValue(applyAlgorithm((Iterable)super.getValue())) ;
| }
| if(isPaginate()){
| setRows(this.getPageSize());
| }
| //return retVal ;
| return super.getValue();
| }
|
| public void next() {
| setFirst(getFirst() + getPageSize());
| setCurrentPage(getCurrentPage() + 1);
| //enable prev
| if((getFirst() + getPageSize()) >= getRows()){
| //no more rows to display, disable "next" button?
| }
| }
| public void prev() {
|
|
| if((getFirst() - getPageSize()) < 0){
| setFirst(0);
| setCurrentPage(1);
| //hit start of table, diable "prev" button?
| }else{
| setFirst(getFirst() - getPageSize());
| setCurrentPage(getCurrentPage() - 1);
| //enable next
| }
| }
| public void last() {
| this.setFirst((getRows()/getPageSize()) * getPageSize());
| this.setCurrentPage(getRows()/getPageSize());
| //disable next, enable prev
|
| }
| public void first() {
| setFirst(0);
| setCurrentPage(1);
|
| //disable prev, enable next
| }
| public int getCurrentPage() {
| return (Integer)getProperty("currentPage", this.currentPage) ;
| }
|
| public void setCurrentPage(int currentPage) {
| this.currentPage = currentPage;
| }
|
| private Iterable applyAlgorithm(Iterable original) {
| this.algorithmApplied = true;
| Iterable results;
| try {
| IterableAlgorithm a = (IterableAlgorithm)this.algorithm.newInstance();
| a.setCriteria(this.getAlgorithmCriteria());
| results = a.Manipulate(original);
| } catch (Exception e) {
| e.printStackTrace();
| log.info(this.getClass().toString() + ":applyAlgorithm()");
| log.info(this.algorithm.toString() + " must support non parametized constructor" );
| log.info("algorithm not applied");
|
| results = original;
| }
| return results;
| }
|
| public boolean isPaginate() {
| return (Boolean)getProperty("paginate", this.paginate) ;
| }
|
| public void setPaginate(boolean paginate) {
| this.paginate = paginate;
| }
|
| public int getPageSize() {
| return (Integer)getProperty("pageSize", this.pageSize) ;
| }
|
| public void setPageSize(int pageSize) {
| this.pageSize = pageSize;
| }
|
| private Object getProperty(String att, Object field) {
| if (field != null) return field;
| ValueExpression ve = this.getValueExpression(att);
| if (ve != null) return (String) ve.getValue(this.getFacesContext().getELContext());
| return null;
| }
|
| public HtmlAjaxCommandLink getCmdLnkLast(FacesContext facesCtx) {
|
| HtmlAjaxCommandLink cmdLnkLast = (HtmlAjaxCommandLink)getComponent(facesCtx, HtmlAjaxCommandLink.COMPONENT_TYPE) ;
| cmdLnkLast.setParent(this) ;
| cmdLnkLast.setId(this.getId() + "_LAST");
| cmdLnkLast.setReRender(this.getId()) ;
| cmdLnkLast.setRequestDelay(this.requestDelay) ;
| cmdLnkLast.setEventsQueue(this.eventsQueue) ;
|
| HtmlOutputText text = (HtmlOutputText)getComponent(facesCtx, HtmlOutputText.COMPONENT_TYPE) ;
| text.setValue(this.lastTxt) ;
|
| cmdLnkLast.getChildren().add(text) ;
|
| return cmdLnkLast;
| }
|
| private Object getComponent(FacesContext facesCtx, String name) {
| return facesCtx.getApplication().createComponent(name) ;
| }
|
| public void setReRender(String reRender) {
| this.reRender = reRender;
| }
| }
|
|
| /*
| * Created on Jul 19, 2004
| *
| */
| package net.em.com.components;
|
| import com.sun.faces.renderkit.html_basic.TableRenderer;
| import java.io.IOException;
| import javax.faces.component.UIComponent;
| import javax.faces.context.FacesContext;
| import javax.faces.render.Renderer;
|
| public class UITableRenderer extends TableRenderer {
|
|
| public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
| UITable table = (UITable)component ;
|
| render(context, table.getCmdLnkLast(context)) ;
|
| super.encodeBegin(context, component) ;
| }
| public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
| super.encodeEnd(context, component) ;
| }
| public void decode(FacesContext context, UIComponent component) {
| super.decode(context, component) ;
| }
|
| private void render(FacesContext context, UIComponent component) throws IOException {
| Renderer renderer = getRendererFor(context, component) ;
| renderer.encodeBegin(context, component) ;
| renderer.encodeChildren(context, component) ;
| renderer.encodeEnd(context, component) ;
| }
|
| private Renderer getRendererFor(FacesContext context, UIComponent c) {
| return context.getRenderKit().getRenderer(c.getFamily(), c.getRendererType());
| }
|
| }
|
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4056149#4056149
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4056149
More information about the jboss-user
mailing list