001/* 002 * Copyright 2004 The Apache Software Foundation. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.nuxeo.ecm.platform.ui.web.component; 017 018import java.util.Locale; 019import java.util.Map; 020 021import javax.el.ValueExpression; 022import javax.faces.context.FacesContext; 023import javax.faces.model.SelectItem; 024 025import org.apache.commons.lang3.StringUtils; 026import org.nuxeo.common.utils.i18n.I18NUtils; 027import org.nuxeo.ecm.platform.ui.web.util.ComponentTagUtils; 028 029/** 030 * EasySelectItem from http://jsf-comp.sourceforge.net/components/easysi/index.html, adapted to work with single select 031 * item. 032 * 033 * @author Cagatay-Mert 034 * @author <a href="mailto:[email protected]">Anahide Tchertchian</a> 035 */ 036public class UISelectItem extends javax.faces.component.UISelectItem { 037 038 public static final String COMPONENT_TYPE = UISelectItem.class.getName(); 039 040 enum PropertyKeys { 041 var, itemRendered, itemLabels, resolveItemLabelTwice, 042 // 043 localize, dbl10n; 044 } 045 046 public String getVar() { 047 return (String) getStateHelper().eval(PropertyKeys.var); 048 } 049 050 public void setVar(String var) { 051 getStateHelper().put(PropertyKeys.var, var); 052 } 053 054 @SuppressWarnings("boxing") 055 public boolean isItemRendered() { 056 return (Boolean) getStateHelper().eval(PropertyKeys.itemRendered, false); 057 } 058 059 @SuppressWarnings("boxing") 060 public void setItemRendered(boolean itemRendered) { 061 getStateHelper().put(PropertyKeys.itemRendered, itemRendered); 062 } 063 064 public boolean isResolveItemLabelTwice() { 065 return Boolean.TRUE.equals(getStateHelper().eval(PropertyKeys.resolveItemLabelTwice, Boolean.FALSE)); 066 } 067 068 @SuppressWarnings("boxing") 069 public void setResolveItemLabelTwice(boolean resolveItemLabelTwice) { 070 getStateHelper().put(PropertyKeys.resolveItemLabelTwice, resolveItemLabelTwice); 071 } 072 073 @SuppressWarnings("unchecked") 074 public Map<String, String> getItemLabels() { 075 return (Map<String, String>) getStateHelper().eval(PropertyKeys.itemLabels); 076 } 077 078 public void setItemLabels(Map<String, String> itemLabels) { 079 getStateHelper().put(PropertyKeys.itemLabels, itemLabels); 080 } 081 082 @SuppressWarnings("boxing") 083 public boolean isLocalize() { 084 return (Boolean) getStateHelper().eval(PropertyKeys.localize, Boolean.FALSE); 085 } 086 087 @SuppressWarnings("boxing") 088 public void setLocalize(boolean localize) { 089 getStateHelper().put(PropertyKeys.localize, localize); 090 } 091 092 @SuppressWarnings("boxing") 093 public boolean isdbl10n() { 094 return (Boolean) getStateHelper().eval(PropertyKeys.dbl10n, Boolean.FALSE); 095 } 096 097 @SuppressWarnings("boxing") 098 public void setdbl10n(boolean dbl10n) { 099 getStateHelper().put(PropertyKeys.dbl10n, dbl10n); 100 } 101 102 @Override 103 public Object getValue() { 104 Object value = super.getValue(); 105 return new SelectItemFactory() { 106 107 @Override 108 protected String getVar() { 109 return UISelectItem.this.getVar(); 110 } 111 112 @Override 113 protected SelectItem createSelectItem() { 114 return UISelectItem.this.createSelectItem(); 115 } 116 117 }.createSelectItem(value); 118 } 119 120 protected String translate(FacesContext context, Locale locale, String label) { 121 if (StringUtils.isBlank(label)) { 122 return label; 123 } 124 String bundleName = context.getApplication().getMessageBundle(); 125 label = I18NUtils.getMessageString(bundleName, label, null, locale); 126 return label; 127 } 128 129 protected String retrieveItemLabel() { 130 FacesContext ctx = FacesContext.getCurrentInstance(); 131 Locale locale = ctx.getViewRoot().getLocale(); 132 String label = null; 133 if (isdbl10n()) { 134 Map<String, String> labels = getItemLabels(); 135 if (labels != null) { 136 if (labels.containsKey(locale.getLanguage())) { 137 label = labels.get(locale.getLanguage()); 138 } else { 139 // fallback on en 140 label = labels.get("en"); 141 } 142 } 143 } 144 if (StringUtils.isBlank(label)) { 145 Object labelObject = getItemLabel(); 146 label = labelObject != null ? labelObject.toString() : null; 147 } 148 if (isResolveItemLabelTwice() && ComponentTagUtils.isValueReference(label)) { 149 ValueExpression ve = ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), 150 label, Object.class); 151 if (ve != null) { 152 Object newLabel = ve.getValue(ctx.getELContext()); 153 if (newLabel instanceof String) { 154 label = (String) newLabel; 155 } 156 } 157 } 158 if (isLocalize()) { 159 label = translate(ctx, locale, label); 160 } 161 return label; 162 } 163 164 protected SelectItem createSelectItem() { 165 if (!isItemRendered()) { 166 return null; 167 } 168 Object value = getItemValue(); 169 Object labelObject = getItemLabel(); 170 String label = labelObject != null ? labelObject.toString() : null; 171 // make sure label is never blank 172 if (StringUtils.isBlank(label)) { 173 label = String.valueOf(value); 174 } 175 return new SelectItem(value, label, null, isItemDisabled(), isItemEscaped()); 176 } 177 178}