1 19 20 package com.sslexplorer.input.tags; 21 22 import java.util.Iterator ; 23 import java.util.Locale ; 24 25 import javax.servlet.jsp.JspException ; 26 27 import org.apache.struts.Globals; 28 import org.apache.struts.taglib.TagUtils; 29 import org.apache.struts.util.LabelValueBean; 30 import org.apache.struts.util.MessageResources; 31 32 import com.sslexplorer.core.CoreUtil; 33 import com.sslexplorer.input.MultiSelectSelectionModel; 34 35 38 public class MultiSelectListBoxTag extends AbstractMultiFieldTag { 39 40 protected String modelName; 41 protected String modelProperty; 42 protected String sourceTitleKey; 43 protected String valueKeyPrefix; 44 45 public MultiSelectListBoxTag() { 46 super(); 47 release(); 48 } 49 50 public void release() { 51 super.release(); 52 this.type = "hidden"; 53 setStyleId("multiSelect"); 54 setRows("5"); 55 modelName = null; 56 modelProperty = null; 57 sourceTitleKey = null; 58 valueKeyPrefix = null; 59 } 60 61 64 public int doStartTag() throws JspException { 65 66 String sourceTitle = null; 67 if(sourceTitleKey != null) { 68 sourceTitle = 69 TagUtils.getInstance().message( 70 pageContext, 71 getBundle(), 72 getLocale(), 73 sourceTitleKey, 74 new String [] { }); 75 76 if (sourceTitle == null) { 77 JspException e = 78 new JspException ( 79 messages.getMessage("message.message", "\"" + sourceTitleKey + "\"")); 80 TagUtils.getInstance().saveException(pageContext, e); 81 throw e; 82 } 83 } 84 85 String targetTitle = prepareTargetTitle(); 86 87 88 StringBuffer results = new StringBuffer ("<div "); 89 results.append(prepareStyles()); 90 results.append(">"); 91 results.append(this.renderInputElement()); 92 results.append("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); 93 if(sourceTitle != null || targetTitle != null) { 94 results.append("<tr class=\"header\"><td class=\"source\">"); 95 if(sourceTitle != null) { 96 results.append(sourceTitle); 97 } 98 results.append("</td><td class=\"actions\"/><td class=\"target\">"); 99 if(targetTitle != null) { 100 results.append(targetTitle); 101 } 102 results.append("</td></tr>"); 103 } 104 results.append("<tr class=\"body\"><td class=\"source\">"); 105 results.append(renderSourceComponent()); 106 results.append("</td><td class=\"actions\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); 107 results.append("<tr><td>"); 108 results.append(renderSelectComponent()); 109 results.append("</td></tr>"); 110 results.append("<tr><td>"); 111 results.append(renderDeselectComponent()); 112 if(configureKey != null) { 113 results.append("</td></tr><tr><td>"); 114 results.append(renderConfigureComponent()); 115 } 116 if(isAllowReordering()) { 117 results.append("</td></tr><tr><td>"); 118 results.append(renderUpComponent()); 119 results.append("</td></tr><tr><td>"); 120 results.append(renderDownComponent()); 121 } 122 results.append("</td></tr></table></td><td class=\"target\">"); 123 results.append(renderTargetComponent()); 124 results.append("</td></tr></table></div>"); 125 TagUtils.getInstance().write(this.pageContext, results.toString()); 126 127 return (EVAL_BODY_BUFFERED); 128 } 129 130 protected String prepareSourceId() throws JspException { 131 StringBuffer results = new StringBuffer ("sourceValues_"); 132 if(indexed) { 133 prepareIndex(results, name); 134 } 135 results.append(property); 136 return results.toString(); 137 } 138 139 protected String renderSourceComponent() throws JspException { 140 StringBuffer results = new StringBuffer ("<select multiple id=\""); 141 results.append(prepareSourceId()); 142 results.append("\""); 143 if (rows != null) { 144 results.append(" size=\""); 145 results.append(rows); 146 results.append("\""); 147 } 148 results.append(prepareDisabled()); 149 results.append(">"); 150 Object value = TagUtils.getInstance().lookup(pageContext, modelName, modelProperty, 151 null); 152 if (value == null || ! ( value instanceof MultiSelectSelectionModel )) { 153 throw new JspException ("Model attributes must specify an instance of MultiSelectListDataSourceModel (" + value + ")"); 154 } 155 MultiSelectSelectionModel model = (MultiSelectSelectionModel)value; 156 for(Iterator i = model.getAvailableValues().iterator(); i.hasNext(); ) { 157 LabelValueBean lvb = (LabelValueBean)i.next(); 158 results.append("<option value=\""); 159 results.append(lvb.getValue()); 160 results.append("\">"); 161 results.append(getLocalisedLabel(lvb)); 162 results.append("</option>"); 163 } 164 results.append("</select>"); 165 return results.toString(); 166 167 } 168 169 protected String renderSelectComponent() throws JspException { 170 StringBuffer results = new StringBuffer ("<input class=\"multiAdd\""); 171 results.append(prepareDisabled()); 172 results.append(" onclick=\"multiSelectSelectValue("); 173 results.append("document.getElementById('"); 174 if (indexed) { 175 this.prepareIndex(results, name); 176 } 177 results.append(property); 178 results.append("'), document.getElementById('"); 179 results.append(prepareSourceId()); 180 results.append("'), document.getElementById('"); 181 results.append(prepareTargetId()); 182 results.append("'));\" type=\"button\" value=\""); 183 results.append(prepareAdd()); 184 results.append("\"/>"); 185 return results.toString(); 186 } 187 188 protected String renderDeselectComponent() throws JspException { 189 StringBuffer results = new StringBuffer ("<input class=\"multiRemove\""); 190 results.append(prepareDisabled()); 191 results.append(" onclick=\"multiSelectDeselectValue("); 192 results.append("document.getElementById('"); 193 if (indexed) { 194 this.prepareIndex(results, name); 195 } 196 results.append(property); 197 results.append("'), document.getElementById('"); 198 results.append(prepareSourceId()); 199 results.append("'), document.getElementById('"); 200 results.append(prepareTargetId()); 201 results.append("'));\" type=\"button\" value=\""); 202 results.append(prepareRemove()); 203 results.append("\"/>"); 204 return results.toString(); 205 } 206 207 protected String renderTargetComponent() throws JspException { 208 StringBuffer results = new StringBuffer ("<select multiple id=\""); 209 results.append(prepareTargetId()); 210 results.append("\""); 211 if (rows != null) { 212 results.append(" size=\""); 213 results.append(rows); 214 results.append("\""); 215 } 216 results.append(">"); 217 Object value = TagUtils.getInstance().lookup(pageContext, modelName, modelProperty, 218 null); 219 if (value == null || ! ( value instanceof MultiSelectSelectionModel )) { 220 throw new JspException ("Model attributes must specify an instance of MultiSelectListDataSourceModel (" + value + ")"); 221 } 222 MultiSelectSelectionModel model = (MultiSelectSelectionModel)value; 223 for(Iterator i = model.getSelectedValues().iterator(); i.hasNext(); ) { 224 LabelValueBean lvb = (LabelValueBean)i.next(); 225 results.append("<option value=\""); 226 results.append(lvb.getValue()); 227 results.append("\">"); 228 results.append(getLocalisedLabel(lvb)); 229 results.append("</option>"); 230 } 231 results.append("</select>"); 232 return results.toString(); 233 234 } 235 236 protected String getLocalisedLabel(LabelValueBean lvb) { 237 if(valueKeyPrefix != null) { 238 Locale locale = (Locale )pageContext.getSession().getAttribute(Globals.LOCALE_KEY); 239 if(locale != null) { 240 MessageResources mr = CoreUtil.getMessageResources(pageContext.getSession(), getBundle()); 241 if(mr != null) { 242 String locLabel = mr.getMessage(locale, valueKeyPrefix + ".value." + lvb.getValue()); 243 if(locLabel != null) { 244 return locLabel; 245 } 246 } 247 } 248 } 249 return lvb.getLabel(); 250 } 251 252 255 protected String renderInputElement() throws JspException { 256 StringBuffer results = new StringBuffer ("<input type=\""); 257 results.append(this.type); 258 results.append("\""); 259 results.append(prepareDisabled()); 260 results.append(" name=\""); 261 262 if (indexed) { 263 this.prepareIndex(results, name); 264 } 265 266 results.append(property); 267 results.append("\""); 268 269 results.append(" id=\""); 270 if(indexed) { 271 this.prepareIndex(results, name); 272 } 273 274 results.append(property); 275 results.append("\""); 276 277 results.append(" value=\""); 278 if (value != null) { 279 results.append(this.formatValue(value)); 280 281 } else if (redisplay || !"password".equals(type)) { 282 Object value = 283 TagUtils.getInstance().lookup(pageContext, name, property, null); 284 285 results.append(this.formatValue(value)); 286 } 287 results.append('"'); 288 results.append(this.prepareEventHandlers()); 289 results.append(this.getElementClose()); 290 return results.toString(); 291 } 292 293 294 297 public String getModelName() { 298 return modelName; 299 } 300 301 304 public void setModelName(String modelName) { 305 this.modelName = modelName; 306 } 307 308 311 public String getModelProperty() { 312 return modelProperty; 313 } 314 315 318 public void setModelProperty(String modelProperty) { 319 this.modelProperty = modelProperty; 320 } 321 322 325 public String getSourceTitleKey() { 326 return sourceTitleKey; 327 } 328 329 332 public void setSourceTitleKey(String sourceTitleKey) { 333 this.sourceTitleKey = sourceTitleKey; 334 } 335 336 public void setValueKeyPrefix(String valueKeyPrefix) { 337 this.valueKeyPrefix = valueKeyPrefix; 338 } 339 } 340 | Popular Tags |