source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java@ 10212

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

sonar - squid:S2221 - "Exception" should not be caught when not required by called methods

  • Property svn:eol-style set to native
File size: 10.5 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.text.DateFormat;
9import java.util.Date;
10
11import javax.swing.BorderFactory;
12import javax.swing.Box;
13import javax.swing.DefaultListCellRenderer;
14import javax.swing.JCheckBox;
15import javax.swing.JFormattedTextField;
16import javax.swing.JLabel;
17import javax.swing.JList;
18import javax.swing.JScrollPane;
19import javax.swing.JSpinner;
20import javax.swing.ListCellRenderer;
21import javax.swing.LookAndFeel;
22import javax.swing.SpinnerNumberModel;
23import javax.swing.UIManager;
24import javax.swing.UIManager.LookAndFeelInfo;
25
26import org.openstreetmap.josm.Main;
27import org.openstreetmap.josm.actions.ExpertToggleAction;
28import org.openstreetmap.josm.gui.MapMover;
29import org.openstreetmap.josm.gui.NavigatableComponent;
30import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
31import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
32import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
33import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
34import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
35import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
36import org.openstreetmap.josm.gui.widgets.FileChooserManager;
37import org.openstreetmap.josm.gui.widgets.JosmComboBox;
38import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
39import org.openstreetmap.josm.tools.GBC;
40import org.openstreetmap.josm.tools.date.DateUtils;
41
42/**
43 * Look-and-feel preferences.
44 */
45public class LafPreference implements SubPreferenceSetting {
46
47 /**
48 * Factory used to create a new {@code LafPreference}.
49 */
50 public static class Factory implements PreferenceSettingFactory {
51 @Override
52 public PreferenceSetting createPreferenceSetting() {
53 return new LafPreference();
54 }
55 }
56
57 /**
58 * ComboBox with all look and feels.
59 */
60 private JosmComboBox<LookAndFeelInfo> lafCombo;
61 VerticallyScrollablePanel panel;
62 private final JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
63 private final JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists"));
64 private final JCheckBox showLocalizedName = new JCheckBox(tr("Show localized name in selection lists"));
65 private final JCheckBox modeless = new JCheckBox(tr("Modeless working (Potlatch style)"));
66 private final JCheckBox dynamicButtons = new JCheckBox(tr("Dynamic buttons in side menus"));
67 private final JCheckBox isoDates = new JCheckBox(tr("Display ISO dates"));
68 private final JCheckBox nativeFileChoosers = new JCheckBox(tr("Use native file choosers (nicer, but do not support file filters)"));
69 private final JCheckBox zoomReverseWheel = new JCheckBox(tr("Reverse zoom with mouse wheel"));
70 private final JCheckBox zoomIntermediateSteps = new JCheckBox(tr("Intermediate steps between native resolutions"));
71 private JSpinner spinZoomRatio;
72
73 @Override
74 public void addGui(PreferenceTabbedPane gui) {
75 lafCombo = new JosmComboBox<>(UIManager.getInstalledLookAndFeels());
76
77 // let's try to load additional LookAndFeels and put them into the list
78 if (Main.isPlatformOsx()) {
79 try {
80 Class<?> cquaqua = Class.forName("ch.randelshofer.quaqua.QuaquaLookAndFeel");
81 Object oquaqua = cquaqua.getConstructor((Class[]) null).newInstance((Object[]) null);
82 // no exception? Then Go!
83 lafCombo.addItem(
84 new UIManager.LookAndFeelInfo(((LookAndFeel) oquaqua).getName(), "ch.randelshofer.quaqua.QuaquaLookAndFeel")
85 );
86 } catch (ReflectiveOperationException ex) {
87 // just debug, Quaqua may not even be installed...
88 Main.debug(ex.getMessage());
89 }
90 }
91
92 String laf = Main.pref.get("laf", Main.platform.getDefaultStyle());
93 for (int i = 0; i < lafCombo.getItemCount(); ++i) {
94 if (lafCombo.getItemAt(i).getClassName().equals(laf)) {
95 lafCombo.setSelectedIndex(i);
96 break;
97 }
98 }
99
100 lafCombo.setRenderer(new ListCellRenderer<LookAndFeelInfo>() {
101 private final DefaultListCellRenderer def = new DefaultListCellRenderer();
102 @Override
103 public Component getListCellRendererComponent(JList<? extends LookAndFeelInfo> list, LookAndFeelInfo value,
104 int index, boolean isSelected, boolean cellHasFocus) {
105 return def.getListCellRendererComponent(list, value.getName(), index, isSelected, cellHasFocus);
106 }
107 });
108
109 panel = new VerticallyScrollablePanel(new GridBagLayout());
110 panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
111
112 // Show splash screen on startup
113 showSplashScreen.setToolTipText(tr("Show splash screen at startup"));
114 showSplashScreen.setSelected(Main.pref.getBoolean("draw.splashscreen", true));
115 panel.add(showSplashScreen, GBC.eop().insets(20, 0, 0, 0));
116
117 // Show ID in selection
118 showID.setToolTipText(tr("Show object ID in selection lists"));
119 showID.setSelected(Main.pref.getBoolean("osm-primitives.showid", false));
120
121 // Show localized names
122 showLocalizedName.setToolTipText(tr("Show localized name in selection lists, if available"));
123 showLocalizedName.setSelected(Main.pref.getBoolean("osm-primitives.localize-name", true));
124 ExpertToggleAction.addVisibilitySwitcher(showLocalizedName);
125
126 modeless.setToolTipText(tr("Do not require to switch modes (potlatch style workflow)"));
127 modeless.setSelected(Main.pref.getBoolean("modeless", false));
128 ExpertToggleAction.addVisibilitySwitcher(modeless);
129
130 panel.add(showID, GBC.eop().insets(20, 0, 0, 0));
131 panel.add(showLocalizedName, GBC.eop().insets(20, 0, 0, 0));
132 panel.add(modeless, GBC.eop().insets(20, 0, 0, 0));
133
134 dynamicButtons.setToolTipText(tr("Display buttons in right side menus only when mouse is inside the element"));
135 dynamicButtons.setSelected(ToggleDialog.PROP_DYNAMIC_BUTTONS.get());
136 panel.add(dynamicButtons, GBC.eop().insets(20, 0, 0, 0));
137
138 Date today = new Date();
139 isoDates.setToolTipText(tr("Format dates according to {0}. Today''s date will be displayed as {1} instead of {2}",
140 tr("ISO 8601"),
141 DateUtils.newIsoDateFormat().format(today),
142 DateFormat.getDateInstance(DateFormat.SHORT).format(today)));
143 isoDates.setSelected(DateUtils.PROP_ISO_DATES.get());
144 panel.add(isoDates, GBC.eop().insets(20, 0, 0, 0));
145
146 nativeFileChoosers.setToolTipText(
147 tr("Use file choosers that behave more like native ones. They look nicer but do not support some features like file filters"));
148 nativeFileChoosers.setSelected(FileChooserManager.PROP_USE_NATIVE_FILE_DIALOG.get());
149 panel.add(nativeFileChoosers, GBC.eop().insets(20, 0, 0, 0));
150
151 zoomReverseWheel.setToolTipText(
152 tr("Check if you feel opposite direction more convenient"));
153 zoomReverseWheel.setSelected(MapMover.PROP_ZOOM_REVERSE_WHEEL.get());
154 panel.add(zoomReverseWheel, GBC.eop().insets(20, 0, 0, 0));
155
156 zoomIntermediateSteps.setToolTipText(
157 tr("Divide intervals between native resolution levels to smaller steps if they are much larger than zoom ratio"));
158 zoomIntermediateSteps.setSelected(NavigatableComponent.PROP_ZOOM_INTERMEDIATE_STEPS.get());
159 ExpertToggleAction.addVisibilitySwitcher(zoomIntermediateSteps);
160 panel.add(zoomIntermediateSteps, GBC.eop().insets(20, 0, 0, 0));
161
162 panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 10, 0, 0));
163
164 double logZoomLevel = Math.log(2) / Math.log(NavigatableComponent.PROP_ZOOM_RATIO.get());
165 logZoomLevel = Math.max(1, logZoomLevel);
166 logZoomLevel = Math.min(5, logZoomLevel);
167 JLabel labelZoomRatio = new JLabel(tr("Zoom steps to get double scale"));
168 spinZoomRatio = new JSpinner(new SpinnerNumberModel(logZoomLevel, 1, 5, 1));
169 Component spinZoomRatioEditor = spinZoomRatio.getEditor();
170 JFormattedTextField jftf = ((JSpinner.DefaultEditor) spinZoomRatioEditor).getTextField();
171 jftf.setColumns(2);
172 String zoomRatioToolTipText = tr("Higher value means more steps needed, therefore zoom steps will be smaller");
173 spinZoomRatio.setToolTipText(zoomRatioToolTipText);
174 labelZoomRatio.setToolTipText(zoomRatioToolTipText);
175 labelZoomRatio.setLabelFor(spinZoomRatio);
176 panel.add(labelZoomRatio, GBC.std().insets(20, 0, 0, 0));
177 panel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
178 panel.add(spinZoomRatio, GBC.eol());
179
180 panel.add(new JLabel(tr("Look and Feel")), GBC.std().insets(20, 0, 0, 0));
181 panel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
182 panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
183
184 JScrollPane scrollpane = panel.getVerticalScrollPane();
185 scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
186 gui.getDisplayPreference().addSubTab(this, tr("Look and Feel"), scrollpane);
187 }
188
189 @Override
190 public boolean ok() {
191 boolean mod = false;
192 Main.pref.put("draw.splashscreen", showSplashScreen.isSelected());
193 Main.pref.put("osm-primitives.showid", showID.isSelected());
194 Main.pref.put("osm-primitives.localize-name", showLocalizedName.isSelected());
195 Main.pref.put("modeless", modeless.isSelected());
196 Main.pref.put(ToggleDialog.PROP_DYNAMIC_BUTTONS.getKey(), dynamicButtons.isSelected());
197 Main.pref.put(DateUtils.PROP_ISO_DATES.getKey(), isoDates.isSelected());
198 Main.pref.put(FileChooserManager.PROP_USE_NATIVE_FILE_DIALOG.getKey(), nativeFileChoosers.isSelected());
199 MapMover.PROP_ZOOM_REVERSE_WHEEL.put(zoomReverseWheel.isSelected());
200 NavigatableComponent.PROP_ZOOM_INTERMEDIATE_STEPS.put(zoomIntermediateSteps.isSelected());
201 NavigatableComponent.PROP_ZOOM_RATIO.put(Math.pow(2, 1/(double) spinZoomRatio.getModel().getValue()));
202 mod |= Main.pref.put("laf", ((LookAndFeelInfo) lafCombo.getSelectedItem()).getClassName());
203 return mod;
204 }
205
206 @Override
207 public boolean isExpert() {
208 return false;
209 }
210
211 @Override
212 public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
213 return gui.getDisplayPreference();
214 }
215}
Note: See TracBrowser for help on using the repository browser.