source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java@ 16438

Last change on this file since 16438 was 16438, checked in by simon04, 5 years ago

see #19251 - Java 8: use Stream

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.display;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.util.ArrayList;
8import java.util.Arrays;
9import java.util.Comparator;
10import java.util.List;
11import java.util.Locale;
12
13import javax.swing.Box;
14import javax.swing.DefaultComboBoxModel;
15import javax.swing.DefaultListCellRenderer;
16import javax.swing.JLabel;
17import javax.swing.JList;
18import javax.swing.JPanel;
19import javax.swing.ListCellRenderer;
20
21import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
22import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
23import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
24import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
25import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
26import org.openstreetmap.josm.gui.widgets.JosmComboBox;
27import org.openstreetmap.josm.spi.preferences.Config;
28import org.openstreetmap.josm.tools.GBC;
29import org.openstreetmap.josm.tools.I18n;
30import org.openstreetmap.josm.tools.LanguageInfo;
31
32/**
33 * Language preferences.
34 * @since 1065
35 */
36public class LanguagePreference implements SubPreferenceSetting {
37
38 private static final String LANGUAGE = "language";
39
40 /**
41 * Factory used to create a new {@code LanguagePreference}.
42 */
43 public static class Factory implements PreferenceSettingFactory {
44 @Override
45 public PreferenceSetting createPreferenceSetting() {
46 return new LanguagePreference();
47 }
48 }
49
50 /** the combo box with the available locales */
51 private JosmComboBox<Locale> langCombo;
52
53 @Override
54 public void addGui(final PreferenceTabbedPane gui) {
55 LanguageComboBoxModel model = new LanguageComboBoxModel();
56 // Selecting the language BEFORE the JComboBox listens to model changes speed up initialization by ~35ms (see #7386)
57 // See https://stackoverflow.com/questions/3194958/fast-replacement-for-jcombobox-basiccomboboxui
58 model.selectLanguage(Config.getPref().get(LANGUAGE));
59 langCombo = new JosmComboBox<>(model);
60 langCombo.setRenderer(new LanguageCellRenderer());
61
62 LafPreference lafPreference = gui.getSetting(LafPreference.class);
63 final JPanel panel = lafPreference.panel;
64 panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
65 panel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
66 panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
67 panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
68
69 TabPreferenceSetting tabPref = lafPreference.getTabPreferenceSetting(gui);
70 tabPref.registerSubTab(this, tabPref.getSubTab(lafPreference));
71 }
72
73 @Override
74 public boolean ok() {
75 if (langCombo.getSelectedItem() == null)
76 return Config.getPref().put(LANGUAGE, null);
77 else
78 return Config.getPref().put(LANGUAGE,
79 LanguageInfo.getJOSMLocaleCode((Locale) langCombo.getSelectedItem()));
80 }
81
82 private static class LanguageComboBoxModel extends DefaultComboBoxModel<Locale> {
83 private final List<Locale> data = new ArrayList<>();
84
85 LanguageComboBoxModel() {
86 data.add(0, null);
87 List<Locale> locales = Arrays.asList(I18n.getAvailableTranslations());
88 locales.sort(Comparator.comparing(Locale::getDisplayLanguage));
89 data.addAll(locales);
90 }
91
92 private void selectLanguage(String language) {
93 setSelectedItem(null);
94 if (language != null) {
95 String lang = LanguageInfo.getJavaLocaleCode(language);
96 data.stream()
97 .filter(locale -> locale != null && locale.toString().equals(lang))
98 .findFirst()
99 .ifPresent(this::setSelectedItem);
100 }
101 }
102
103 @Override
104 public Locale getElementAt(int index) {
105 return data.get(index);
106 }
107
108 @Override
109 public int getSize() {
110 return data.size();
111 }
112 }
113
114 private static class LanguageCellRenderer implements ListCellRenderer<Locale> {
115 private final DefaultListCellRenderer dispatch;
116
117 /**
118 * Constructs a new {@code LanguageCellRenderer}.
119 */
120 LanguageCellRenderer() {
121 this.dispatch = new DefaultListCellRenderer();
122 }
123
124 @Override
125 public Component getListCellRendererComponent(JList<? extends Locale> list, Locale l,
126 int index, boolean isSelected, boolean cellHasFocus) {
127 return dispatch.getListCellRendererComponent(list,
128 l == null
129 ? tr("Default (Auto determined)")
130 : LanguageInfo.getDisplayName(l),
131 index, isSelected, cellHasFocus);
132 }
133 }
134
135 @Override
136 public boolean isExpert() {
137 return false;
138 }
139
140 @Override
141 public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
142 return gui.getSetting(LafPreference.class).getTabPreferenceSetting(gui);
143 }
144}
Note: See TracBrowser for help on using the repository browser.