craigmcc    01/02/21 18:53:33

  Modified:    src/share/org/apache/struts/taglib/html OptionTag.java
                        OptionsTag.java SelectTag.java
               src/test/org/apache/struts/test TestBean.java
               web/test index.jsp
               web/test/WEB-INF struts-config.xml
  Added:       web/test html-select.jsp
  Log:
  Modify the <html:select multiple="true"> implementation so that it
  correctly marks all of the previously selected options to be marked
  "selected" when the form is displayed.
  
  Add a page to the struts-test application to exercise <html:select> both
  with and without the multiple="true" setting.
  
  Submitted by: Bruno Antunes <[EMAIL PROTECTED]>
  PR: Bugzilla #260
  
  Revision  Changes    Path
  1.4       +5 -5      
jakarta-struts/src/share/org/apache/struts/taglib/html/OptionTag.java
  
  Index: OptionTag.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/OptionTag.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- OptionTag.java    2001/02/20 01:48:46     1.3
  +++ OptionTag.java    2001/02/22 02:53:30     1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/OptionTag.java,v 1.3 
2001/02/20 01:48:46 craigmcc Exp $
  - * $Revision: 1.3 $
  - * $Date: 2001/02/20 01:48:46 $
  + * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/OptionTag.java,v 1.4 
2001/02/22 02:53:30 craigmcc Exp $
  + * $Revision: 1.4 $
  + * $Date: 2001/02/22 02:53:30 $
    *
    * ====================================================================
    *
  @@ -82,7 +82,7 @@
    * the server if this option is selected.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.3 $ $Date: 2001/02/20 01:48:46 $
  + * @version $Revision: 1.4 $ $Date: 2001/02/22 02:53:30 $
    */
   
   public class OptionTag extends BodyTagSupport {
  @@ -230,7 +230,7 @@
        results.append("<option value=\"");
        results.append(value);
        results.append("\"");
  -     if (value.equals(selectTag.getMatch()))
  +        if (selectTag.isMatched(value))
            results.append(" selected");
        results.append(">");
           String text = text();
  
  
  
  1.3       +10 -8     
jakarta-struts/src/share/org/apache/struts/taglib/html/OptionsTag.java
  
  Index: OptionsTag.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/OptionsTag.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- OptionsTag.java   2001/01/08 21:36:08     1.2
  +++ OptionsTag.java   2001/02/22 02:53:30     1.3
  @@ -3,7 +3,7 @@
    *
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights
  + * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -25,7 +25,7 @@
    *    Alternately, this acknowlegement may appear in the software itself,
    *    if and wherever such third-party acknowlegements normally appear.
    *
  - * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  + * 4. The names "The Jakarta Project", "Struts", and "Apache Software
    *    Foundation" must not be used to endorse or promote products derived
    *    from this software without prior written permission. For written
    *    permission, please contact [EMAIL PROTECTED]
  @@ -184,7 +184,6 @@
        if (selectTag == null)
            throw new JspException
                (messages.getMessage("optionsTag.select"));
  -     String match = selectTag.getMatch();
        StringBuffer sb = new StringBuffer();
   
           // If a collection was specified, use that mode to render options
  @@ -219,7 +218,9 @@
                           (messages.getMessage("getter.method",
                                                property, collection));
                   }
  -                addOption(sb, value.toString(), label.toString(), match);
  +                String stringValue = value.toString();
  +                addOption(sb, stringValue, label.toString(),
  +                          selectTag.isMatched(stringValue));
               }
           }
   
  @@ -240,7 +241,8 @@
                     String label = value;
                     if (labelsIterator.hasNext())
                         label = (String) labelsIterator.next();
  -                  addOption(sb, value, label, match);
  +                  addOption(sb, value, label,
  +                            selectTag.isMatched(value));
                 }
        }
   
  @@ -283,15 +285,15 @@
        * @param sb StringBuffer accumulating our results
        * @param value Value to be returned to the server for this option
        * @param label Value to be shown to the user for this option
  -     * @param match Match value that will cause this option to be selected
  +     * @param matched Should this value be marked as selected?
        */
       protected void addOption(StringBuffer sb, String value, String label,
  -                             String match) {
  +                             boolean matched) {
   
           sb.append("<option value=\"");
           sb.append(value);
           sb.append("\"");
  -        if (match.equals(value))
  +        if (matched)
               sb.append(" selected");
           sb.append(">");
           sb.append(label);
  
  
  
  1.3       +66 -35    
jakarta-struts/src/share/org/apache/struts/taglib/html/SelectTag.java
  
  Index: SelectTag.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/SelectTag.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SelectTag.java    2001/01/08 21:36:11     1.2
  +++ SelectTag.java    2001/02/22 02:53:30     1.3
  @@ -1,13 +1,13 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/SelectTag.java,v 1.2 
2001/01/08 21:36:11 craigmcc Exp $
  - * $Revision: 1.2 $
  - * $Date: 2001/01/08 21:36:11 $
  + * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/SelectTag.java,v 1.3 
2001/02/22 02:53:30 craigmcc Exp $
  + * $Revision: 1.3 $
  + * $Date: 2001/02/22 02:53:30 $
    *
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights
  + * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -29,7 +29,7 @@
    *    Alternately, this acknowlegement may appear in the software itself,
    *    if and wherever such third-party acknowlegements normally appear.
    *
  - * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  + * 4. The names "The Jakarta Project", "Struts", and "Apache Software
    *    Foundation" must not be used to endorse or promote products derived
    *    from this software without prior written permission. For written
    *    permission, please contact [EMAIL PROTECTED]
  @@ -71,6 +71,8 @@
   import javax.servlet.jsp.PageContext;
   import org.apache.struts.util.BeanUtils;
   import org.apache.struts.util.MessageResources;
  +import org.apache.struts.util.RequestUtils;
  +import org.apache.struts.util.ResponseUtils;
   
   
   /**
  @@ -79,7 +81,7 @@
    * inside a form tag.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.2 $ $Date: 2001/01/08 21:36:11 $
  + * @version $Revision: 1.3 $ $Date: 2001/02/22 02:53:30 $
    */
   
   public class SelectTag extends BaseHandlerTag {
  @@ -89,9 +91,9 @@
   
   
       /**
  -     * The actual value we will match against, calculated in doStartTag().
  +     * The actual values we will match against, calculated in doStartTag().
        */
  -    protected String match = null;
  +    protected String match[] = null;
   
   
       /**
  @@ -137,6 +139,12 @@
   
   
       /**
  +     * The saved body content of this tag.
  +     */
  +    protected String saveBody = null;
  +
  +
  +    /**
        * How many available options should be displayed when this element
        * is rendered?
        */
  @@ -161,11 +169,19 @@
   
   
       /**
  -     * Return the actual match value (only valid from nested tags).
  +     * Does the specified value match one of those we are looking for?
  +     *
  +     * @param value Value to be compared
        */
  -    public String getMatch() {
  +    public boolean isMatched(String value) {
   
  -     return (this.match);
  +        if ((match == null) || (value == null))
  +            return (false);
  +        for (int i = 0; i < match.length; i++) {
  +            if (value.equals(match[i]))
  +                return (true);
  +        }
  +        return (false);
   
       }
   
  @@ -252,39 +268,40 @@
        results.append(">");
   
        // Print this field to our output writer
  -     JspWriter writer = pageContext.getOut();
  -     try {
  -         writer.println(results.toString());
  -     } catch (IOException e) {
  -         throw new JspException
  -             (messages.getMessage("common.io", e.toString()));
  -     }
  +        ResponseUtils.write(pageContext, results.toString());
   
        // Store this tag itself as a page attribute
        pageContext.setAttribute(Constants.SELECT_KEY, this);
   
  -     // Calculate the match value we will actually be using
  +     // Calculate the match values we will actually be using
        if (value != null) {
  -         match = value;
  +         match = new String[1];
  +            match[0] = value;
           } else {
            Object bean = pageContext.findAttribute(name);
  -         if (bean == null)
  -             throw new JspException
  +         if (bean == null) {
  +                JspException e = new JspException                    
                    (messages.getMessage("getter.bean", name));
  +                RequestUtils.saveException(pageContext, e);
  +                throw e;
  +            }
            try {
  -             match = BeanUtils.getProperty(bean, property);
  +             match = BeanUtils.getArrayProperty(bean, property);
                if (match == null)
  -                 match = "";
  +                 match = new String[0];
            } catch (IllegalAccessException e) {
  -             throw new JspException
  +                RequestUtils.saveException(pageContext, e);
  +                throw new JspException
                    (messages.getMessage("getter.access", property, name));
            } catch (InvocationTargetException e) {
                Throwable t = e.getTargetException();
  +                RequestUtils.saveException(pageContext, t);
                throw new JspException
                    (messages.getMessage("getter.result",
                                         property, t.toString()));
            } catch (NoSuchMethodException e) {
  -             throw new JspException
  +                RequestUtils.saveException(pageContext, e);
  +                throw new JspException
                    (messages.getMessage("getter.method", property, name));
            }
        }
  @@ -297,6 +314,25 @@
   
   
       /**
  +     * Save any body content of this tag, which will generally be the
  +     * option(s) representing the values displayed to the user.
  +     *
  +     * @exception JspException if a JSP exception has occurred
  +     */
  +    public int doAfterBody() throws JspException {
  +
  +        if (bodyContent != null) {
  +            String value = bodyContent.getString();
  +            if (value == null)
  +                value = "";
  +            saveBody = value.trim();
  +        }
  +        return (SKIP_BODY);
  +
  +    }
  +
  +
  +    /**
        * Render the end of this form.
        *
        * @exception JspException if a JSP exception has occurred
  @@ -308,18 +344,12 @@
   
        // Render a tag representing the end of our current form
        StringBuffer results = new StringBuffer();
  -     if (bodyContent != null)
  -         results.append(bodyContent.getString());
  +     if (saveBody != null)
  +         results.append(saveBody);
        results.append("</select>");
   
        // Print this value to our output writer
  -     JspWriter writer = pageContext.getOut();
  -     try {
  -         writer.println(results.toString());
  -     } catch (IOException e) {
  -         throw new JspException
  -             (messages.getMessage("common.io", e.toString()));
  -     }
  +        ResponseUtils.write(pageContext, results.toString());
   
        // Continue processing this page
        return (EVAL_PAGE);
  @@ -337,6 +367,7 @@
        multiple = null;
        name = Constants.BEAN_KEY;
        property = null;
  +        saveBody = null;
        size = null;
        value = null;
   
  
  
  
  1.6       +33 -4     jakarta-struts/src/test/org/apache/struts/test/TestBean.java
  
  Index: TestBean.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/test/org/apache/struts/test/TestBean.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TestBean.java     2001/01/28 02:22:47     1.5
  +++ TestBean.java     2001/02/22 02:53:31     1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/test/org/apache/struts/test/TestBean.java,v 1.5 
2001/01/28 02:22:47 craigmcc Exp $
  - * $Revision: 1.5 $
  - * $Date: 2001/01/28 02:22:47 $
  + * $Header: 
/home/cvs/jakarta-struts/src/test/org/apache/struts/test/TestBean.java,v 1.6 
2001/02/22 02:53:31 craigmcc Exp $
  + * $Revision: 1.6 $
  + * $Date: 2001/02/22 02:53:31 $
    *
    * ====================================================================
    *
  @@ -72,7 +72,7 @@
    * General purpose test bean for Struts custom tag tests.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.5 $ $Date: 2001/01/28 02:22:47 $
  + * @version $Revision: 1.6 $ $Date: 2001/02/22 02:53:31 $
    */
   
   public class TestBean extends ActionForm {
  @@ -186,6 +186,21 @@
   
   
       /**
  +     * A multiple-String SELECT element.
  +     */
  +    private String[] multipleSelect = { "Multiple 3", "Multiple 5",
  +                                        "Multiple 7" };
  +
  +    public String[] getMultipleSelect() {
  +        return (this.multipleSelect);
  +    }
  +
  +    public void setMultipleSelect(String multipleSelect[]) {
  +        this.multipleSelect = multipleSelect;
  +    }
  +
  +
  +    /**
        * A nested reference to another test bean (populated as needed).
        */
       private TestBean nested = null;
  @@ -222,6 +237,20 @@
   
       public void setShortProperty(short shortProperty) {
           this.shortProperty = shortProperty;
  +    }
  +
  +
  +    /**
  +     * A single-String value for a SELECT element.
  +     */
  +    private String singleSelect = "Single 5";
  +
  +    public String getSingleSelect() {
  +        return (this.singleSelect);
  +    }
  +
  +    public void setSingleSelect(String singleSelect) {
  +        this.singleSelect = singleSelect;
       }
   
   
  
  
  
  1.6       +1 -0      jakarta-struts/web/test/index.jsp
  
  Index: index.jsp
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/test/index.jsp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- index.jsp 2001/02/13 01:56:08     1.5
  +++ index.jsp 2001/02/22 02:53:32     1.6
  @@ -23,6 +23,7 @@
   <h3>HTML Tags</h3>
   <ul>
   <li><a href="html-multibox.jsp">&lt;html:multibox&gt;</a></li>
  +<li><a href="html-select.jsp">&lt;html:select&gt;</a></li>
   <li><a href="html-setters.jsp">Scalar Setters</a></li>
   </ul>
   
  
  
  
  1.1                  jakarta-struts/web/test/html-select.jsp
  
  Index: html-select.jsp
  ===================================================================
  <%@ page language="java"%>
  <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
  <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
  <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
  <html:html>
  <head>
  <title>Test html:select Tag</title>
  <%
    String multipleValues[] =
     { "Multiple 0", "Multiple 1", "Multiple 2", "Multiple 3", "Multiple 4",
       "Multiple 5", "Multiple 6", "Multiple 7", "Multiple 8", "Multiple 9" };
    pageContext.setAttribute("multipleValues", multipleValues);
  %>
  </head>
  <body bgcolor="white">
  
  <div align="center">
  <h1>Test struts-html Select Tag</h1>
  </div>
  
  Whatever changes you make to properties should be reflected when the page
  is redisplayed.  Press "Save" to update, or "Cancel" to return to the
  main menu.
  
  <html:form action="html-select.do">
  <table border="0" width="100%">
  
    <tr>
      <th align="right">Single Select Allowed:</th>
      <td align="left">
        <html:select property="singleSelect" size="10">
          <html:option value="Single 0">Single 0</html:option>
          <html:option value="Single 1">Single 1</html:option>
          <html:option value="Single 2">Single 2</html:option>
          <html:option value="Single 3">Single 3</html:option>
          <html:option value="Single 4">Single 4</html:option>
          <html:option value="Single 5">Single 5</html:option>
          <html:option value="Single 6">Single 6</html:option>
          <html:option value="Single 7">Single 7</html:option>
          <html:option value="Single 8">Single 8</html:option>
          <html:option value="Single 9">Single 9</html:option>
        </html:select>
      </td>
    </tr>
  
    <tr>
      <th align="right">Multiple Select Allowed:</th>
      <td align="left">
        <html:select property="multipleSelect" size="10" multiple="true">
          <html:options name="multipleValues" labelName="multipleValues"/>
        </html:select>
      </td>
    </tr>
  
    <tr>
      <td align="right">
        <html:submit>Save</html:submit>
      </td>
      <td align="left">
        <html:reset>Reset</html:reset>
        <html:cancel>Cancel</html:cancel>
      </td>
    </tr>
  
  </table>
  
  </html:form>
  
  
  </html:html>
  
  
  
  1.3       +10 -0     jakarta-struts/web/test/WEB-INF/struts-config.xml
  
  Index: struts-config.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/test/WEB-INF/struts-config.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- struts-config.xml 2001/01/08 22:21:00     1.2
  +++ struts-config.xml 2001/02/22 02:53:33     1.3
  @@ -16,6 +16,7 @@
     </global-forwards>
   
     <action-mappings>
  +
       <action    path="/html-multibox"
                  type="org.apache.struts.test.HtmlSettersAction"
                  name="testbean"
  @@ -23,6 +24,15 @@
              validate="false">
         <forward name="input"                path="/html-multibox.jsp"/>
       </action>
  +
  +    <action    path="/html-select"
  +               type="org.apache.struts.test.HtmlSettersAction"
  +               name="testbean"
  +              scope="session"
  +           validate="false">
  +      <forward name="input"                path="/html-select.jsp"/>
  +    </action>
  +
       <action    path="/html-setters"
                  type="org.apache.struts.test.HtmlSettersAction"
                  name="testbean"
  
  
  

Reply via email to