/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.webui.form;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.model.SelectItem;
import org.exoplatform.webui.core.model.SelectOption;
import org.exoplatform.webui.core.model.SelectOptionGroup;
import org.gatein.common.logging.Logger;
import org.gatein.common.logging.LoggerFactory;
/**
* Represents a select element
*
*/
public class UIFormSelectBoxWithGroups extends UIFormStringInput {
/** . */
private static final Logger log = LoggerFactory.getLogger(UIFormSelectBoxWithGroups.class);
/**
* 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<SelectItem> options_;
/**
* The javascript expression executed when an onChange event fires
*/
private String onchange_;
public UIFormSelectBoxWithGroups(String name, String bindingExpression, List<SelectItem> options) {
super(name, bindingExpression, null);
setOptions(options);
}
public final UIFormSelectBoxWithGroups setMultiple(boolean bl) {
isMultiple_ = bl;
return this;
}
public final UIFormSelectBoxWithGroups setSize(int i) {
size_ = i;
return this;
}
public UIFormSelectBoxWithGroups setValue(String value) {
value_ = value;
for (SelectItem option : options_) {
if (option instanceof SelectOption) {
if (((SelectOption) option).getValue().equals(value_))
((SelectOption) option).setSelected(true);
else
((SelectOption) option).setSelected(false);
} else if (option instanceof SelectOptionGroup) {
((SelectOptionGroup) option).setValue(value);
}
}
return this;
}
public String[] getSelectedValues() {
if (isMultiple_) {
List<String> selectedValues = new ArrayList<String>();
for (SelectItem option : options_) {
if (option instanceof SelectOption) {
if (((SelectOption) option).isSelected())
selectedValues.add(((SelectOption) option).getValue());
} else if (option instanceof SelectOptionGroup) {
selectedValues.addAll(((SelectOptionGroup) option).getSelectedValues());
}
}
return selectedValues.toArray(new String[0]);
}
return new String[] { value_ };
}
public UIFormSelectBoxWithGroups setSelectedValues(String[] values) {
for (SelectItem option : options_) {
if (option instanceof SelectOption) {
((SelectOption) option).setSelected(false);
for (String value : values) {
if (value.equals(((SelectOption) option).getValue())) {
((SelectOption) option).setSelected(true);
break;
}
}
} else if (option instanceof SelectOptionGroup) {
((SelectOptionGroup) option).setSelectedValue(values);
}
}
return this;
}
public final List<SelectItem> getOptions() {
return options_;
}
public final UIFormSelectBoxWithGroups setOptions(List<SelectItem> options) {
options_ = options;
if (options_ == null || options_.size() < 1)
return this;
for (SelectItem option : options_) {
if (option instanceof SelectOption) {
value_ = ((SelectOption) option).getValue();
break;
}
}
return this;
}
public UIFormSelectBoxWithGroups addOptionGroup(String label, List<SelectOption> options) {
SelectOptionGroup group = new SelectOptionGroup(label);
group.setOptions(options);
options_.add(group);
return this;
}
@Override
public void reset() {
// TODO Auto-generated method stub - dang.tung
if (options_ == null || options_.size() < 1)
return;
for (SelectItem option : options_) {
if (option instanceof SelectOption)
((SelectOption) option).setSelected(false);
else if (option instanceof SelectOptionGroup) {
((SelectOptionGroup) option).reset();
}
}
for (SelectItem option : options_) {
if (option instanceof SelectOption) {
value_ = ((SelectOption) option).getValue();
((SelectOption) option).setSelected(true);
break;
}
}
}
public void setOnChange(String onchange) {
onchange_ = onchange;
}
@SuppressWarnings("deprecation")
public UIFormSelectBoxWithGroups setDisabled(boolean disabled) {
return (UIFormSelectBoxWithGroups) super.setDisabled(disabled);
}
@SuppressWarnings("unused")
public void decode(Object input, WebuiRequestContext context) {
String[] values = context.getRequestParameterValues(getId());
if (values == null) {
value_ = null;
for (SelectItem option : options_) {
if (option instanceof SelectOption)
((SelectOption) option).setSelected(false);
else if (option instanceof SelectOptionGroup) {
for (SelectOption opt : ((SelectOptionGroup) option).getOptions()) {
opt.setSelected(false);
}
}
}
return;
}
int i = 0;
value_ = values[0];
for (SelectItem item : options_) {
if (item instanceof SelectOption) {
if (i > -1 && ((SelectOption) item).getValue().equals(values[i])) {
((SelectOption) item).setSelected(true);
if (values.length == ++i)
i = -1;
} else
((SelectOption) item).setSelected(false);
} else if (item instanceof SelectOptionGroup) {
for (SelectOption opt : ((SelectOptionGroup) item).getOptions()) {
if (i > -1 && ((SelectOption) opt).getValue().equals(values[i])) {
((SelectOption) opt).setSelected(true);
if (values.length == ++i)
i = -1;
} else {
((SelectOption) opt).setSelected(false);
}
}
}
}
}
// protected String renderOnChangeAction(UIForm uiform) throws Exception {
// StringBuilder builder = new StringBuilder();
// builder.append(" onchange=\"javascript:eXo.webui.UIForm.submitForm('").
// append("").append("','").append(onchange_).append("');\" ");
// return builder.toString();
// }
protected String renderOnChangeEvent(UIForm uiForm) throws Exception {
return uiForm.event(onchange_, (String) null);
}
protected UIForm getFrom() {
return getAncestorOfType(UIForm.class);
}
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("\"");
w.write(" id=\"");
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 (isDisabled())
w.write(" disabled ");
renderHTMLAttributes(w);
w.write(">\n");
for (SelectItem item : options_) {
String label = item.getLabel();
if (item instanceof SelectOption) {
try {
label = res.getString(formId + ".label.option." + ((SelectOption) item).getValue());
} catch (MissingResourceException ex) {
}
w.write(renderOption(((SelectOption) item), label));
} else if (item instanceof SelectOptionGroup) {
label = item.getLabel();
try {
label = res.getString(getFrom().getId() + ".optionGroup.label." + label);
} catch (MissingResourceException ex) {
log.debug("Could not find: " + getFrom().getId() + ".optionGroup.label." + label);
}
w.write("<optgroup label=\"");
w.write(label);
w.write("\">\n");
for (SelectOption opt : ((SelectOptionGroup) item).getOptions()) {
label = opt.getLabel();
try {
label = res.getString(formId + ".label.option." + opt.getValue());
} catch (MissingResourceException ex) {
}
w.write(renderOption(opt, label));
}
w.write("</optgroup>\n");
}
}
w.write("</select>\n");
if (this.isMandatory())
w.write(" *");
}
private String renderOption(SelectOption option, String label) {
StringBuffer buf = new StringBuffer();
buf.append("<option value=\"");
buf.append(option.getValue());
buf.append("\"");
if (option.isSelected())
buf.append("selected=\"selected\"");
buf.append(">");
buf.append(label);
buf.append("</option>\n");
return buf.toString();
}
}