/* * $Id$ * * Copyright (c) 2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.i18n; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.swing.Box; import javax.swing.JComboBox; import javax.swing.JLabel; import VASSAL.configure.Configurer; import VASSAL.tools.SequenceEncoder; /** * Configure a Locale Value using full, localized Language and Country names * * @author Brent Easton * */ public class LocaleConfigurer extends Configurer { protected static final String ANY_COUNTRY = "<Any Country>"; protected Box panel; protected static Map<String,String> languages = new HashMap<String,String>(); protected static String[] languageList; protected static Map<String,String> countries = new HashMap<String,String>(); protected static String[] countryList; protected JComboBox langBox; protected JComboBox countryBox; public LocaleConfigurer(String key, String name) { this(key, name, ""); } public LocaleConfigurer(String key, String name, Locale locale) { super(key, name); setValue(locale); } public LocaleConfigurer(String key, String name, String val) { super(key, name, val); setValue(val); } public String getValueString() { return (String) value; } public Locale getValueLocale() { return stringToLocale((String) value); } public void setValue(Locale l) { setValue(localeToString(l)); } public void setValue(String s) { getControls(); if (!noUpdate && langBox != null && countryBox != null) { SequenceEncoder.Decoder sd = new SequenceEncoder.Decoder(s, ','); setLanguage(sd.nextToken(Locale.getDefault().getLanguage())); setCountry(sd.nextToken("")); } setValue((Object) s); } protected void setLanguage(String l) { String lang = (new Locale(l, "")).getDisplayLanguage(Locale.getDefault()); langBox.setSelectedItem(lang); } protected void setCountry(String c) { String country; if (c.length() == 0) { country = ANY_COUNTRY; } else { country = (new Locale(Locale.getDefault().getLanguage(), c)).getDisplayCountry(Locale.getDefault()); } countryBox.setSelectedItem(country); } public java.awt.Component getControls() { if (panel == null) { panel = Box.createHorizontalBox(); langBox = new JComboBox(getLanguageList()); langBox.setSelectedItem(Locale.getDefault().getDisplayLanguage()); langBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateValue(); }}); panel.add(new JLabel("Language: ")); panel.add(langBox); countryBox = new JComboBox(getCountryList()); countryBox.setSelectedItem(ANY_COUNTRY); countryBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateValue(); }}); panel.add(new JLabel(" Country: ")); panel.add(countryBox); } return panel; } protected void updateValue() { String language = languages.get(langBox.getSelectedItem()); String country = countries.get(countryBox.getSelectedItem()); setValue(language + "," + country); } protected String[] getLanguageList() { if (languageList == null) { String[] langs = Locale.getISOLanguages(); ArrayList<String> sortedLangs = new ArrayList<String>(); for (int i = 0; i < langs.length; i++) { String lang = (new Locale(langs[i])).getDisplayLanguage(Locale.getDefault()); languages.put(lang, langs[i]); sortedLangs.add(lang); } Collections.sort(sortedLangs, Collator.getInstance(Locale.getDefault())); languageList = sortedLangs.toArray(new String[sortedLangs.size()]); } return languageList; } protected String[] getCountryList() { if (countryList == null) { String[] c = Locale.getISOCountries(); ArrayList<String> sortedCountries = new ArrayList<String>(); for (int i = 0; i < c.length; i++) { String country = (new Locale("en", c[i])).getDisplayCountry(Locale.getDefault()); countries.put(country, c[i]); sortedCountries.add(country); } Collections.sort(sortedCountries, Collator.getInstance(Locale.getDefault())); countries.put(ANY_COUNTRY, ""); sortedCountries.add(0, ANY_COUNTRY); countryList = sortedCountries.toArray(new String[sortedCountries.size()]); } return countryList; } public static Locale stringToLocale(String s) { SequenceEncoder.Decoder sd = new SequenceEncoder.Decoder(s, ','); return new Locale(sd.nextToken(""), sd.nextToken("")); } public static String localeToString(Locale l) { return l.getLanguage() + "," + l.getCountry(); } }