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}