// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences.plugin;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.EnumMap;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
import org.openstreetmap.josm.gui.widgets.JosmTextField;
import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
import org.openstreetmap.josm.plugins.PluginHandler;
/**
* A panel for configuring whether JOSM shall update plugins at startup.
*
*/
public class PluginUpdatePolicyPanel extends JPanel {
private enum Policy {
ASK("ask"),
ALWAYS("always"),
NEVER("never");
private final String preferenceValue;
Policy(String preferenceValue) {
this.preferenceValue = preferenceValue;
}
public String getPreferencesValue() {
return preferenceValue;
}
static Policy fromPreferenceValue(String preferenceValue) {
if (preferenceValue == null)
return null;
String prefValue = preferenceValue.trim().toLowerCase(Locale.ENGLISH);
for (Policy p: Policy.values()) {
if (p.getPreferencesValue().equals(prefValue))
return p;
}
return null;
}
}
private transient Map<Policy, JRadioButton> rbVersionBasedUpatePolicy;
private transient Map<Policy, JRadioButton> rbTimeBasedUpatePolicy;
private final JosmTextField tfUpdateInterval = new JosmTextField(5);
private final JLabel lblUpdateInterval = new JLabel(tr("Update interval (in days):"));
/**
* Constructs a new {@code PluginUpdatePolicyPanel}.
*/
public PluginUpdatePolicyPanel() {
build();
initFromPreferences();
}
protected JPanel buildVersionBasedUpdatePolicyPanel() {
JPanel pnl = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.anchor = GridBagConstraints.NORTHWEST;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 1.0;
ButtonGroup bgVersionBasedUpdatePolicy = new ButtonGroup();
rbVersionBasedUpatePolicy = new EnumMap<>(Policy.class);
JRadioButton btn = new JRadioButton(tr("Ask before updating"));
rbVersionBasedUpatePolicy.put(Policy.ASK, btn);
bgVersionBasedUpdatePolicy.add(btn);
btn = new JRadioButton(tr("Always update without asking"));
rbVersionBasedUpatePolicy.put(Policy.ALWAYS, btn);
bgVersionBasedUpdatePolicy.add(btn);
btn = new JRadioButton(tr("Never update"));
rbVersionBasedUpatePolicy.put(Policy.NEVER, btn);
bgVersionBasedUpdatePolicy.add(btn);
JMultilineLabel lbl = new JMultilineLabel(
tr("Please decide whether JOSM shall automatically update active plugins at startup after an update of JOSM itself."));
gc.gridy = 0;
pnl.add(lbl, gc);
for (Policy p: Policy.values()) {
gc.gridy++;
pnl.add(rbVersionBasedUpatePolicy.get(p), gc);
}
return pnl;
}
protected JPanel buildUpdateIntervalPanel() {
JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
pnl.add(lblUpdateInterval);
pnl.add(tfUpdateInterval);
lblUpdateInterval.setLabelFor(tfUpdateInterval);
SelectAllOnFocusGainedDecorator.decorate(tfUpdateInterval);
return pnl;
}
protected JPanel buildTimeBasedUpdatePolicyPanel() {
JPanel pnl = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.anchor = GridBagConstraints.NORTHWEST;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 1.0;
TimeBasedPolicyChangeListener changeListener = new TimeBasedPolicyChangeListener();
ButtonGroup bgTimeBasedUpdatePolicy = new ButtonGroup();
rbTimeBasedUpatePolicy = new EnumMap<>(Policy.class);
JRadioButton btn = new JRadioButton(tr("Ask before updating"));
btn.addChangeListener(changeListener);
rbTimeBasedUpatePolicy.put(Policy.ASK, btn);
bgTimeBasedUpdatePolicy.add(btn);
btn = new JRadioButton(tr("Always update without asking"));
btn.addChangeListener(changeListener);
rbTimeBasedUpatePolicy.put(Policy.ALWAYS, btn);
bgTimeBasedUpdatePolicy.add(btn);
btn = new JRadioButton(tr("Never update"));
btn.addChangeListener(changeListener);
rbTimeBasedUpatePolicy.put(Policy.NEVER, btn);
bgTimeBasedUpdatePolicy.add(btn);
JMultilineLabel lbl = new JMultilineLabel(
tr("Please decide whether JOSM shall automatically update active plugins after a certain period of time."));
gc.gridy = 0;
pnl.add(lbl, gc);
for (Policy p: Policy.values()) {
gc.gridy++;
pnl.add(rbTimeBasedUpatePolicy.get(p), gc);
}
gc.gridy++;
pnl.add(buildUpdateIntervalPanel(), gc);
return pnl;
}
protected final void build() {
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.anchor = GridBagConstraints.NORTHWEST;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 1.0;
gc.insets = new Insets(5, 5, 10, 5);
add(buildVersionBasedUpdatePolicyPanel(), gc);
gc.gridy = 1;
add(buildTimeBasedUpdatePolicyPanel(), gc);
gc.gridy = 2;
gc.weighty = 1.0;
gc.fill = GridBagConstraints.BOTH;
add(new JPanel(), gc);
}
/**
* Loads the relevant preference values from the JOSM preferences
*/
public final void initFromPreferences() {
rbVersionBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(
Main.pref.get("pluginmanager.version-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
rbTimeBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(
Main.pref.get("pluginmanager.time-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
String pref = Main.pref.get("pluginmanager.warntime", null);
int days = 0;
if (pref != null) {
// remove legacy preference
Main.pref.put("pluginmanager.warntime", null);
try {
days = Integer.parseInt(pref.trim());
} catch (NumberFormatException e) {
// ignore - load from preference pluginmanager.time-based-update.interval
Main.trace(e);
}
if (days <= 0) {
days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
}
}
if (days == 0) {
days = Main.pref.getInteger("pluginmanager.time-based-update.interval", PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL);
}
tfUpdateInterval.setText(Integer.toString(days));
}
/**
* Remebers the update policy preference settings on the JOSM preferences
*/
public void rememberInPreferences() {
// remember policy for version based update
//
for (Policy p: Policy.values()) {
if (rbVersionBasedUpatePolicy.get(p).isSelected()) {
Main.pref.put("pluginmanager.version-based-update.policy", p.getPreferencesValue());
break;
}
}
// remember policy for time based update
//
for (Policy p: Policy.values()) {
if (rbTimeBasedUpatePolicy.get(p).isSelected()) {
Main.pref.put("pluginmanager.time-based-update.policy", p.getPreferencesValue());
break;
}
}
// remember update interval
//
int days = 0;
try {
days = Integer.parseInt(tfUpdateInterval.getText().trim());
if (days <= 0) {
days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
}
} catch (NumberFormatException e) {
days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
}
Main.pref.putInteger("pluginmanager.time-based-update.interval", days);
}
class TimeBasedPolicyChangeListener implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
lblUpdateInterval.setEnabled(!rbTimeBasedUpatePolicy.get(Policy.NEVER).isSelected());
tfUpdateInterval.setEnabled(!rbTimeBasedUpatePolicy.get(Policy.NEVER).isSelected());
}
}
}