blob: f53a3d2a3dbfb719ea7f368b50c39406de8009a6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.views.java.simple;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.components.ListUIBean;
import org.apache.struts2.components.OptGroup;
import org.apache.struts2.util.ContainUtil;
import org.apache.struts2.util.MakeIterator;
import org.apache.struts2.views.java.Attributes;
import org.apache.struts2.views.java.TagGenerator;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class SelectHandler extends AbstractTagHandler implements TagGenerator {
public void generate() throws IOException {
Map<String, Object> params = context.getParameters();
Attributes a = new Attributes();
Object value = params.get("nameValue");
a.addDefaultToEmpty("name", params.get("name"))
.addIfExists("size", params.get("size"))
.addIfExists("value", value)
.addIfTrue("disabled", params.get("disabled"))
.addIfTrue("readonly", params.get("readonly"))
.addIfTrue("multiple", params.get("multiple"))
.addIfExists("tabindex", params.get("tabindex"))
.addIfExists("id", params.get("id"))
.addIfExists("class", params.get("cssClass"))
.addIfExists("style", params.get("cssStyle"))
.addIfExists("title", params.get("title"));
super.start("select", a);
//options
//header
String headerKey = (String) params.get("headerKey");
String headerValue = (String) params.get("headerValue");
if (headerKey != null && headerValue != null) {
boolean selected = ContainUtil.contains(value, params.get("headerKey"));
writeOption(headerKey, headerValue, selected);
}
//emptyoption
Object emptyOption = params.get("emptyOption");
if (emptyOption != null && emptyOption.toString().equals(Boolean.toString(true))) {
boolean selected = ContainUtil.contains(value, "") || ContainUtil.contains(value, null);
writeOption("", "", selected);
}
Object listObj = params.get("list");
String listKey = (String) params.get("listKey");
String listValue = (String) params.get("listValue");
ValueStack stack = this.context.getStack();
if (listObj != null) {
Iterator itt = MakeIterator.convert(listObj);
while (itt.hasNext()) {
Object item = itt.next();
stack.push(item);
//key
Object itemKey = findValue(listKey != null ? listKey : "top");
String itemKeyStr = StringUtils.defaultString(itemKey == null ? null : itemKey.toString());
//value
Object itemValue = findValue(listValue != null ? listValue : "top");
String itemValueStr = StringUtils.defaultString(itemValue == null ? null : itemValue.toString());
boolean selected = ContainUtil.contains(value, itemKey);
writeOption(itemKeyStr, itemValueStr, selected);
stack.pop();
}
}
//opt group
List<ListUIBean> listUIBeans = (List<ListUIBean>) params.get(OptGroup.INTERNAL_LIST_UI_BEAN_LIST_PARAMETER_KEY);
if (listUIBeans != null) {
for (ListUIBean listUIBean : listUIBeans) {
writeOptionGroup(listUIBean, value);
}
}
super.end("select");
}
private void writeOption(String value, String text, boolean selected) throws IOException {
Attributes attrs = new Attributes();
attrs.addIfExists("value", value)
.addIfTrue("selected", selected);
start("option", attrs);
characters(text);
end("option");
}
private void writeOptionGroup(ListUIBean listUIBean, Object value) throws IOException {
Map params = listUIBean.getParameters();
Attributes attrs = new Attributes();
attrs.addIfExists("label", params.get("label"))
.addIfTrue("disabled", params.get("disabled"));
start("optgroup", attrs);
//options
ValueStack stack = context.getStack();
Object listObj = params.get("list");
if (listObj != null) {
Iterator itt = MakeIterator.convert(listObj);
String listKey = (String) params.get("listKey");
String listValue = (String) params.get("listValue");
while (itt.hasNext()) {
Object optGroupBean = itt.next();
stack.push(optGroupBean);
Object tmpKey = stack.findValue(listKey != null ? listKey : "top");
String tmpKeyStr = StringUtils.defaultString(tmpKey.toString());
Object tmpValue = stack.findValue(listValue != null ? listValue : "top");
String tmpValueStr = StringUtils.defaultString(tmpValue.toString());
boolean selected = ContainUtil.contains(value, tmpKeyStr);
writeOption(tmpKeyStr, tmpValueStr, selected);
stack.pop();
}
}
end("optgroup");
}
}