source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java@ 11553

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

refactor handling of null values - use Java 8 Optional where possible

  • Property svn:eol-style set to native
File size: 8.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.plugin;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.FlowLayout;
7import java.awt.GridBagConstraints;
8import java.awt.GridBagLayout;
9import java.awt.Insets;
10import java.util.EnumMap;
11import java.util.Locale;
12import java.util.Map;
13import java.util.Optional;
14
15import javax.swing.ButtonGroup;
16import javax.swing.JLabel;
17import javax.swing.JPanel;
18import javax.swing.JRadioButton;
19import javax.swing.event.ChangeEvent;
20import javax.swing.event.ChangeListener;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
24import org.openstreetmap.josm.gui.widgets.JosmTextField;
25import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
26import org.openstreetmap.josm.plugins.PluginHandler;
27
28/**
29 * A panel for configuring whether JOSM shall update plugins at startup.
30 *
31 */
32public class PluginUpdatePolicyPanel extends JPanel {
33
34 private enum Policy {
35 ASK("ask"),
36 ALWAYS("always"),
37 NEVER("never");
38
39 private final String preferenceValue;
40
41 Policy(String preferenceValue) {
42 this.preferenceValue = preferenceValue;
43 }
44
45 public String getPreferencesValue() {
46 return preferenceValue;
47 }
48
49 static Policy fromPreferenceValue(String preferenceValue) {
50 if (preferenceValue == null)
51 return null;
52 String prefValue = preferenceValue.trim().toLowerCase(Locale.ENGLISH);
53 for (Policy p: Policy.values()) {
54 if (p.getPreferencesValue().equals(prefValue))
55 return p;
56 }
57 return null;
58 }
59 }
60
61 private transient Map<Policy, JRadioButton> rbVersionBasedUpatePolicy;
62 private transient Map<Policy, JRadioButton> rbTimeBasedUpatePolicy;
63 private final JosmTextField tfUpdateInterval = new JosmTextField(5);
64 private final JLabel lblUpdateInterval = new JLabel(tr("Update interval (in days):"));
65
66 /**
67 * Constructs a new {@code PluginUpdatePolicyPanel}.
68 */
69 public PluginUpdatePolicyPanel() {
70 build();
71 initFromPreferences();
72 }
73
74 protected JPanel buildVersionBasedUpdatePolicyPanel() {
75 JPanel pnl = new JPanel(new GridBagLayout());
76 GridBagConstraints gc = new GridBagConstraints();
77 gc.anchor = GridBagConstraints.NORTHWEST;
78 gc.fill = GridBagConstraints.HORIZONTAL;
79 gc.weightx = 1.0;
80
81 ButtonGroup bgVersionBasedUpdatePolicy = new ButtonGroup();
82 rbVersionBasedUpatePolicy = new EnumMap<>(Policy.class);
83 JRadioButton btn = new JRadioButton(tr("Ask before updating"));
84 rbVersionBasedUpatePolicy.put(Policy.ASK, btn);
85 bgVersionBasedUpdatePolicy.add(btn);
86
87 btn = new JRadioButton(tr("Always update without asking"));
88 rbVersionBasedUpatePolicy.put(Policy.ALWAYS, btn);
89 bgVersionBasedUpdatePolicy.add(btn);
90
91 btn = new JRadioButton(tr("Never update"));
92 rbVersionBasedUpatePolicy.put(Policy.NEVER, btn);
93 bgVersionBasedUpdatePolicy.add(btn);
94
95 JMultilineLabel lbl = new JMultilineLabel(
96 tr("Please decide whether JOSM shall automatically update active plugins at startup after an update of JOSM itself."));
97 gc.gridy = 0;
98 pnl.add(lbl, gc);
99 for (Policy p: Policy.values()) {
100 gc.gridy++;
101 pnl.add(rbVersionBasedUpatePolicy.get(p), gc);
102 }
103 return pnl;
104 }
105
106 protected JPanel buildUpdateIntervalPanel() {
107 JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
108 pnl.add(lblUpdateInterval);
109 pnl.add(tfUpdateInterval);
110 lblUpdateInterval.setLabelFor(tfUpdateInterval);
111 SelectAllOnFocusGainedDecorator.decorate(tfUpdateInterval);
112 return pnl;
113 }
114
115 protected JPanel buildTimeBasedUpdatePolicyPanel() {
116 JPanel pnl = new JPanel(new GridBagLayout());
117 GridBagConstraints gc = new GridBagConstraints();
118 gc.anchor = GridBagConstraints.NORTHWEST;
119 gc.fill = GridBagConstraints.HORIZONTAL;
120 gc.weightx = 1.0;
121
122 TimeBasedPolicyChangeListener changeListener = new TimeBasedPolicyChangeListener();
123
124 ButtonGroup bgTimeBasedUpdatePolicy = new ButtonGroup();
125 rbTimeBasedUpatePolicy = new EnumMap<>(Policy.class);
126 JRadioButton btn = new JRadioButton(tr("Ask before updating"));
127 btn.addChangeListener(changeListener);
128 rbTimeBasedUpatePolicy.put(Policy.ASK, btn);
129 bgTimeBasedUpdatePolicy.add(btn);
130
131 btn = new JRadioButton(tr("Always update without asking"));
132 btn.addChangeListener(changeListener);
133 rbTimeBasedUpatePolicy.put(Policy.ALWAYS, btn);
134 bgTimeBasedUpdatePolicy.add(btn);
135
136 btn = new JRadioButton(tr("Never update"));
137 btn.addChangeListener(changeListener);
138 rbTimeBasedUpatePolicy.put(Policy.NEVER, btn);
139 bgTimeBasedUpdatePolicy.add(btn);
140
141 JMultilineLabel lbl = new JMultilineLabel(
142 tr("Please decide whether JOSM shall automatically update active plugins after a certain period of time."));
143 gc.gridy = 0;
144 pnl.add(lbl, gc);
145 for (Policy p: Policy.values()) {
146 gc.gridy++;
147 pnl.add(rbTimeBasedUpatePolicy.get(p), gc);
148 }
149 gc.gridy++;
150 pnl.add(buildUpdateIntervalPanel(), gc);
151 return pnl;
152 }
153
154 protected final void build() {
155 setLayout(new GridBagLayout());
156 GridBagConstraints gc = new GridBagConstraints();
157 gc.anchor = GridBagConstraints.NORTHWEST;
158 gc.fill = GridBagConstraints.HORIZONTAL;
159 gc.weightx = 1.0;
160 gc.insets = new Insets(5, 5, 10, 5);
161
162 add(buildVersionBasedUpdatePolicyPanel(), gc);
163 gc.gridy = 1;
164 add(buildTimeBasedUpdatePolicyPanel(), gc);
165
166 gc.gridy = 2;
167 gc.weighty = 1.0;
168 gc.fill = GridBagConstraints.BOTH;
169 add(new JPanel(), gc);
170 }
171
172 /**
173 * Loads the relevant preference values from the JOSM preferences
174 */
175 public final void initFromPreferences() {
176 rbVersionBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(
177 Main.pref.get("pluginmanager.version-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
178 rbTimeBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(
179 Main.pref.get("pluginmanager.time-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
180
181 String pref = Main.pref.get("pluginmanager.warntime", null);
182 int days = 0;
183 if (pref != null) {
184 // remove legacy preference
185 Main.pref.put("pluginmanager.warntime", null);
186 try {
187 days = Integer.parseInt(pref.trim());
188 } catch (NumberFormatException e) {
189 // ignore - load from preference pluginmanager.time-based-update.interval
190 Main.trace(e);
191 }
192 if (days <= 0) {
193 days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
194 }
195 }
196 if (days == 0) {
197 days = Main.pref.getInteger("pluginmanager.time-based-update.interval", PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL);
198 }
199 tfUpdateInterval.setText(Integer.toString(days));
200 }
201
202 /**
203 * Remebers the update policy preference settings on the JOSM preferences
204 */
205 public void rememberInPreferences() {
206
207 // remember policy for version based update
208 //
209 for (Policy p: Policy.values()) {
210 if (rbVersionBasedUpatePolicy.get(p).isSelected()) {
211 Main.pref.put("pluginmanager.version-based-update.policy", p.getPreferencesValue());
212 break;
213 }
214 }
215
216 // remember policy for time based update
217 //
218 for (Policy p: Policy.values()) {
219 if (rbTimeBasedUpatePolicy.get(p).isSelected()) {
220 Main.pref.put("pluginmanager.time-based-update.policy", p.getPreferencesValue());
221 break;
222 }
223 }
224
225 // remember update interval
226 //
227 int days = 0;
228 try {
229 days = Integer.parseInt(tfUpdateInterval.getText().trim());
230 if (days <= 0) {
231 days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
232 }
233 } catch (NumberFormatException e) {
234 days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
235 }
236 Main.pref.putInteger("pluginmanager.time-based-update.interval", days);
237 }
238
239 class TimeBasedPolicyChangeListener implements ChangeListener {
240 @Override
241 public void stateChanged(ChangeEvent e) {
242 lblUpdateInterval.setEnabled(!rbTimeBasedUpatePolicy.get(Policy.NEVER).isSelected());
243 tfUpdateInterval.setEnabled(!rbTimeBasedUpatePolicy.get(Policy.NEVER).isSelected());
244 }
245 }
246
247}
Note: See TracBrowser for help on using the repository browser.