package railo.runtime.tag; import java.io.IOException; import java.util.Iterator; import java.util.Map.Entry; import javax.servlet.jsp.tagext.Tag; import railo.commons.lang.HTMLEntities; import railo.commons.lang.StringUtil; import railo.runtime.exp.ApplicationException; import railo.runtime.exp.PageException; import railo.runtime.ext.tag.TagImpl; import railo.runtime.op.Caster; import railo.runtime.op.Decision; import railo.runtime.type.Array; import railo.runtime.type.Collection.Key; import railo.runtime.type.Struct; import railo.runtime.type.StructImpl; import railo.runtime.type.util.ListUtil; /** * slider applet tag */ public final class Slider extends TagImpl { private Struct params=new StructImpl(); private InputBean input=new InputBean(); private int height=40; private int width=0; private int vspace=0; private int hspace=0; @Override public void release() { super.release(); input=new InputBean(); params.clear(); width=0; height=40; hspace=0; vspace=0; } /** * sets the attribut to tag * @param align * @throws ApplicationException */ public void setAlign(String align) throws ApplicationException { align=align.trim().toLowerCase(); if(ListUtil.listFind("top,left,bottom,baseline,texttop,absbottom,middle,absmiddle,right",align,",")>-1) { params.setEL("align",align); } else throw new ApplicationException("attribute align ["+align+"] is invalid","valid alignments are [top,left,bottom,baseline,texttop,absbottom,middle,absmiddle,right]"); } /** * sets the attribut to tag * @param bgcolor */ public void setBgcolor(String bgcolor) { params.setEL("bgcolor",bgcolor); } /** * sets the attribut to tag * @param bold */ public void setBold(boolean bold) { params.setEL("bold",Caster.toString(bold)); } /** * sets the attribut to tag * @param font */ public void setFont(String font) { params.setEL("font",font); } /** * sets the attribut to tag * @param fontsize */ public void setFontsize(double fontsize) { params.setEL("fontsize",Caster.toString((int)fontsize)); } /** * sets the attribut to tag * @param italic */ public void setItalic(boolean italic) { params.setEL("italic",Caster.toString(italic)); } /** * sets the attribut to tag * @param label */ public void setLabel(String label) { params.setEL("label",label); } /** * sets the attribut to tag * @param lookandfeel * @throws ApplicationException */ public void setLookandfeel(String lookandfeel) throws ApplicationException { lookandfeel=lookandfeel.trim().toLowerCase(); if(lookandfeel.equals("motif"))params.setEL("lookandfeel",lookandfeel); else if(lookandfeel.equals("windows"))params.setEL("lookandfeel",lookandfeel); else if(lookandfeel.equals("metal"))params.setEL("lookandfeel",lookandfeel); else throw new ApplicationException("value of attribute lookAndFeel ["+lookandfeel+"] is invalid","valid values are [motif,windows,metal]"); } /** * sets the attribut to tag * @param range * @throws PageException */ public void setRange(String range) throws PageException { String errMessage="attribute range has an invalid value ["+range+"], must be string list with numbers"; String errDetail="Example: [number_from,number_to], [number_from], [number_from,], [,number_to]"; Array arr=ListUtil.listToArray(range,','); if(arr.size()==1) { double from=Caster.toDoubleValue(arr.get(1,null),Double.NaN); if(!Decision.isValid(from))throw new ApplicationException(errMessage,errDetail); input.setRangeMin(from); input.setRangeMax(Double.NaN); if(from<100)params.setEL("minimum",Caster.toString(from)); } else if(arr.size()==2) { String strFrom=arr.get(1,"").toString().trim(); double from=Caster.toDoubleValue(strFrom,Double.NaN); if(!Decision.isValid(from) && strFrom.length()>0) { throw new ApplicationException(errMessage,errDetail); } input.setRangeMin(from); String strTo=arr.get(2,"").toString().trim(); double to=Caster.toDoubleValue(strTo,Double.NaN); if(!Decision.isValid(to) && strTo.length()>0) { throw new ApplicationException(errMessage,errDetail); } input.setRangeMax(to); if(from<to) { params.setEL("minimum",Caster.toString(from)); params.setEL("maximum",Caster.toString(to)); } } else throw new ApplicationException(errMessage,errDetail); } /** * sets the attribut to tag * @param message */ public void setMessage(String message) { input.setMessage(message); } /** * sets the attribut to tag * @param name */ public void setName(String name) { input.setName(name); } /** * sets the attribut to tag * @param notsupported */ public void setNotsupported(String notsupported) { params.setEL("notsupported",notsupported); } /** * sets the attribut to tag * @param onerror */ public void setOnerror(String onerror) { input.setOnError(onerror); } /** * sets the attribut to tag * @param onvalidate */ public void setOnvalidate(String onvalidate) { input.setOnValidate(onvalidate); } /** * sets the attribut to tag * @param refreshlabel */ public void setRefreshlabel(boolean refreshlabel) { params.setEL("refreshlabel",Caster.toString(refreshlabel)); } /** * sets the attribut to tag * @param scale */ public void setScale(double scale) { params.setEL("scale",Caster.toString((int)scale)); } /** * sets the attribut to tag * @param textcolor */ public void setTextcolor(String textcolor) { params.setEL("textcolor",textcolor); } /** * sets the attribut to tag * @param tickmarkimages */ public void setTickmarkimages(String tickmarkimages) { params.setEL("tickmarkimages",tickmarkimages); } /** * sets the attribut to tag * @param tickmarklabels */ public void setTickmarklabels(String tickmarklabels) { params.setEL("tickmarklabels",tickmarklabels); } /** * sets the attribut to tag * @param tickmarkmajor */ public void setTickmarkmajor(boolean tickmarkmajor) { params.setEL("tickmarkmajor",Caster.toString(tickmarkmajor)); } /** * sets the attribut to tag * @param tickmarkminor */ public void setTickmarkminor(boolean tickmarkminor) { params.setEL("tickmarkminor",Caster.toString(tickmarkminor)); } /** * sets the attribut to tag * @param value */ public void setValue(double value) { params.setEL("value",Caster.toString((int)value)); } /** * sets the attribut to tag * @param vertical */ public void setVertical(boolean vertical) { params.setEL("vertical",Caster.toString(vertical)); } /** * sets the attribut to tag * @param height */ public void setHeight(double height) { this.height=(int)height; } /** * sets the attribut to tag * @param hspace */ public void setHspace(double hspace) { this.hspace = (int)hspace; } /** * sets the attribut to tag * @param vspace */ public void setVspace(double vspace) { this.vspace = (int) vspace; } /** * sets the attribut to tag * @param width */ public void setWidth(double width) { this.width = (int) width; } @Override public int doStartTag() throws PageException { try { _doStartTag(); } catch (IOException e) { throw Caster.toPageException(e); } return SKIP_BODY; } private void _doStartTag() throws PageException, IOException { Tag parent = getParent(); while(parent!=null && !(parent instanceof Form)){ parent=parent.getParent(); } if(!(parent instanceof Form)) { throw new ApplicationException("Tag slider must be inside a form tag"); } Form form = (Form)parent; form.setInput(input); String codebase; pageContext.forceWrite("<input type=\"hidden\" name=\""+enc(input.getName())+"\" value=\"\">"); pageContext.forceWrite("<applet MAYSCRIPT code=\"thinlet.AppletLauncher\""); pageContext.forceWrite(" archive=\""+form.getArchive()+"?version=101\""); pageContext.forceWrite(" width=\""+width+"\""); if(!StringUtil.isEmpty(codebase=form.getCodebase())) pageContext.forceWrite(" codebase=\""+codebase+"\""); if(height>0)pageContext.forceWrite(" height=\""+height+"\""); if(hspace>0)pageContext.forceWrite(" hspace=\""+hspace+"\""); if(vspace>0)pageContext.forceWrite(" vspace=\""+vspace+"\""); Object align = params.get("align",null); if(align!=null)pageContext.forceWrite(" align=\""+align+"\""); pageContext.forceWrite(">\n"); pageContext.forceWrite("<param name=\"class\" value=\"railo.applet.SliderThinlet\"></param>\n"); pageContext.forceWrite("<param name=\"form\" value=\""+enc(form.getName())+"\"></param>\n"); pageContext.forceWrite("<param name=\"element\" value=\""+enc(input.getName())+"\"></param>\n"); Iterator<Entry<Key, Object>> it = params.entryIterator(); Entry<Key, Object> e; while(it.hasNext()) { e = it.next(); pageContext.forceWrite("<param name=\""); pageContext.forceWrite(e.getKey().getString()); pageContext.forceWrite("\" value=\""); pageContext.forceWrite(enc(Caster.toString(e.getValue()))); pageContext.forceWrite("\"></param>\n"); } pageContext.forceWrite("</applet>"); } /** * html encode a string * @param str string to encode * @return encoded string */ private String enc(String str) { return HTMLEntities.escapeHTML(str,HTMLEntities.HTMLV20); } }