Author: musachy Date: Sat Dec 13 15:21:05 2008 New Revision: 726291 URL: http://svn.apache.org/viewvc?rev=726291&view=rev Log: Support optgroup
Modified: struts/sandbox/trunk/struts2-javatemplates-plugin/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java struts/sandbox/trunk/struts2-javatemplates-plugin/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java Modified: struts/sandbox/trunk/struts2-javatemplates-plugin/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-javatemplates-plugin/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java?rev=726291&r1=726290&r2=726291&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-javatemplates-plugin/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java (original) +++ struts/sandbox/trunk/struts2-javatemplates-plugin/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java Sat Dec 13 15:21:05 2008 @@ -24,14 +24,19 @@ import org.apache.struts2.views.java.Attributes; import org.apache.struts2.views.util.TextUtil; import org.apache.struts2.components.template.TemplateRenderingContext; +import org.apache.struts2.components.OptGroup; +import org.apache.struts2.components.ListUIBean; import org.apache.struts2.util.ContainUtil; +import org.apache.struts2.util.MakeIterator; import java.io.IOException; import java.io.Writer; import java.util.Map; import java.util.List; +import java.util.Iterator; import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.TextUtils; public class SelectHandler extends AbstractTagHandler implements TagGenerator { private Writer writer; @@ -71,28 +76,38 @@ writeOption(headerKey, headerValue, selected); } - List list = (List) params.get("list"); + Object listObj = params.get("list"); String listKey = (String) params.get("listKey"); String listValue = (String) params.get("listValue"); ValueStack stack = this.context.getStack(); - if (list != null) { - for (Object item : list) { + 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 = itemKey != null ? itemKey.toString() : ""; + String itemKeyStr = TextUtils.noNull(itemKey.toString()); //value Object itemValue = findValue(listValue != null ? listValue : "top"); - String itemValueStr = itemValue != null ? itemValue.toString() : ""; + String itemValueStr = TextUtils.noNull(itemValue.toString()); - boolean selected = ContainUtil.contains(value, params.get(itemKey)); + 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"); } @@ -100,8 +115,41 @@ 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 = TextUtils.noNull(tmpKey.toString()); + Object tmpValue = stack.findValue(listValue != null ? listValue : "top"); + String tmpValueStr = TextUtils.noNull(tmpValue.toString()); + boolean selected = ContainUtil.contains(value, tmpKeyStr); + writeOption(tmpKeyStr, tmpValueStr, selected); + + stack.pop(); + } + } + + end("optgroup"); + } } Modified: struts/sandbox/trunk/struts2-javatemplates-plugin/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-javatemplates-plugin/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java?rev=726291&r1=726290&r2=726291&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-javatemplates-plugin/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java (original) +++ struts/sandbox/trunk/struts2-javatemplates-plugin/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java Sat Dec 13 15:21:05 2008 @@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; +import java.util.HashMap; public class SelectTest extends AbstractTestCase { private Bean bean1; @@ -43,7 +44,7 @@ tag.setCssClass("class"); tag.setCssStyle("style"); tag.setTitle("title"); - + tag.processParams(); map.putAll(tag.getParameters()); theme.renderTag("select", context); @@ -82,6 +83,35 @@ assertEquals(expected, output); } + public void testRenderSelectWithMapOptions() { + SelectEx tag = new SelectEx(stack, request, response); + + tag.setList("%{#{'key0' : 'val'}}"); + + tag.processParams(); + map.putAll(tag.getParameters()); + theme.renderTag("select", context); + String output = writer.getBuffer().toString(); + String expected = s("<select name=''><option value='key0'>val</option></select>"); + assertEquals(expected, output); + } + + public void testRenderSelectWithOptionSelected() { + SelectEx tag = new SelectEx(stack, request, response); + + tag.setList("%{list}"); + tag.setListKey("intField"); + tag.setListValue("stringField"); + tag.setValue("%{'1'}"); + + tag.processParams(); + map.putAll(tag.getParameters()); + theme.renderTag("select", context); + String output = writer.getBuffer().toString(); + String expected = s("<select name='' value='1'><option value='1' selected='selected'>val</option></select>"); + assertEquals(expected, output); + } + @Override protected void setUpStack() { super.setUpStack(); @@ -91,8 +121,18 @@ expectFind("'key0'", String.class, "key0"); + expectFind("'key1'", String.class, "key1"); expectFind("'val'", String.class, "val"); + expectFind("'val1'", String.class, "val1"); + expectFind("'1'", "1"); expectFind("list", Arrays.asList(bean1)); + expectFind("key", "key0"); + expectFind("value", "val"); + expectFind("#{'key0' : 'val'}", new HashMap() { + { + put("key0", "val"); + } + }); expectFind("intField", 1); expectFind("stringField", "val");