package org.jdesktop.swingx.renderer;
import java.util.Locale;
import java.util.Map;
import org.jdesktop.swingx.plaf.UIManagerExt;
import org.jdesktop.swingx.util.Contract;
/**
* A StringValue which looks up localized String representations for objects.
*/
public class LocalizableStringValue implements StringValue {
private Map<Object, String> lookup;
private Locale locale;
private String prefix;
/**
* Instantiates a LocaleStringValue which looks up localized String
* representations for items in the map using the JComponent defaultLocale.
*
* @param lookup a map containing Entries of objects and a string key to
* look up its string representation in the UIManager
*/
public LocalizableStringValue(Map<Object, String> lookup) {
this(lookup, null, null);
}
/**
* Instantiates a LocaleStringValue which looks up localized String
* representations for items in the map using the given Locale.
*
* @param lookup a map containing Entries of objects and a string key to
* look up its string representation in the UIManager
* @param locale the locale to lookup the localized strings, may be null to
* denote using JComponent.defaultLocale
*/
public LocalizableStringValue(Map<Object, String> lookup, Locale locale) {
this(lookup, null, locale);
}
/**
* Instantiates a LocaleStringValue which looks up localized String
* representations for items in the map using the JComponent defaultLocale.
*
* @param lookup a map containing Entries of objects and a string key to
* look up its string representation in the UIManager
* @param prefix a common prefix for all string keys in the map, may be null
* to denote that the keys should be use as are
*/
public LocalizableStringValue(Map<Object, String> lookup, String prefix) {
this(lookup, prefix, null);
}
/**
* Instantiates a LocaleStringValue which looks up localized String
* representations for items in the map using the given Locale.
*
* @param lookup a map containing Entries of objects and a string key to
* look up its string representation in the UIManager
* @param prefix a common prefix for all string keys in the map, may be null
* to denote that the keys should be use as are
* @param locale the locale to lookup the localized strings, may be null to
* denote using JComponent.defaultLocale
*/
public LocalizableStringValue(Map<Object, String> lookup, String prefix,
Locale locale) {
this.lookup = Contract.asNotNull(lookup, "map must not be null");
this.prefix = prefix;
setLocale(locale);
}
/**
*
* @inherited <p>
*
* Implemented to lookup the value's localized string
* representation, if contained in the lookup map. Returns
* the fallback if not contained.
*
*/
@Override
public String getString(Object value) {
String key = getKey(value);
if (key != null) {
String text = getLocalizedString(key);
if (text != null)
return text;
}
return getFallbackString(value);
}
/**
* Returns the key for the given value. The prefix is prepended
* to the key if both are available.
*
* May be null if not available.
*
* @param value the value to find the key for
* @return the key or null if not available.
*/
protected String getKey(Object value) {
String key = lookup.get(value);
if (key != null) {
if (prefix != null) {
key = prefix + key;
}
}
return key;
}
/**
* Returns the fallback string representation. This method is called
* when a localized value isn't available be found.<p>
*
* This implementation returns toString.
*
* @param value the object to return a string representation for.
* @return a string representation for the value
*/
protected String getFallbackString(Object value) {
return StringValues.TO_STRING_UI.getString(value);
}
/**
* Returns the localized value for the given key or null if not
* found. <p>
*
* This implementation queries the UIManagerExt.
*
* @param key the key to search a value for
* @return the localized value for the given key or null if not
* available.
*/
protected String getLocalizedString(String key) {
return UIManagerExt.getString(key, getLocale());
}
// -------------------- implement Localizable
/**
* Sets the Locale to use for lookup of localized string representation.
*
* @param locale the locale to lookup the localized strings, may be null to
* denote using Locale's default.
*/
public final void setLocale(Locale locale) {
this.locale = locale;
}
/**
* Returns the Locale to use for lookup, guaranteed to be not null. If
* the initial setting had been null, returns current Locale's default.
*
* @return the Locale used for lookup.
*/
public Locale getLocale() {
return locale != null ? locale : Locale.getDefault();
}
}