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

Last change on this file since 4931 was 4931, checked in by Don-vip, 12 years ago

see #7386 - Speed up languages JComboBox initialization (from ~40ms to 5ms only)

  • Property svn:eol-style set to native
File size: 3.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences;
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.List;
10import java.util.Locale;
11
12import javax.swing.Box;
13import javax.swing.DefaultComboBoxModel;
14import javax.swing.DefaultListCellRenderer;
15import javax.swing.JComboBox;
16import javax.swing.JLabel;
17import javax.swing.JList;
18import javax.swing.JPanel;
19import javax.swing.ListCellRenderer;
20
21import org.openstreetmap.josm.Main;
22import org.openstreetmap.josm.tools.GBC;
23import org.openstreetmap.josm.tools.I18n;
24
25public class LanguagePreference implements PreferenceSetting {
26 public static class Factory implements PreferenceSettingFactory {
27 public PreferenceSetting createPreferenceSetting() {
28 return new LanguagePreference();
29 }
30 }
31
32 /** the combo box with the available locales */
33 private JComboBox langCombo;
34 /** the model for the combo box */
35 private LanguageComboBoxModel model;
36
37 public void addGui(final PreferenceTabbedPane gui) {
38 model = new LanguageComboBoxModel();
39 // Selecting the language BEFORE the JComboBox listens to model changes speed up initialization by ~35ms (see #7386)
40 // See http://stackoverflow.com/questions/3194958/fast-replacement-for-jcombobox-basiccomboboxui
41 model.selectLanguage(Main.pref.get("language"));
42 langCombo = new JComboBox(model);
43 langCombo.setRenderer(new LanguageCellRenderer(langCombo.getRenderer()));
44
45 LafPreference lafPreference = gui.getSetting(LafPreference.class);
46 final JPanel panel = lafPreference.panel;
47 panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
48 panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
49 panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
50 panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
51 }
52
53 public boolean ok() {
54 if(langCombo.getSelectedItem() == null)
55 return Main.pref.put("language", null);
56 else
57 return Main.pref.put("language",
58 ((Locale)langCombo.getSelectedItem()).toString());
59 }
60
61 private static class LanguageComboBoxModel extends DefaultComboBoxModel {
62 private final List<Locale> data = new ArrayList<Locale>();
63
64 public LanguageComboBoxModel(){
65 data.add(0,null);
66 data.addAll(Arrays.asList(I18n.getAvailableTranslations()));
67 }
68
69 public void selectLanguage(String language) {
70 setSelectedItem(null);
71 if (language != null) {
72 for (Locale locale: data) {
73 if (locale == null) {
74 continue;
75 }
76 if (locale.toString().equals(language)) {
77 setSelectedItem(locale);
78 return;
79 }
80 }
81 }
82 }
83
84 @Override
85 public Object getElementAt(int index) {
86 return data.get(index);
87 }
88
89 @Override
90 public int getSize() {
91 return data.size();
92 }
93 }
94
95 static private class LanguageCellRenderer extends DefaultListCellRenderer {
96 private ListCellRenderer dispatch;
97 public LanguageCellRenderer(ListCellRenderer dispatch) {
98 this.dispatch = dispatch;
99 }
100 @Override
101 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
102 boolean cellHasFocus) {
103 Locale l = (Locale) value;
104 return dispatch.getListCellRendererComponent(list,
105 l == null ? tr("Default (Auto determined)") : l.getDisplayName(l),
106 index, isSelected, cellHasFocus);
107 }
108 }
109}
Note: See TracBrowser for help on using the repository browser.