package railo.runtime.tag;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map.Entry;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.util.KeyConstants;
// TODO tag textarea
// attribute html macht irgendwie keinen sinn, aber auch unter neo nicht
public final class Textarea extends Input implements BodyTag {
private static final String BASE_PATH = null; // TODO
private static final String STYLE_XML = null;
private static final String TEMPLATE_XML = null;
private static final String SKIN = "default";
private static final String TOOLBAR = "default";
private static final int WRAP_OFF = 0;
private static final int WRAP_HARD = 1;
private static final int WRAP_SOFT = 2;
private static final int WRAP_PHYSICAL = 3;
private static final int WRAP_VIRTUAL = 4;
private BodyContent bodyContent=null;
private String basepath=BASE_PATH;
private String fontFormats=null;
private String fontNames=null;
private String fontSizes=null;
private boolean html=false;
private boolean richText=false;
private String skin=SKIN;
private String stylesXML=STYLE_XML;
private String templatesXML=TEMPLATE_XML;
private String toolbar=TOOLBAR;
private boolean toolbarOnFocus=false;
private int wrap=WRAP_OFF;
@Override
public void release() {
super.release();
bodyContent=null;
basepath=BASE_PATH;
fontFormats=null;
fontNames=null;
fontSizes=null;
html=false;
richText=false;
skin=SKIN;
stylesXML=STYLE_XML;
templatesXML=TEMPLATE_XML;
toolbar=TOOLBAR;
toolbarOnFocus=false;
wrap=WRAP_OFF;
}
public void setCols(double cols) throws PageException {
attributes.set("cols", Caster.toString(cols));
}
public void setRows(double rows) throws PageException {
attributes.set("rows", Caster.toString(rows));
}
public void setBasepath(String basepath) {
this.basepath=basepath;
}
public void setFontFormats(String fontFormats) {
this.fontFormats=fontFormats;
}
public void setFontNames(String fontNames) {
this.fontNames=fontNames;
}
public void setFontSizes(String fontSizes) {
this.fontSizes=fontSizes;
}
public void setHtml(boolean html) {
this.html=html;
}
public void setRichtext(boolean richText) {
this.richText = richText;
}
public void setSkin(String skin) {
this.skin = skin;
}
public void setStylesxml(String stylesXML) {
this.stylesXML = stylesXML;
}
public void setTemplatesxml(String templatesXML) {
this.templatesXML = templatesXML;
}
public void setToolbar(String toolbar) {
this.toolbar = toolbar;
}
public void setToolbaronfocus(boolean toolbarOnFocus) {
this.toolbarOnFocus = toolbarOnFocus;
}
public void setWrap(String strWrap) throws ExpressionException {
strWrap=strWrap.trim().toLowerCase();
if("hard".equals(strWrap)) wrap=WRAP_HARD;
else if("soft".equals(strWrap)) wrap=WRAP_SOFT;
else if("off".equals(strWrap)) wrap=WRAP_OFF;
else if("physical".equals(strWrap)) wrap=WRAP_PHYSICAL;
else if("virtual".equals(strWrap)) wrap=WRAP_VIRTUAL;
else throw new ExpressionException("invalid value ["+strWrap+"] for attribute wrap, valid values are [hard,soft,off,physical,virtual]");
}
@Override
void draw() throws IOException, PageException {
// value
String attrValue=null;
String bodyValue=null;
String value="";
if(bodyContent!=null)bodyValue=bodyContent.getString();
if(attributes.containsKey(KeyConstants._value))attrValue=Caster.toString(attributes.get(KeyConstants._value,null));
// check values
if(!StringUtil.isEmpty(bodyValue) && !StringUtil.isEmpty(attrValue)) {
throw new ApplicationException("the value of tag can't be set twice (tag body and attribute value)");
}
else if(!StringUtil.isEmpty(bodyValue)){
value=enc(bodyValue);
}
else if(!StringUtil.isEmpty(attrValue)){
value=enc(attrValue);
}
// id
if(StringUtil.isEmpty(attributes.get(KeyConstants._id,null)))
attributes.set(KeyConstants._id,StringUtil.toVariableName((String)attributes.get(KeyConstants._name)));
// start output
pageContext.forceWrite("<textarea");
Iterator<Entry<Key, Object>> it = attributes.entryIterator();
Entry<Key, Object> e;
while(it.hasNext()) {
e = it.next();
pageContext.forceWrite(" ");
pageContext.forceWrite(e.getKey().getString());
pageContext.forceWrite("=\"");
pageContext.forceWrite(enc(Caster.toString(e.getValue())));
pageContext.forceWrite("\"");
}
if(passthrough!=null) {
pageContext.forceWrite(" ");
pageContext.forceWrite(passthrough);
}
pageContext.forceWrite(">");
pageContext.forceWrite(value);
pageContext.forceWrite("</textarea>");
}
@Override
public int doStartTag() {
return EVAL_BODY_BUFFERED;
}
@Override
public void setBodyContent(BodyContent bodyContent) {
this.bodyContent=bodyContent;
}
@Override
public void doInitBody() throws JspException {}
@Override
public int doAfterBody() throws JspException {
return SKIP_BODY;
}
public void hasBody(boolean hasBody) {
}
}