// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.preferences; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.I18n; public class LanguagePreference implements PreferenceSetting { public static class Factory implements PreferenceSettingFactory { public PreferenceSetting createPreferenceSetting() { return new LanguagePreference(); } } /** the combo box with the available locales */ private JComboBox langCombo; /** the model for the combo box */ private LanguageComboBoxModel model; public void addGui(final PreferenceTabbedPane gui) { model = new LanguageComboBoxModel(); langCombo = new JComboBox(model); langCombo.setRenderer(new LanguageCellRenderer(langCombo.getRenderer())); model.selectLanguage(Main.pref.get("language")); LafPreference lafPreference = gui.getSetting(LafPreference.class); final JPanel panel = lafPreference.panel; panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0)); panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL)); panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL)); panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH)); } public boolean ok() { if(langCombo.getSelectedItem() == null) return Main.pref.put("language", null); else return Main.pref.put("language", ((Locale)langCombo.getSelectedItem()).toString()); } private static class LanguageComboBoxModel extends DefaultComboBoxModel { private final List<Locale> data = new ArrayList<Locale>(); public LanguageComboBoxModel(){ data.add(0,null); data.addAll(Arrays.asList(I18n.getAvailableTranslations())); } public void selectLanguage(String language) { setSelectedItem(null); if (language != null) { for (Locale locale: data) { if (locale == null) { continue; } if (locale.toString().equals(language)) { setSelectedItem(locale); return; } } } } @Override public Object getElementAt(int index) { return data.get(index); } @Override public int getSize() { return data.size(); } } static private class LanguageCellRenderer extends DefaultListCellRenderer { private ListCellRenderer dispatch; public LanguageCellRenderer(ListCellRenderer dispatch) { this.dispatch = dispatch; } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Locale l = (Locale) value; return dispatch.getListCellRendererComponent(list, l == null ? tr("Default (Auto determined)") : l.getDisplayName(), index, isSelected, cellHasFocus); } } }