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