View Javadoc

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