Index: lams_central/conf/xdoclet/taglib-tag.xml =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/xdoclet/taglib-tag.xml,v diff -u -r1.11 -r1.12 --- lams_central/conf/xdoclet/taglib-tag.xml 6 Dec 2006 03:52:51 -0000 1.11 +++ lams_central/conf/xdoclet/taglib-tag.xml 22 Dec 2006 02:03:51 -0000 1.12 @@ -228,5 +228,33 @@ ImgButtonWrapper /WEB-INF/tags/ImgButtonWrapper.tag - - \ No newline at end of file + + textarea + org.lamsfoundation.lams.web.tag.LAMSMultiLinesTextareaTag + JSP + true + + Render text exactly same as original input, which even won't escape the input HTML tag. + + + + + name + true + true + + + + + id + false + true + + + + + onchange + false + true + + \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/web/tag/LAMSMultiLinesTextareaTag.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/web/tag/LAMSMultiLinesTextareaTag.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_central/src/java/org/lamsfoundation/lams/web/tag/LAMSMultiLinesTextareaTag.java 22 Dec 2006 02:03:50 -0000 1.1 @@ -0,0 +1,187 @@ +package org.lamsfoundation.lams.web.tag; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.BodyContent; +import javax.servlet.jsp.tagext.BodyTagSupport; +import javax.servlet.jsp.tagext.DynamicAttributes; + +import org.apache.commons.lang.StringUtils; +/** + * + * @author steven + * + */ +public class LAMSMultiLinesTextareaTag extends BodyTagSupport implements DynamicAttributes{ + + + private static final String TAG_NAME= "textarea"; + private List keys; + private List values; + + private String id; + private String name; + private String onchange; + + + @Override + public int doStartTag() throws JspException { + keys = new ArrayList(); + values = new ArrayList(); + + return super.doStartTag(); + } + + @Override + public int doEndTag() throws JspException { + String tagName = getName(); + String hiddenId = tagName + "__lamshidden"; + try { + //add Javascript event handler + String chbr ="filterData(this,document.getElementById('" + hiddenId + "'));"; + String onChange = this.getOnchange(); + if(onChange == null) + onChange = chbr; + else if(onChange.indexOf(chbr) == -1){ + if(onChange.endsWith(";")) + onChange += chbr; + else + onChange = onChange + ";" + chbr; + } + this.setOnchange(onChange); + + //reset some values to another in order to use them in hidden field. + String oldProperty= this.name; + BodyContent oldBodyContent = this.getBodyContent(); + + this.name +="__textarea"; + if(StringUtils.isEmpty(this.getId())) + this.setId(tagName + "__lamstextarea"); + StringBuffer results = new StringBuffer(renderTextareaElement(getDataNoBr(oldBodyContent.getString()))); + + //construct hidden variable + results.append(""); + + //onload script to reset hidden value, so it can works even onChange event does not happen when edit. + //the reason of why not directly assign value to hidden variable is + //hidden variable treat < and < are same value when submit to form. The only way is use Javascript + //reset it value. + StringBuffer filterScript = new StringBuffer(""); + results.append(filterScript); + + + pageContext.getOut().write( results.toString()); + } catch (Exception e) { + throw new JspException(e); + } + + return super.doEndTag(); + } + + /** + * Generate an HTML <textarea> tag. + * @throws JspException + * @throws UnsupportedEncodingException + * @since Struts 1.1 + */ + protected String renderTextareaElement(String value) throws JspException, UnsupportedEncodingException { + StringBuffer results = new StringBuffer(""); + + results.append(value); + + results.append(""); + return results.toString(); + } + + /** + * Change input string <BR> tag into \n or \r\n (dependent on OS). + * @param data + * @return + * @throws JspException + */ + private String getDataNoBr(String data) throws JspException{ + + if(data != null){ + //comment: although window OS should be \r\n format, but in some case, it only include "\n" as well. + //so it is not safe to do replacement +// if(os.toLowerCase().indexOf("win") != -1) +// data = data.replaceAll("
","\r\n"); +// else + data = data.replaceAll("
","\n"); + } + return data == null?"":data; + } + + /** + * @param sb StringBuffer + * @throws UnsupportedEncodingException + */ + private void appendDynamicParam(StringBuffer sb) throws UnsupportedEncodingException { + for (int idx = 0; idx < keys.size(); idx++) { + sb.append(" "); + String key = (String) keys.get(idx); + Object value = values.get(idx)==null?"":values.get(idx).toString(); + + prepareAttribute(sb, key, value); + } + + } + protected void prepareAttribute(StringBuffer handlers, String name, Object value) { + if (value != null) { + handlers.append(" "); + handlers.append(name); + handlers.append("=\""); + handlers.append(value); + handlers.append("\""); + } + } + /* (non-Javadoc) + * @see javax.servlet.jsp.tagext.DynamicAttributes#setDynamicAttribute(java.lang.String, java.lang.String, java.lang.Object) + */ + public void setDynamicAttribute(String url, String localName, Object value) throws JspException { + keys.add( localName ); + values.add( value ); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOnchange() { + return onchange; + } + + public void setOnchange(String onchange) { + this.onchange = onchange; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +} Index: lams_central/src/java/org/lamsfoundation/lams/web/tag/MultiLinesTextareaTag.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/web/tag/MultiLinesTextareaTag.java,v diff -u -r1.5 -r1.6 --- lams_central/src/java/org/lamsfoundation/lams/web/tag/MultiLinesTextareaTag.java 17 Sep 2006 06:12:05 -0000 1.5 +++ lams_central/src/java/org/lamsfoundation/lams/web/tag/MultiLinesTextareaTag.java 22 Dec 2006 02:03:50 -0000 1.6 @@ -114,10 +114,11 @@ data = this.lookupProperty(this.name, this.property); } if(data != null){ - //change back - if(os.toLowerCase().indexOf("win") != -1) - data = data.replaceAll("
","\r\n"); - else + //comment: although window OS should be \r\n format, but in some case, it only include "\n" as well. + //so it is not safe to do replacement +// if(os.toLowerCase().indexOf("win") != -1) +// data = data.replaceAll("
","\r\n"); +// else data = data.replaceAll("
","\n"); } return data == null?"":data;