/*
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 java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;
import nl.strohalm.cyclos.utils.MessageHelper;
import nl.strohalm.cyclos.utils.PropertyHelper;
import nl.strohalm.cyclos.utils.SpringHelper;
import nl.strohalm.cyclos.utils.conversion.CoercionHelper;
import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.taglib.html.Constants;
/**
* Renders a multi-dropdown control
* @author luis
*/
public class MultiDropDownTag extends TagSupport {
private static final long serialVersionUID = 7107831808471414750L;
private String divId;
private Integer maxWidth;
private Integer minWidth;
private String name;
private boolean singleField;
private boolean open;
private boolean disabled;
private Integer size;
private List<String> selectedValues;
private String emptyLabel;
private String emptyLabelKey;
private String varName;
private String onchange;
private MessageHelper messageHelper;
public MultiDropDownTag() {
release();
}
@Override
public int doEndTag() throws JspException {
try {
// Build the options object
final StringBuilder options = new StringBuilder();
options.append('{');
options.append("'singleField':").append(singleField).append(',');
options.append("'open':").append(open).append(',');
options.append("'disabled':").append(disabled);
if (size != null) {
options.append(",'size':").append(size);
}
if (minWidth != null) {
options.append(",'minWidth':").append(minWidth);
}
if (maxWidth != null) {
options.append(",'maxWidth':").append(maxWidth);
}
if (emptyLabelKey != null) {
emptyLabel = messageHelper.message(emptyLabelKey);
}
if (emptyLabel != null) {
options.append(",'emptyLabel':\"").append(StringEscapeUtils.escapeJavaScript(emptyLabel)).append('"');
}
if (onchange != null) {
options.append(",'onchange':\"").append(StringEscapeUtils.escapeJavaScript(onchange)).append('"');
}
options.append('}');
// Write the rest of the script
final JspWriter out = pageContext.getOut();
if (StringUtils.isNotEmpty(varName)) {
out.print(varName + "=");
}
out.println("new MultiDropDown(" + divId + ", '" + name + "', " + divId + ".values, " + options + ")");
out.println("</script>");
return EVAL_PAGE;
} catch (final IOException e) {
throw new JspException(e);
} finally {
release();
}
}
@Override
@SuppressWarnings("unchecked")
public int doStartTag() throws JspException {
divId = "_container_" + System.currentTimeMillis() + "_" + new Random().nextInt(Integer.MAX_VALUE);
if (selectedValues == null) {
try {
final Object form = pageContext.findAttribute(Constants.BEAN_KEY);
selectedValues = CoercionHelper.coerce(List.class, PropertyHelper.get(form, name));
for (int i = 0; i < selectedValues.size(); i++) {
selectedValues.set(i, CoercionHelper.coerce(String.class, selectedValues.get(i)));
}
} catch (final Exception e) {
// Leave selected values empty
}
}
try {
final JspWriter out = pageContext.getOut();
out.print("<div");
if (maxWidth != null) {
out.print(" style='width:" + maxWidth + "px'");
}
out.println(" id='" + divId + "'></div>");
// Write the start of the script
out.println("<script>");
out.println("var mddNoItemsMessage = \"" + StringEscapeUtils.escapeJavaScript(messageHelper.message("multiDropDown.noItemsMessage")) + "\";");
out.println("var mddSingleItemsMessage = \"" + StringEscapeUtils.escapeJavaScript(messageHelper.message("multiDropDown.singleItemMessage")) + "\";");
out.println("var mddMultiItemsMessage = \"" + StringEscapeUtils.escapeJavaScript(messageHelper.message("multiDropDown.multiItemsMessage")) + "\";");
out.println("var " + divId + " = $('" + divId + "');");
out.println(divId + ".values = [];");
} catch (final IOException e) {
throw new JspException(e);
}
return EVAL_BODY_INCLUDE;
}
public String getDivId() {
return divId;
}
public String getEmptyLabel() {
return emptyLabel;
}
public String getEmptyLabelKey() {
return emptyLabelKey;
}
public Integer getMaxWidth() {
return maxWidth;
}
public Integer getMinWidth() {
return minWidth;
}
public String getName() {
return name;
}
public String getOnchange() {
return onchange;
}
public Object getSelected() {
return selectedValues;
}
public List<String> getSelectedValues() {
return selectedValues;
}
public Integer getSize() {
return size;
}
public String getVarName() {
return varName;
}
public boolean isDisabled() {
return disabled;
}
public boolean isOpen() {
return open;
}
public boolean isSingleField() {
return singleField;
}
@Override
public void release() {
super.release();
divId = null;
maxWidth = null;
minWidth = null;
size = null;
name = null;
emptyLabel = null;
emptyLabelKey = null;
selectedValues = null;
singleField = false;
open = false;
disabled = false;
varName = null;
onchange = null;
}
public void setDisabled(final boolean disabled) {
this.disabled = disabled;
}
public void setEmptyLabel(final String emptyLabel) {
this.emptyLabel = emptyLabel;
}
public void setEmptyLabelKey(final String emptyLabelKey) {
this.emptyLabelKey = emptyLabelKey;
}
public void setMaxWidth(final Integer maxWidth) {
this.maxWidth = maxWidth;
}
public void setMinWidth(final Integer minWidth) {
this.minWidth = minWidth;
}
public void setName(final String name) {
this.name = name;
}
public void setOnchange(final String onchange) {
this.onchange = onchange;
}
public void setOpen(final boolean open) {
this.open = open;
}
@Override
public void setPageContext(final PageContext pageContext) {
super.setPageContext(pageContext);
messageHelper = SpringHelper.bean(pageContext.getServletContext(), MessageHelper.class);
}
@SuppressWarnings("unchecked")
public void setSelected(final Object object) {
if (object == null) {
selectedValues = null;
} else {
final Iterator<Object> it = IteratorUtils.getIterator(object);
selectedValues = new ArrayList<String>();
while (it.hasNext()) {
selectedValues.add(CoercionHelper.coerce(String.class, it.next()));
}
}
}
public void setSelectedValues(final List<String> selectedValues) {
this.selectedValues = selectedValues;
}
public void setSingleField(final boolean singleField) {
this.singleField = singleField;
}
public void setSize(final Integer size) {
this.size = size;
}
public void setVarName(final String varName) {
this.varName = varName;
}
}