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