/*************************************************************************** * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 this program; if not, see<http://www.gnu.org/licenses/>. ***************************************************************************/ package org.exoplatform.forum.webui; import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.exoplatform.forum.ForumUtils; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormStringInput; /** * Represents a select element * */ public class UIFormSelectBoxForum extends UIFormStringInput { /** * It make SelectBox's ability to select multiple values */ private boolean isMultiple_ = false; /** * The size of the list (number of select options) */ private int size_ = 1; /** * The list of options */ private List<SelectItemOption<String>> options_; /** * The javascript expression executed when an onChange event fires */ private String onchange_; public UIFormSelectBoxForum(String name, String bindingExpression, List<SelectItemOption<String>> options) { super(name, bindingExpression, null); setOptions(options); } final public UIFormSelectBoxForum setMultiple(boolean bl) { isMultiple_ = bl; return this; } final public UIFormSelectBoxForum setSize(int i) { size_ = i; return this; } @Override public UIFormSelectBoxForum setValue(String value) { value_ = value; for (SelectItemOption<String> option : options_) { if (option.getValue().equals(value_)) option.setSelected(true); else option.setSelected(false); } return this; } public String[] getSelectedValues() { if (isMultiple_) { List<String> selectedValues = new ArrayList<String>(); for (int i = 0; i < options_.size(); i++) { SelectItemOption<String> item = options_.get(i); if (item.isSelected()) selectedValues.add(item.getValue()); } return selectedValues.toArray(new String[0]); } return new String[] { value_ }; } public UIFormSelectBoxForum setSelectedValues(String[] values) { for (SelectItemOption<String> option : options_) { option.setSelected(false); for (String value : values) { if (value.equals(option.getValue())) { option.setSelected(true); break; } } } return this; } final public List<SelectItemOption<String>> getOptions() { return options_; } final public UIFormSelectBoxForum setOptions(List<SelectItemOption<String>> options) { options_ = options; if (options_ == null || options_.size() < 1) return this; value_ = options_.get(0).getValue(); return this; } public void setOnChange(String onchange) { onchange_ = onchange; } public UIFormSelectBoxForum setDisabled(boolean disabled) { setEnable(!disabled); return this; } @Override public void decode(Object input, WebuiRequestContext context) throws Exception { String[] values = context.getRequestParameterValues(getId()); if (values == null) { value_ = null; for (SelectItemOption<String> item : options_) { item.setSelected(false); } return; } int i = 0; value_ = values[0]; for (SelectItemOption<String> item : options_) { if (i > -1 && item.getValue().equals(values[i])) { item.setSelected(true); if (values.length == ++i) i = -1; } else item.setSelected(false); } } protected String renderOnChangeEvent(UIForm uiForm) throws Exception { return uiForm.event(onchange_, (String) null); } @Override public void processRender(WebuiRequestContext context) throws Exception { ResourceBundle res = context.getApplicationResourceBundle(); UIForm uiForm = getAncestorOfType(UIForm.class); String formId = null; if (uiForm.getId().equals("UISearchForm")) formId = uiForm.<UIComponent> getParent().getId(); else formId = uiForm.getId(); Writer w = context.getWriter(); w.write("<select class=\"selectbox\" name=\""); w.write(name); w.write("\""); if (onchange_ != null) { w.append(" onchange=\"").append(renderOnChangeEvent(uiForm)).append("\""); } if (isMultiple_) w.write(" multiple=\"true\""); if (size_ > 1) w.write(" size=\"" + size_ + "\""); if (!enable_) w.write(" disabled "); w.write(">\n"); for (SelectItemOption<String> item : options_) { String labelAndCss = item.getLabel(); String temp[] = labelAndCss.split(ForumUtils.SLASH); try { temp[0] = res.getString(formId + ".label.option." + item.getValue()); } catch (MissingResourceException ex) { } String classCss = "optionNormal"; if (temp.length > 1) classCss = temp[1]; if (item.isSelected()) { w.write("<option selected=\"selected\" class=\""); w.write(classCss + " optionSelected"); w.write("\" value=\""); w.write(item.getValue()); w.write("\">"); } else { w.write("<option class=\""); w.write(classCss); w.write("\" value=\""); w.write(item.getValue()); w.write("\">"); } w.write(temp[0]); w.write("</option>\n"); } w.write("</select>\n"); } }