/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package nl.strohalm.cyclos.taglibs;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import org.apache.commons.lang.StringUtils;
/**
* Renders a rich text area
* @author luis
*/
public class RichTextAreaTag extends AbstractDynamicAttributesTag {
private static final long serialVersionUID = -1526709179401334789L;
private String name;
private String value;
private boolean disabled;
private String styleClass;
private String styleId;
public RichTextAreaTag() {
release();
}
@Override
public int doEndTag() throws JspException {
final JspWriter out = pageContext.getOut();
final String value = this.value;
final String id = StringUtils.isEmpty(styleId) ? name : styleId;
try {
final StringBuilder sb = new StringBuilder();
if (disabled) {
// When a rich text field is not enabled, render a div and the text inside.
// Only when enabling it the editor will be rendered
sb.append("<div style='position:relative;padding-right:6px;'><div id='textOfField_").append(id).append("' class='fakeFieldDisabled' style='width:479px;height:200px;overflow:auto;'><table cellpadding='0' cellspacing='0' border='0' width='100%'><tr><td style='padding:0px'>");
sb.append(StringUtils.isEmpty(value) ? " " : value);
sb.append("</td></tr></table></div></div>");
sb.append("<div id='envelopeOfField_").append(id).append("' style='display:none'>");
}
final StringBuilder className = new StringBuilder();
if (StringUtils.isNotEmpty(styleClass)) {
className.append(styleClass);
}
className.append(" full");
className.append(disabled ? " richEditorDisabled" : " richEditor");
final String containerId = "container_" + id;
sb.append("<div class='richTextAreaContainer' id=\"").append(containerId).append("\">");
sb.append("<textarea rows='6' name='").append(name).append('\'');
if (StringUtils.isNotEmpty(styleId)) {
sb.append(" id='" + styleId + '\'');
sb.append(" fieldId='" + styleId + '\'');
}
sb.append(" class='").append(className).append('\'');
sb.append(' ').append(attributesForTag()).append('>');
sb.append(value);
sb.append("</textarea>");
sb.append("</div>");
if (disabled) {
sb.append("</div>");
} else {
// Eager init if not disabled
sb.append("<script>\n");
sb.append("richEditorsToInitialize.push($('").append(containerId).append("').firstChild);\n");
sb.append("</script>\n");
}
out.print(sb.toString());
return EVAL_PAGE;
} catch (final IOException e) {
throw new JspException(e);
} finally {
release();
}
}
public String getName() {
return name;
}
public String getStyleClass() {
return styleClass;
}
public String getStyleId() {
return styleId;
}
public String getValue() {
return value;
}
public boolean isDisabled() {
return disabled;
}
@Override
public void release() {
value = null;
disabled = false;
name = null;
styleClass = null;
styleId = null;
}
public void setDisabled(final boolean disabled) {
this.disabled = disabled;
}
public void setName(final String name) {
this.name = name;
}
public void setStyleClass(final String styleClass) {
this.styleClass = styleClass;
}
public void setStyleId(final String styleId) {
this.styleId = styleId;
}
public void setValue(final String value) {
this.value = value;
}
}