001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.preferences.display;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Component;
007 import java.util.ArrayList;
008 import java.util.Arrays;
009 import java.util.List;
010 import java.util.Locale;
011
012 import javax.swing.Box;
013 import javax.swing.DefaultComboBoxModel;
014 import javax.swing.DefaultListCellRenderer;
015 import javax.swing.JLabel;
016 import javax.swing.JList;
017 import javax.swing.JPanel;
018 import javax.swing.ListCellRenderer;
019
020 import org.openstreetmap.josm.Main;
021 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
022 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
023 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
024 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
025 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
026 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
027 import org.openstreetmap.josm.tools.GBC;
028 import org.openstreetmap.josm.tools.I18n;
029
030 public class LanguagePreference implements SubPreferenceSetting {
031 public static class Factory implements PreferenceSettingFactory {
032 public PreferenceSetting createPreferenceSetting() {
033 return new LanguagePreference();
034 }
035 }
036
037 /** the combo box with the available locales */
038 private JosmComboBox langCombo;
039 /** the model for the combo box */
040 private LanguageComboBoxModel model;
041
042 public void addGui(final PreferenceTabbedPane gui) {
043 model = new LanguageComboBoxModel();
044 // Selecting the language BEFORE the JComboBox listens to model changes speed up initialization by ~35ms (see #7386)
045 // See http://stackoverflow.com/questions/3194958/fast-replacement-for-jcombobox-basiccomboboxui
046 model.selectLanguage(Main.pref.get("language"));
047 langCombo = new JosmComboBox(model);
048 langCombo.setRenderer(new LanguageCellRenderer(langCombo.getRenderer()));
049
050 LafPreference lafPreference = gui.getSetting(LafPreference.class);
051 final JPanel panel = lafPreference.panel;
052 panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
053 panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
054 panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
055 panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
056 }
057
058 public boolean ok() {
059 if(langCombo.getSelectedItem() == null)
060 return Main.pref.put("language", null);
061 else
062 return Main.pref.put("language",
063 ((Locale)langCombo.getSelectedItem()).toString());
064 }
065
066 private static class LanguageComboBoxModel extends DefaultComboBoxModel {
067 private final List<Locale> data = new ArrayList<Locale>();
068
069 public LanguageComboBoxModel(){
070 data.add(0,null);
071 data.addAll(Arrays.asList(I18n.getAvailableTranslations()));
072 }
073
074 public void selectLanguage(String language) {
075 setSelectedItem(null);
076 if (language != null) {
077 for (Locale locale: data) {
078 if (locale == null) {
079 continue;
080 }
081 if (locale.toString().equals(language)) {
082 setSelectedItem(locale);
083 return;
084 }
085 }
086 }
087 }
088
089 @Override
090 public Object getElementAt(int index) {
091 return data.get(index);
092 }
093
094 @Override
095 public int getSize() {
096 return data.size();
097 }
098 }
099
100 static private class LanguageCellRenderer extends DefaultListCellRenderer {
101 private ListCellRenderer dispatch;
102 public LanguageCellRenderer(ListCellRenderer dispatch) {
103 this.dispatch = dispatch;
104 }
105 @Override
106 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
107 boolean cellHasFocus) {
108 Locale l = (Locale) value;
109 return dispatch.getListCellRendererComponent(list,
110 l == null ? tr("Default (Auto determined)") : l.getDisplayName(l),
111 index, isSelected, cellHasFocus);
112 }
113 }
114
115 @Override
116 public boolean isExpert() {
117 return false;
118 }
119
120 @Override
121 public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
122 return gui.getDisplayPreference();
123 }
124 }