001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences.map;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.GridBagLayout;
007import java.awt.event.ActionListener;
008
009import javax.swing.BorderFactory;
010import javax.swing.Box;
011import javax.swing.JCheckBox;
012import javax.swing.JLabel;
013import javax.swing.JPanel;
014import javax.swing.JSeparator;
015
016import org.openstreetmap.josm.data.preferences.BooleanProperty;
017import org.openstreetmap.josm.gui.help.HelpUtil;
018import org.openstreetmap.josm.gui.layer.AutosaveTask;
019import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
020import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
021import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
022import org.openstreetmap.josm.gui.widgets.HtmlPanel;
023import org.openstreetmap.josm.gui.widgets.JosmTextField;
024import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
025import org.openstreetmap.josm.tools.GBC;
026
027/**
028 * Preference settings for data layer autosave.
029 */
030public class BackupPreference extends DefaultTabPreferenceSetting {
031
032    /**
033     * Factory used to create a new {@code BackupPreference}.
034     */
035    public static class Factory implements PreferenceSettingFactory {
036        @Override
037        public BackupPreference createPreferenceSetting() {
038            return new BackupPreference();
039        }
040    }
041
042    private static final BooleanProperty PROP_KEEP_BACKUP = new BooleanProperty("save.keepbackup", false);
043    private JCheckBox notification;
044    private JCheckBox keepBackup;
045    private JCheckBox autosave;
046    private final JosmTextField autosaveInterval = new JosmTextField(8);
047    private final JosmTextField backupPerLayer = new JosmTextField(8);
048
049    BackupPreference() {
050        super(/* ICON(preferences/) */ "backup", tr("File backup"), tr("Configure whether to create backup files"));
051    }
052
053    @Override
054    public void addGui(PreferenceTabbedPane gui) {
055        JPanel panel = new VerticallyScrollablePanel(new GridBagLayout());
056        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
057
058        autosave = new JCheckBox(tr("Auto save enabled"));
059        autosave.setSelected(AutosaveTask.PROP_AUTOSAVE_ENABLED.get());
060        panel.add(autosave, GBC.eol());
061
062        final JLabel autosaveIntervalLabel = new JLabel(tr("Auto save interval (seconds)"));
063        autosaveIntervalLabel.setLabelFor(autosaveInterval);
064        panel.add(autosaveIntervalLabel, GBC.std().insets(60, 0, 0, 0));
065        autosaveInterval.setText(Integer.toString(AutosaveTask.PROP_INTERVAL.get()));
066        autosaveInterval.setToolTipText(tr("Default value: {0}", AutosaveTask.PROP_INTERVAL.getDefaultValue()));
067        autosaveInterval.setMinimumSize(autosaveInterval.getPreferredSize());
068        panel.add(autosaveInterval, GBC.eol().insets(5, 0, 0, 5));
069
070        final JLabel backupPerLayerLabel = new JLabel(tr("Auto saved files per layer"));
071        backupPerLayerLabel.setLabelFor(backupPerLayer);
072        panel.add(backupPerLayerLabel, GBC.std().insets(60, 0, 0, 0));
073        backupPerLayer.setText(Integer.toString(AutosaveTask.PROP_FILES_PER_LAYER.get()));
074        backupPerLayer.setToolTipText(tr("Default value: {0}", AutosaveTask.PROP_FILES_PER_LAYER.getDefaultValue()));
075        backupPerLayer.setMinimumSize(backupPerLayer.getPreferredSize());
076        panel.add(backupPerLayer, GBC.eol().insets(5, 0, 0, 10));
077
078        panel.add(new HtmlPanel(
079            tr("<i>(Autosave stores the changed data layers in periodic intervals. " +
080                "The backups are saved in JOSM''s preference folder. " +
081                "In case of a crash, JOSM tries to recover the unsaved changes " +
082                "on next start.)</i>")),
083            GBC.eop().fill(GBC.HORIZONTAL).insets(5, 0, 0, 10));
084
085        panel.add(new JSeparator(), GBC.eop().fill(GBC.HORIZONTAL));
086
087        keepBackup = new JCheckBox(tr("Keep backup files when saving data layers"));
088        keepBackup.setSelected(PROP_KEEP_BACKUP.get());
089        keepBackup.setToolTipText(tr("When saving, keep backup files ending with a ~"));
090        panel.add(keepBackup, GBC.eop());
091
092        panel.add(new HtmlPanel(
093            tr("<i>(JOSM can keep a backup file when saving data layers. "+
094                "It appends ''~'' to the file name and saves it in the same folder.)</i>")),
095            GBC.eop().fill(GBC.HORIZONTAL).insets(5, 0, 0, 0));
096
097        panel.add(new JSeparator(), GBC.eop().fill(GBC.HORIZONTAL));
098
099        notification = new JCheckBox(tr("Notification at each save"));
100        notification.setSelected(AutosaveTask.PROP_NOTIFICATION.get());
101        notification.setToolTipText(tr("When saving, display a small notification"));
102        panel.add(notification, GBC.eop());
103
104        ActionListener autosaveEnabled = e -> {
105            boolean enabled = autosave.isSelected();
106            autosaveIntervalLabel.setEnabled(enabled);
107            autosaveInterval.setEnabled(enabled);
108            backupPerLayerLabel.setEnabled(enabled);
109            backupPerLayer.setEnabled(enabled);
110        };
111        autosave.addActionListener(autosaveEnabled);
112        autosaveEnabled.actionPerformed(null);
113
114        panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
115        gui.createPreferenceTab(this).add(panel, GBC.eol().fill(GBC.BOTH));
116    }
117
118    @Override
119    public boolean ok() {
120        boolean restartRequired = false;
121        PROP_KEEP_BACKUP.put(keepBackup.isSelected());
122
123        restartRequired |= AutosaveTask.PROP_AUTOSAVE_ENABLED.put(autosave.isSelected());
124        restartRequired |= AutosaveTask.PROP_INTERVAL.parseAndPut(autosaveInterval.getText());
125        AutosaveTask.PROP_FILES_PER_LAYER.parseAndPut(backupPerLayer.getText());
126        AutosaveTask.PROP_NOTIFICATION.put(notification.isSelected());
127        return restartRequired;
128    }
129
130    @Override
131    public boolean isExpert() {
132        return false;
133    }
134
135    @Override
136    public String getHelpContext() {
137        return HelpUtil.ht("/Preferences/BackupPreference");
138    }
139}