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");


Reply via email to