View Javadoc

    1   package org.apache.turbine.util.template;
    2
    3   import org.apache.ecs.html.Option;
    4   import org.apache.ecs.html.Select;
    5
    6
    7   /*
    8    * Licensed to the Apache Software Foundation (ASF) under one
    9    * or more contributor license agreements.  See the NOTICE file
    10   * distributed with this work for additional information
    11   * regarding copyright ownership.  The ASF licenses this file
    12   * to you under the Apache License, Version 2.0 (the
    13   * "License"); you may not use this file except in compliance
    14   * with the License.  You may obtain a copy of the License at
    15   *
    16   *   http://www.apache.org/licenses/LICENSE-2.0
    17   *
    18   * Unless required by applicable law or agreed to in writing,
    19   * software distributed under the License is distributed on an
    20   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    21   * KIND, either express or implied.  See the License for the
    22   * specific language governing permissions and limitations
    23   * under the License.
    24   */
    25
    26  /**
    27   * This class is for generating a SelectorBox. It is good when used
    28   * with WM because you can stuff it into the context and then just
    29   * call it to generate the HTML.  It can be used in other cases as
    30   * well, but WM is the best case for it right now.
    31   *
    32   * <p>For example code showing the usage for this module, please see
    33   * the toString() method below to see how it would be referred to from
    34   * WM.
    35   *
    36   * <pre>
    37   * // get the roles for a user
    38   * RoleSet userRoles = new DefaultAccessControl().getRoles(loginid, null);
    39   * if ( userRoles != null )
    40   * {
    41   *     context.put("hasRoleSet", Boolean.TRUE);
    42   *
    43   *     // get an array of the users roles
    44   *     Role[] usersRoles = userRoles.getRolesArray();
    45   *     // get an array of all the roles in the system
    46   *     Role[] allRoles = ((RoleSet)RolePeer.retrieveSet()).getRolesArray();
    47   *
    48   *     Object[] names = new Object[allRoles.length];
    49   *     Object[] values = new Object[allRoles.length];
    50   *     for ( int i=0;i&lt;allRoles.length; i++ )
    51   *     {
    52   *         names[i] = Integer.valueOf(allRoles[i].getPrimaryKey()).toString();
    53   *         values[i] = allRoles[i].getName();
    54   *     }
    55   *
    56   *     SelectorBox sb = new SelectorBox("roleSetBox", names, values);
    57   *     sb.buildBooleans(usersRoles, allRoles);
    58   *     context.put("roleSetBox", sb);
    59   * }
    60   * else
    61   * {
    62   *     context.put("hasRoleSet", Boolean.FALSE);
    63   * }
    64   * </pre>
    65   *
    66   * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
    67   * @version $Id: SelectorBox.java 1726423 2016-01-23 17:55:09Z tv $
    68   */
    69  public class SelectorBox
    70  {
    71      /** This is the Select ECS element. */
    72      private Select sel = null;
    73
    74      /** This is the size of the Select statement. */
    75      private int size = 1;
    76
    77      /** This is the name= value. */
    78      private String name = null;
    79
    80      /** This is the value= portion of the option element. */
    81      private Object[] names = null;
    82
    83      /** This is the data after the option element. */
    84      private Object[] values = null;
    85
    86      /** This is an array of which items are selected. */
    87      private boolean[] selected = null;
    88
    89      /**
    90       * Generic constructor, builds a select box with a default size of
    91       * 1 and no selected items.
    92       *
    93       * @param name A String with the name for the select box.
    94       * @param names An Object[] with the names.
    95       * @param values An Object[] with the values.
    96       */
    97      public SelectorBox(String name, Object[] names, Object[] values)
    98      {
    99          this(name, names, values, 1, null);
    100     }
    101
    102     /**
    103      * Generic constructor builds a select box.
    104      *
    105      * @param name A String with the name for the select box.
    106      * @param names An Object[] with the names.
    107      * @param values An Object[] with the values.
    108      * @param size An int specifying the size.
    109      */
    110     public SelectorBox(String name, Object[] names, Object[] values, int size)
    111     {
    112         this(name, names, values, size, null);
    113     }
    114
    115     /**
    116      * Generic constructor builds a select box.
    117      *
    118      * @param name A String with the name for the select box.
    119      * @param names An Object[] with the names.
    120      * @param values An Object[] with the values.
    121      * @param selected A boolean[] with the selected items.
    122      */
    123     public SelectorBox(String name, Object[] names, Object[] values,
    124                        boolean[] selected)
    125     {
    126         this(name, names, values, 1, selected);
    127     }
    128
    129     /**
    130      * Primary constructor for everything.
    131      *
    132      * @param name A String with the name for the select box.
    133      * @param names An Object[] with the names.
    134      * @param values An Object[] with the values.
    135      * @param size An int specifying the size.
    136      * @param selected A boolean[] with the selected items.
    137      */
    138     public SelectorBox(String name, Object[] names, Object[] values, int size,
    139                        boolean[] selected)
    140     {
    141         this.name = name;
    142         this.names = names;
    143         this.values = values;
    144         this.size = size;
    145         this.selected = selected;
    146
    147         sel = new Select(name, size);
    148         sel.setName(name);
    149         sel.setSize(size);
    150     }
    151
    152     /**
    153      * Pass in an array of selected items and the entire set of items
    154      * and it will determine which items in the selected set are also
    155      * in the entire set and then build a boolean[] up that is the same
    156      * size as the entireSet with markings to tell whether or not the
    157      * items are marked or not.  It uses toString().equalsIgnoreCase()
    158      * on the Object in the Object[] to determine if the items are
    159      * equal.
    160      *
    161      * @param selectedSet An Object[].
    162      * @param entireSet An Object[].
    163      */
    164     public void buildBooleans(Object[] selectedSet, Object[] entireSet)
    165     {
    166         selected = new boolean[entireSet.length];
    167         for (int j = 0; j < entireSet.length; j++)
    168         {
    169             Object r2 = entireSet[j];
    170             for (int i = 0; i < selectedSet.length; i++)
    171             {
    172                 Object r1 = selectedSet[i];
    173                 if (r1 != null && r2 != null &&
    174                         r1.toString().equalsIgnoreCase(r2.toString()))
    175                 {
    176                     selected[j] = true;
    177                 }
    178             }
    179         }
    180     }
    181
    182     /**
    183      * This builds out the select box at a certain size.  To use this
    184      * element in WM, you simply build this object in your java code,
    185      * put it into the context and then call $selectBox.toString(5).
    186      *
    187      * @param size An int with the size.
    188      * @return A String with the HTML code.
    189      */
    190     public String toString(int size)
    191     {
    192         sel.setSize(size);
    193         sel.setName(name);
    194         for (int f = 0; f < values.length; f++)
    195         {
    196             Option opt = new Option((String) values[f]);
    197             opt.addElement((String) names[f]);
    198             if (selected != null && selected[f] == true)
    199             {
    200                 opt.setSelected(true);
    201             }
    202             sel.addElement(opt);
    203         }
    204         String output = sel.toString();
    205         reset();
    206         return output;
    207     }
    208
    209     /**
    210      * Resets the internal state of the SelectorBox.
    211      */
    212     public void reset()
    213     {
    214         sel = new Select(name, size);
    215     }
    216
    217     /**
    218      * This builds out the select box at a certain size.  To use this
    219      * element in WM, you simply build this object in your java code,
    220      * put it into the context and then call $selectBox and it will
    221      * build it with the default size of 1.
    222      *
    223      * @return A String with the HTML code.
    224      */
    225     @Override
    226     public String toString()
    227     {
    228         return this.toString(size);
    229     }
    230
    231     /**
    232      * This allows you to set the multiple attribute to the select
    233      * element.  Example usage from within WM is like this:
    234      *
    235      * <p>
    236      * $selectBox.setMultiple(true).toString(4)
    237      *
    238      * @param val True if multiple selection should be allowed.
    239      * @return A SelectorBox (self).
    240      */
    241     public SelectorBox setMultiple(boolean val)
    242     {
    243         sel.setMultiple(val);
    244         return this;
    245     }
    246
    247     /**
    248      * This allows one to set the name= attribute to the select
    249      * element.
    250      *
    251      * @param name A String with the name.
    252      * @return A SelectorBox (self).
    253      */
    254     public SelectorBox setName(String name)
    255     {
    256         this.name = name;
    257         sel.setName(name);
    258         return this;
    259     }
    260
    261     /**
    262      * This allows one to set the size of the select element.
    263      *
    264      * @param size An int with the size.
    265      * @return A SelectorBox (self).
    266      */
    267     public SelectorBox setSize(int size)
    268     {
    269         this.size = size;
    270         sel.setSize(size);
    271         return this;
    272     }
    273
    274     /**
    275      * This allows one to set an onChange attribute on the select tag
    276      *
    277      * @param script A string with the script to put in onChange
    278      * @return A SelectorBox (self).
    279      */
    280     public SelectorBox setOnChange(String script)
    281     {
    282         sel.setOnChange(script);
    283         return this;
    284     }
    285
    286     /**
    287      * This allows one to set the array of selected booleans.
    288      *
    289      * @param bools an array of booleans
    290      * @return A SelectorBox (self).
    291      */
    292     public SelectorBox setSelected(boolean[] bools)
    293     {
    294         this.selected = bools;
    295         return this;
    296     }
    297
    298     /**
    299      * This will set all elements as unselected, except for the
    300      * element(s) with the given name.
    301      *
    302      * @param name The name to appear as selected.
    303      * @return A SelectorBox (self).
    304      */
    305     public SelectorBox setSelected(Object name)
    306     {
    307         if (name != null)
    308         {
    309             selected = new boolean[names.length];
    310             for (int i = 0; i < names.length; i++)
    311             {
    312                 Object o = names[i];
    313                 if (o != null && o.toString().equalsIgnoreCase(name.toString()))
    314                 {
    315                     selected[i] = true;
    316                 }
    317             }
    318         }
    319         return this;
    320     }
    321 }