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<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 }