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 }