[jboss-cvs] jboss-seam/src/ui/org/jboss/seam/ui ...

Peter Muir peter at bleepbleep.org.uk
Sun Jan 28 18:36:58 EST 2007


  User: pmuir   
  Date: 07/01/28 18:36:58

  Added:       src/ui/org/jboss/seam/ui  UISelectItems.java
  Log:
  JBSEAM-709 Initial work on s:selectItems
  
  Revision  Changes    Path
  1.1      date: 2007/01/28 23:36:58;  author: pmuir;  state: Exp;jboss-seam/src/ui/org/jboss/seam/ui/UISelectItems.java
  
  Index: UISelectItems.java
  ===================================================================
  package org.jboss.seam.ui;
  
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  
  import javax.faces.FacesException;
  import javax.faces.component.ValueHolder;
  import javax.faces.context.FacesContext;
  import javax.faces.el.ValueBinding;
  import javax.faces.model.DataModel;
  import javax.faces.model.SelectItem;
  
  public class UISelectItems extends javax.faces.component.UISelectItems {
  	
  	public static final String COMPONENT_TYPE = "org.jboss.seam.ui.UISelectItems";
     
     private static final String NO_SELECTION_VALUE = "";
  	
  	private String noSelectionLabel;
  	private Boolean hideNoSelection;
  	private String var;
  	private String label;
  	private Boolean disabled;
  	
  	public String getNoSelectionLabel() {
  		if (noSelectionLabel != null) {
  			return noSelectionLabel;
  		} else {
  			return getString("noSelectionLabel");
  		}
  	}
  
  	public void setNoSelectionLabel(String noSelectionLabel) {
  		this.noSelectionLabel = noSelectionLabel;
  	}
  
  	public boolean isHideNoSelection() {
  		if (hideNoSelection != null) {
  			return hideNoSelection;
  		} else {
  			return getBoolean("hideNoSelection");
  		}
  	}
  
  	public void setHideNoSelection(boolean hideNoSelection) {
  		this.hideNoSelection = hideNoSelection;
  	}
  	
  	public String getVar() {
  		return var;
  	}
  
  	public void setVar(String var) {
  		this.var = var;
  	}
  
  	public String getLabel() {
  		if (label != null) {
  			return label;
  		} else {
  			return getString("label");
  		}
  	}
  
  	public void setLabel(String label) {
  		this.label = label;
  	}
  	
  	public boolean isDisabled() {
  		if (disabled != null) {
  			return disabled;
  		} else {
  			Boolean value = getBoolean("disabled");
  			return value != null ? value : false;
  		}
  	}
  
  	public void setDisabled(boolean disabled) {
  		this.disabled = disabled;
  	}
  
  	@Override
  	public void restoreState(FacesContext context, Object state) {
  		Object[] values = (Object[]) state;
  		super.restoreState(context, values[0]);
  		noSelectionLabel = (String) values[1];
  		hideNoSelection = (Boolean) values[2];
  		var = (String) values[3];
  		label = (String) values[4];
  		disabled = (Boolean) values[5];
  	}
  	
  	@Override
  	public Object saveState(FacesContext context) {
  		
  		Object[] values = new Object[6];
  		values[0] = super.saveState(context);
  		values[1] = noSelectionLabel;
  		values[2] = hideNoSelection;
  		values[3] = var;
  		values[4] = label;
  		values[5] = disabled;
  		return values;
  	}
  	
  	private String getString(String localName) {
  		if (getValueBinding(localName) == null) {
  			return null;
  		} else {
  			return (String) getValueBinding(localName).getValue(getFacesContext());
  		}
  	}
  	
  	private Object getObject(String localName) {
  		if (getValueBinding(localName) == null) {
  			return null;
  		} else {
  			return getValueBinding(localName).getValue(getFacesContext());
  		}
  	}
  	
  	private Boolean getBoolean(String localName) {
  		if (getString(localName) != null) {
  			return Boolean.valueOf(getString(localName));
  		} else {
  			return null;
  		}
  	}
  	
     @Override
  	public Object getValue() {
  			return createSelectItems(super.getValue());
  	}
  	
  	private Object createSelectItems(Object value) {
  		Iterable<?> iterable = null;
  		if (value instanceof DataModel) {
  			value = ((DataModel) value).getWrappedData();
  		}
  		if (value.getClass().isArray()) {
  			iterable = Arrays.asList((Object[]) value);
  		} else if (value instanceof Iterable) {
  			iterable = (Iterable) value;
  		}
  		if (iterable != null) {
  			List<SelectItem> selectItems = new ArrayList<SelectItem>();
  			addNoSelectionLabel(selectItems, iterable);
  			for (Object o : iterable) {
  				initVar(o);
  				selectItems.add(new SelectItem(o, getLabel(), "", isDisabled()));
  				destroyVar();
  			}
  			return selectItems;
  		} else {
  			ValueBinding vb = this.getValueBinding("value");
  			if (vb != null) {
  				throw new IllegalArgumentException("selectItems' value=\"" + vb.getExpressionString() + "\" must implement java.lang.Iteratable, be an array or a JSF DataModel but it is " + iterable + " (" + vb.getType(getFacesContext()) + ")");	
  			} else {
  				throw new IllegalArgumentException("selectItems' value must implement java.lang.Iteratable, be an array or a JSF DataModel but is " + iterable);
  			}
  			
  		}
  	}
  	
  	private boolean addNoSelectionLabel(List<SelectItem> selectItems, Object originalValue) {
  		boolean add = true;
  		if (isHideNoSelection() &&  getParentValue() != null){
  			add = false;
  		}
  		if (add && getNoSelectionLabel() != null) {
  			SelectItem s = new SelectItem(NO_SELECTION_VALUE, getNoSelectionLabel());
  			selectItems.add(s);
  			return true;
  		} else {
  			return false;
  		}
  	}
  	
  	@SuppressWarnings("unchecked")
  	private void initVar(Object varValue) {
  		if (getVar() == null) {
  			throw new FacesException("var attribute must be set");
  		}
  		getFacesContext().getExternalContext().getRequestMap().put(
  				getVar(), varValue);
  	}
  	
  	private void destroyVar() {
  		getFacesContext().getExternalContext().getRequestMap().remove(
  				getVar());
  	}
  	
  	private Object getParentValue() {
  		if (getParent() instanceof ValueHolder) {
  			ValueHolder parent = (ValueHolder) getParent();
  			return parent.getValue();
  		} else {
  			return null;
  		}
  	}
  }
  
  



More information about the jboss-cvs-commits mailing list