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

Last change on this file was 18221, checked in by Don-vip, 5 years ago

fix #21319 - Refactoring of class hierarchy around JosmComboBox / AutoCompComboBox (patch by marcello):

  • Code reuse: JosmComboBox now uses a JosmTextField as editor
  • Code reuse: AutoCompComboBox now uses AutoCompTextField as editor
  • JosmComboBox uses more of the original L&F
  • JosmComboBox lists now expand all the way to the bottom or the top of the screen
  • Variable height items in combobox lists now work, see #19321
  • Autocomplete uses different algorithm, fix #21290
  • editable="false" comboboxes in Presets now work, fix #6157 see #11024 see #18714
  • The user may toggle LTR-RTL script in JosmTextField (menu and ctrl+space)
  • LTR-RTL automatically toggles according to key in AddTag and EditTag dialogs, fix #16163
  • Property svn:eol-style set to native
File size: 5.0 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.awt.GridBagLayout;
8import java.util.ArrayList;
9import java.util.Comparator;
10import java.util.List;
11import java.util.Locale;
12
13import javax.swing.Box;
14import javax.swing.DefaultListCellRenderer;
15import javax.swing.JLabel;
16import javax.swing.JList;
17import javax.swing.JPanel;
18import javax.swing.ListCellRenderer;
19
20import org.openstreetmap.josm.gui.help.HelpUtil;
21import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
22import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
23import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
24import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
25import org.openstreetmap.josm.gui.widgets.JosmComboBox;
26import org.openstreetmap.josm.gui.widgets.JosmComboBoxModel;
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 extends DefaultTabPreferenceSetting {
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 LanguagePreference() {
51 super(/* ICON(preferences/) */ "language", tr("Language"), tr("Change the language of JOSM."));
52 }
53
54 /** the combo box with the available locales */
55 private JosmComboBox<Locale> langCombo;
56
57 @Override
58 public void addGui(final PreferenceTabbedPane gui) {
59 LanguageComboBoxModel model = new LanguageComboBoxModel();
60 // Selecting the language BEFORE the JComboBox listens to model changes speed up initialization by ~35ms (see #7386)
61 // See https://stackoverflow.com/questions/3194958/fast-replacement-for-jcombobox-basiccomboboxui
62 model.selectLanguage(Config.getPref().get(LANGUAGE));
63 langCombo = new JosmComboBox<>(model);
64 langCombo.setRenderer(new LanguageCellRenderer());
65
66 final JPanel panel = new JPanel(new GridBagLayout());
67 panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
68 panel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
69 panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
70 panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
71
72 createPreferenceTabWithScrollPane(gui, panel);
73 }
74
75 @Override
76 public boolean ok() {
77 if (langCombo.getSelectedItem() == null)
78 return Config.getPref().put(LANGUAGE, null);
79 else
80 return Config.getPref().put(LANGUAGE,
81 LanguageInfo.getJOSMLocaleCode((Locale) langCombo.getSelectedItem()));
82 }
83
84 private static class LanguageComboBoxModel extends JosmComboBoxModel<Locale> {
85 private final List<Locale> data = new ArrayList<>();
86
87 LanguageComboBoxModel() {
88 data.add(0, null);
89 I18n.getAvailableTranslations()
90 .sorted(Comparator.comparing(Locale::getDisplayLanguage))
91 .forEachOrdered(data::add);
92 }
93
94 private void selectLanguage(String language) {
95 setSelectedItem(null);
96 if (language != null) {
97 String lang = LanguageInfo.getJavaLocaleCode(language);
98 data.stream()
99 .filter(locale -> locale != null && locale.toString().equals(lang))
100 .findFirst()
101 .ifPresent(this::setSelectedItem);
102 }
103 }
104
105 @Override
106 public Locale getElementAt(int index) {
107 return data.get(index);
108 }
109
110 @Override
111 public int getSize() {
112 return data.size();
113 }
114 }
115
116 private static class LanguageCellRenderer implements ListCellRenderer<Locale> {
117 private final DefaultListCellRenderer dispatch;
118
119 /**
120 * Constructs a new {@code LanguageCellRenderer}.
121 */
122 LanguageCellRenderer() {
123 this.dispatch = new DefaultListCellRenderer();
124 }
125
126 @Override
127 public Component getListCellRendererComponent(JList<? extends Locale> list, Locale l,
128 int index, boolean isSelected, boolean cellHasFocus) {
129 return dispatch.getListCellRendererComponent(list,
130 l == null
131 ? tr("Default (Auto determined)")
132 : LanguageInfo.getDisplayName(l),
133 index, isSelected, cellHasFocus);
134 }
135 }
136
137 @Override
138 public boolean isExpert() {
139 return false;
140 }
141
142 @Override
143 public String getHelpContext() {
144 return HelpUtil.ht("/Preferences/LanguagePreference");
145 }
146}
Note: See TracBrowser for help on using the repository browser.