?? comboselecttag.java
字號:
package ar.com.koalas.providers.taglibs.comboselect;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.Transformer;
import org.apache.struts.util.RequestUtils;
public class ComboSelectTag extends BodyTagSupport {
private static final String ID_COMBO = ComboSelectTag.class.getName() + ".idCombo";
private String property = null;
private String name = null;
private String metadata;
private String[] metadataArray;
private String[] cmbnames;
private String[] cmbvalues;
private String[] cmbonchange;
private int id;
private String addAllLabel = null;
private String addSelectLabel = null;
private List v = null;
private Map selectData = null;
public void addDdl(Ddl d) {
v.add(d);
}
public void putSelectData(String property, SelectData data) {
this.selectData.put(property, data);
}
private Iterator getFilteredIterator(final String parentKey, Map item, SelectData data) {
if(parentKey==null)
return data.getIterator();
Iterator sdItInput = data.getIterator();
//pasa el iterator a una coleccion.
Collection colAux = CollectionUtils.collect(sdItInput, new Transformer() { public Object transform(Object arg0) { return arg0; }});
data.setIterator(colAux.iterator());
//filtra solo los que coincidan con el key del padre
final Object parentKeyValue = item.get(parentKey);
Collection filtered = CollectionUtils.select(colAux, new Predicate() {
public boolean evaluate(Object obj) {
try {
Object key = BeanUtils.getProperty(obj, parentKey);
//TODO controlar null, tipos, etc...
return parentKeyValue.equals(key);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
});
return filtered.iterator();
}
private void populateMatrix(Collection col, Map item, Ddl ddl, int[] level, String parentKey) {
SelectData data = (SelectData)this.selectData.get(ddl.getProperty());
Iterator sdIt = this.getFilteredIterator(parentKey, item, data);
while(sdIt.hasNext()) {
Object obj = sdIt.next();
try {
Object key = BeanUtils.getProperty(obj, data.getKey());
Object description = BeanUtils.getProperty(obj, data.getDescription());
item.put(data.getKey(), key);
item.put(data.getDescription(), description);
} catch (Exception e) {
e.printStackTrace();
}
level[0]++;
if(level[0]<v.size()) {
Ddl ddlnext = (Ddl)v.get(level[0]);
this.populateMatrix(col, item, ddlnext, level, data.getKey());
level[0]--;
} else {
level[0]--;
col.add(new HashMap(item));
}
}
}
private Collection getPropertyFromContext() throws JspException {
//primero me fijo si tengo selectData
if(this.selectData.size()>0) {
Ddl ddlroot = (Ddl)v.get(0); //obtiene el primero
Collection col = new ArrayList();
this.populateMatrix(col, new HashMap(), ddlroot, new int[] {0}, null);
return col;
} else {
// Identify the bean containing our collection
Object bean = null;
try {
if (name != null)
if (property != null)
bean = RequestUtils.lookup(pageContext, name, property, "request");
else
bean = RequestUtils.lookup(pageContext, name, "request");
else
bean = RequestUtils.lookup(pageContext, property, "request");
} catch (Exception ex) {
}
if(bean==null) {
try {
if (name != null)
if (property != null)
bean = RequestUtils.lookup(pageContext, name, property, "session");
else
bean = RequestUtils.lookup(pageContext, name, "session");
else
bean = RequestUtils.lookup(pageContext, property, "session");
} catch (Exception ex) {
}
}
if (bean == null && this.property!=null)
bean = pageContext.findAttribute(this.property);
if (bean == null)
return null;
Collection col = (Collection) bean;
if (col.size() == 0) {
return null;
}
return col;
}
}
public void setProperty(String c) {
this.property = c;
}
public void setName(String c) {
this.name = c;
}
public String getName() {
return this.name;
}
public void setMetadata(String c) {
this.metadata=c;
}
private void loadSelectData() throws JspException {
//obtiene el vector de Ddl's
if (v == null) {
throw new JspException("No se informaron selects");
}
cmbnames = new String[v.size()];
cmbvalues = new String[v.size()];
cmbonchange = new String[v.size()];
for (int i = 0; i < v.size(); i++) {
cmbnames[i] = ((Ddl) v.get(i)).getName();
cmbvalues[i] = ((Ddl) v.get(i)).getValue();
cmbonchange[i] = ((Ddl) v.get(i)).getOnChange();
}
}
public int doStartTag() {
this.v=new ArrayList();
this.selectData=new HashMap();
return (EVAL_BODY_INCLUDE);
}
public int doEndTag() throws JspException {
metadataArray=null;
this.validate();
HttpServletRequest request = ((HttpServletRequest) pageContext.getRequest());
Collection elementos = this.getPropertyFromContext();
if(elementos==null)
return EVAL_PAGE;
//Determina el Id seg鷑 variables del request.
Integer value = (Integer) ((HttpServletRequest) pageContext.getRequest()).getAttribute(ID_COMBO);
if (value == null) {
//es el primer tag utilizado en el request.
id = 0;
} else {
id = value.intValue();
id++;
}
request.setAttribute(ID_COMBO, new Integer(id));
this.loadSelectData();
TreeItem ddl = null;
//Obtiene el TreeItem desde una colleccion de DynamicBeans
try {
if ("true".equalsIgnoreCase(this.getAddAllLabel()))
ddl = TreeItemFactory.getInstance().createFromCollectionWithAllLabel(request, elementos, this.getMetadataArray());
else if("true".equalsIgnoreCase(this.getAddSelectLabel()))
ddl = TreeItemFactory.getInstance().createFromCollectionWithSelectLabel(request, elementos, this.getMetadataArray());
else
ddl = TreeItemFactory.getInstance().createFromCollection(request, elementos, this.getMetadataArray());
} catch (Exception e) {
throw new JspException("Error al obtener el arbol: " + e.toString());
}
StringBuffer sb = new StringBuffer("");
sb.append(this.generateObjects());
sb.append("<script language=\"JavaScript1.2\">\n<!--\n");
sb.append(this.generateDeclaration());
sb.append(this.generateTree(ddl));
sb.append(this.generateRefillFunction());
sb.append("refill");
sb.append(id);
sb.append("(-1, 0);\n");
//limpia los valores iniciales.
for (int i = 0; i < cmbvalues.length; i++) {
sb.append("selvalue");
sb.append(id);
sb.append("[");
sb.append(i);
sb.append("]=\"\";\n");
}
sb.append("//-->\n</script>");
//System.out.println(sb.toString());
try {
pageContext.getOut().write(sb.toString());
} catch (Exception e) {
throw new JspException("IO Error: " + e.getMessage());
}
return EVAL_PAGE;
}
private String generateDeclaration() {
StringBuffer sb = new StringBuffer("");
//Nombres, valores y onchange de los selects
sb.append("var selname");
sb.append(id);
sb.append("=new Array(");
sb.append(cmbnames.length);
sb.append(");\n");
sb.append("var selvalue");
sb.append(id);
sb.append("=new Array(");
sb.append(cmbvalues.length);
sb.append(");\n");
for (int i = 0; i < cmbnames.length; i++) {
sb.append("select").append(id).append(i).append("=").append(cmbnames[i]).append(";\n");
sb.append("selname").append(id).append("[").append(i).append("]=\"").append("select").append(
id).append(
i).append(
"\";\n");
sb.append("func").append(id).append(i).append("=new Function();\n");
sb.append("if(select").append(id).append(i).append(".onchange) {\n");
sb.append("func").append(id).append(i).append("=select").append(id).append(i).append(
".onchange;\n}\n");
sb.append("function refill").append(id).append(i).append("() {\n");
sb.append("select").append(id).append("=").append(cmbnames[i]).append(";\n");
sb.append("\nrefill").append(id).append("(").append(i).append(", ").append("select").append(
id).append(
".selectedIndex); ");
sb.append(cmbonchange[i]!=null?cmbonchange[i]:"");
sb.append("\nfunc").append(id).append(i).append("();\n");
sb.append("}\n");
sb.append("select");
sb.append(id);
sb.append(i);
sb.append(".onchange=refill");
sb.append(id);
sb.append(i);
sb.append(";\n");
sb.append("selvalue");
sb.append(id);
sb.append("[");
sb.append(i);
sb.append("]=\"");
sb.append(cmbvalues[i]);
sb.append("\";\n");
}
return sb.toString();
}
private String generateTree(TreeItem ddl) {
StringBuffer sb = new StringBuffer("");
sb.append("\nvar ddl");
sb.append(id);
sb.append("=new TreeItem(\"ROOT\", \"ROOT\");\n");
//Recorre el arbol de 韙ems para generar el c骴igo.
generate(sb, ddl, "ddl" + id);
return sb.toString();
}
private void generate(StringBuffer sb, TreeItem ddl, String parent) {
Iterator it = ddl.rel.iterator();
int i = 0;
while (it.hasNext()) {
TreeItem ddlaux = (TreeItem) it.next();
String newParent = parent + "_" + i;
sb.append(newParent);
sb.append("=");
sb.append(parent);
sb.append(".add(\"");
//MM: Reemplazo ' por " para evitar errores de JScript.
sb.append(ddlaux.getDescrip().replace('"', '\''));
sb.append("\", \"");
sb.append(ddlaux.getId());
sb.append("\");\n");
i++;
generate(sb, ddlaux, newParent);
}
}
private String generateRefillFunction() {
StringBuffer sb = new StringBuffer("");
sb.append("function refill");
sb.append(id);
sb.append("(sel, index) { selCount=selname");
sb.append(id);
sb.append(".length;\n");
sb.append("if(sel==-1) selCount-- ;\n");
sb.append("for(selidx=sel;selidx<selCount;selidx++) {\n");
sb.append("level=selidx+1;select=eval(selname");
sb.append(id);
sb.append("[level]);\nif(select) {\n");
sb.append("saux=\"ddl");
sb.append(id);
sb.append("\";\n");
sb.append("for(i=0;i<level;i++) { saux=saux + \".rel\"; if(i<level) { saux=saux + \"[\" + selname");
sb.append(id);
sb.append("[i] + \".selectedIndex]\";} else {saux=saux + \"[index]\";}}\n");
sb.append("aux=eval(saux); for (m=select.options.length-1;m>=0;m--) {select.options[m]=null;}\n");
sb.append(
"indice=0;\nfor (i=0;i<aux.rel.length;i++){ select.options[i]=new Option(aux.rel[i].descrip, aux.rel[i].id);\nif(selvalue");
sb.append(id);
sb.append("[level] == aux.rel[i].id) indice=i;\n} select.options[indice].selected=true;} }}\n");
return sb.toString();
}
public String generateObjects() {
StringBuffer sb = new StringBuffer("");
//verifica si en el request ya no apareci
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -