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 }