JAL-3551 working proof of concept of Jalview driving PyMOL
[jalview.git] / src / jalview / jbgui / GPreferences.java
index 904f559..f2761dd 100755 (executable)
@@ -24,11 +24,15 @@ import jalview.bin.Cache;
 import jalview.fts.core.FTSDataColumnPreferences;
 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
 import jalview.fts.service.pdb.PDBFTSRestClient;
+import jalview.gui.Desktop;
 import jalview.gui.JalviewBooleanRadioButtons;
+import jalview.gui.JvOptionPane;
 import jalview.gui.JvSwingUtils;
 import jalview.gui.StructureViewer.ViewerType;
-import jalview.io.BackupFilenameFilter;
+import jalview.io.BackupFilenameParts;
 import jalview.io.BackupFiles;
+import jalview.io.BackupFilesPresetEntry;
+import jalview.io.IntKeyStringValueEntry;
 import jalview.util.MessageManager;
 
 import java.awt.BorderLayout;
@@ -49,6 +53,8 @@ import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.Arrays;
+import java.util.List;
 
 import javax.swing.AbstractCellEditor;
 import javax.swing.BorderFactory;
@@ -93,6 +99,9 @@ public class GPreferences extends JPanel
   private static final Font LABEL_FONT_ITALIC = JvSwingUtils
           .getLabelFont(false, true);
 
+  private static final Font LABEL_FONT_BOLD = JvSwingUtils
+          .getLabelFont(true, false);
+
   /*
    * Visual tab components
    */
@@ -170,7 +179,9 @@ public class GPreferences extends JPanel
 
   protected JComboBox<String> structViewer = new JComboBox<>();
 
-  protected JTextField chimeraPath = new JTextField();
+  protected JLabel structureViewerPathLabel;
+
+  protected JTextField structureViewerPath = new JTextField();
 
   protected ButtonGroup mappingMethod = new ButtonGroup();
 
@@ -273,7 +284,6 @@ public class GPreferences extends JPanel
 
   protected JCheckBox sortByTree = new JCheckBox();
 
-
   /*
    * Web Services tab
    */
@@ -282,11 +292,23 @@ public class GPreferences extends JPanel
   /*
    * Backups tab components
    * a lot of these are member variables instead of local variables only so that they
-   * can be enabled/disabled easily
+   * can be enabled/disabled easily in one go
    */
 
   protected JCheckBox enableBackupFiles = new JCheckBox();
 
+  protected JPanel presetsPanel = new JPanel();
+
+  protected JLabel presetsComboLabel = new JLabel();
+
+  protected JCheckBox customiseCheckbox = new JCheckBox();
+
+  protected JButton revertButton = new JButton();
+
+  protected JComboBox<Object> backupfilesPresetsCombo = new JComboBox<>();
+
+  private int backupfilesPresetsComboLastSelected = 0;
+
   protected JPanel suffixPanel = new JPanel();
 
   protected JPanel keepfilesPanel = new JPanel();
@@ -305,13 +327,11 @@ public class GPreferences extends JPanel
 
   protected JalviewBooleanRadioButtons backupfilesKeepAll = new JalviewBooleanRadioButtons();
 
-  protected JSpinner backupfilesRollMaxSpinner = new JSpinner();
-
-  protected JalviewBooleanRadioButtons backupfilesConfirmDelete = new JalviewBooleanRadioButtons();
+  public JSpinner backupfilesRollMaxSpinner = new JSpinner();
 
-  protected JLabel exampleLabel = new JLabel();
+  protected JLabel oldBackupFilesLabel = new JLabel();
 
-  protected JScrollPane exampleScrollPane = new JScrollPane();
+  protected JalviewBooleanRadioButtons backupfilesConfirmDelete = new JalviewBooleanRadioButtons();
 
   protected JTextArea backupfilesExampleLabel = new JTextArea();
 
@@ -525,12 +545,6 @@ public class GPreferences extends JPanel
     embbedBioJSON.setText(MessageManager.getString("label.embbed_biojson"));
     embbedBioJSON.setBounds(new Rectangle(228, 200, 250, 23));
 
-
-    TitledBorder backupFilesBorder = new TitledBorder(
-            MessageManager
-                    .getString("label.backup_files"));
-
-
     jPanel11.add(jLabel1);
     jPanel11.add(blcjv);
     jPanel11.add(clustaljv);
@@ -617,6 +631,8 @@ public class GPreferences extends JPanel
                     GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                     new Insets(0, 2, 5, 5), 70, 1));
 
+    versioncheck.setVisible(false);
+
     // Add padding so the panel doesn't look ridiculous
     JPanel spacePanel = new JPanel();
     connectTab.add(spacePanel,
@@ -638,6 +654,7 @@ public class GPreferences extends JPanel
     linkTab.setLayout(new GridBagLayout());
 
     // Set up table for Url links
+    linkUrlTable.getTableHeader().setReorderingAllowed(false);
     linkUrlTable.setFillsViewportHeight(true);
     linkUrlTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
     linkUrlTable.setAutoCreateRowSorter(true);
@@ -1062,14 +1079,13 @@ public class GPreferences extends JPanel
         hiddenColour_actionPerformed(hiddenColour);
       }
     });
-    
+
     useLegacyGap = new JCheckBox(
             MessageManager.getString("label.ov_legacy_gap"));
     useLegacyGap.setFont(LABEL_FONT);
     useLegacyGap.setHorizontalAlignment(SwingConstants.LEFT);
     useLegacyGap.setVerticalTextPosition(SwingConstants.TOP);
-    gapLabel = new JLabel(
-            MessageManager.getString("label.gap_colour"));
+    gapLabel = new JLabel(MessageManager.getString("label.gap_colour"));
     gapLabel.setFont(LABEL_FONT);
     gapLabel.setHorizontalAlignment(SwingConstants.LEFT);
     gapLabel.setVerticalTextPosition(SwingConstants.TOP);
@@ -1181,7 +1197,7 @@ public class GPreferences extends JPanel
     structureTab.setBorder(new TitledBorder(
             MessageManager.getString("label.structure_options")));
     structureTab.setLayout(null);
-    final int width = 400;
+    final int width = 420;
     final int height = 22;
     final int lineSpacing = 25;
     int ypos = 15;
@@ -1229,13 +1245,15 @@ public class GPreferences extends JPanel
     viewerLabel.setFont(LABEL_FONT);
     viewerLabel.setHorizontalAlignment(SwingConstants.LEFT);
     viewerLabel.setText(MessageManager.getString("label.structure_viewer"));
-    viewerLabel.setBounds(new Rectangle(10, ypos, 200, height));
+    viewerLabel.setBounds(new Rectangle(10, ypos, 220, height));
     structureTab.add(viewerLabel);
 
     structViewer.setFont(LABEL_FONT);
-    structViewer.setBounds(new Rectangle(160, ypos, 120, height));
+    structViewer.setBounds(new Rectangle(190, ypos, 120, height));
     structViewer.addItem(ViewerType.JMOL.name());
     structViewer.addItem(ViewerType.CHIMERA.name());
+    structViewer.addItem(ViewerType.CHIMERAX.name());
+    structViewer.addItem(ViewerType.PYMOL.name());
     structViewer.addActionListener(new ActionListener()
     {
       @Override
@@ -1248,35 +1266,38 @@ public class GPreferences extends JPanel
     structureTab.add(structViewer);
 
     ypos += lineSpacing;
-    JLabel pathLabel = new JLabel();
-    pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
-    pathLabel.setHorizontalAlignment(SwingConstants.LEFT);
-    pathLabel.setText(MessageManager.getString("label.chimera_path"));
-    pathLabel.setBounds(new Rectangle(10, ypos, 140, height));
-    structureTab.add(pathLabel);
-
-    chimeraPath.setFont(LABEL_FONT);
-    chimeraPath.setText("");
+    structureViewerPathLabel = new JLabel();
+    structureViewerPathLabel.setFont(LABEL_FONT);// new Font("SansSerif", 0, 11));
+    structureViewerPathLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    structureViewerPathLabel.setText(MessageManager
+            .formatMessage("label.chimera_path", "Chimera(X)"));
+    structureViewerPathLabel.setBounds(new Rectangle(10, ypos, 170, height));
+    structureViewerPathLabel.setEnabled(false);
+    structureTab.add(structureViewerPathLabel);
+
+    structureViewerPath.setFont(LABEL_FONT);
+    structureViewerPath.setText("");
+    structureViewerPath.setEnabled(false);
     final String tooltip = JvSwingUtils.wrapTooltip(true,
             MessageManager.getString("label.chimera_path_tip"));
-    chimeraPath.setToolTipText(tooltip);
-    chimeraPath.setBounds(new Rectangle(160, ypos, 300, height));
-    chimeraPath.addMouseListener(new MouseAdapter()
+    structureViewerPath.setToolTipText(tooltip);
+    structureViewerPath.setBounds(new Rectangle(190, ypos, 290, height));
+    structureViewerPath.addMouseListener(new MouseAdapter()
     {
       @Override
       public void mouseClicked(MouseEvent e)
       {
-        if (e.getClickCount() == 2)
+        if (structureViewerPath.isEnabled() && e.getClickCount() == 2)
         {
           String chosen = openFileChooser();
           if (chosen != null)
           {
-            chimeraPath.setText(chosen);
+            structureViewerPath.setText(chosen);
           }
         }
       }
     });
-    structureTab.add(chimeraPath);
+    structureTab.add(structureViewerPath);
 
     ypos += lineSpacing;
     nwMapping.setFont(LABEL_FONT);
@@ -1291,7 +1312,7 @@ public class GPreferences extends JPanel
             MessageManager.getString("label.mapping_method"));
     mmTitledBorder.setTitleFont(LABEL_FONT);
     mappingPanel.setBorder(mmTitledBorder);
-    mappingPanel.setBounds(new Rectangle(10, ypos, 452, 45));
+    mappingPanel.setBounds(new Rectangle(10, ypos, 472, 45));
     // GridLayout mappingLayout = new GridLayout();
     mappingPanel.setLayout(new GridLayout());
     mappingPanel.add(nwMapping);
@@ -1302,7 +1323,7 @@ public class GPreferences extends JPanel
     ypos += lineSpacing;
     FTSDataColumnPreferences docFieldPref = new FTSDataColumnPreferences(
             PreferenceSource.PREFERENCES, PDBFTSRestClient.getInstance());
-    docFieldPref.setBounds(new Rectangle(10, ypos, 450, 120));
+    docFieldPref.setBounds(new Rectangle(10, ypos, 470, 120));
     structureTab.add(docFieldPref);
 
     return structureTab;
@@ -1685,6 +1706,56 @@ public class GPreferences extends JPanel
   }
 
   /**
+   * Load the saved Backups options EXCEPT "Enabled" and "Scheme"
+   */
+
+  protected void loadLastSavedBackupsOptions()
+  {
+    BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry
+            .getSavedBackupEntry();
+    enableBackupFiles
+            .setSelected(Cache.getDefault(BackupFiles.ENABLED, true));
+
+    BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry
+            .createBackupFilesPresetEntry(Cache
+                    .getDefault(BackupFilesPresetEntry.CUSTOMCONFIG, null));
+    if (backupfilesCustomEntry == null)
+    {
+      backupfilesCustomEntry = BackupFilesPresetEntry.backupfilesPresetEntriesValues
+              .get(BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT);
+    }
+    BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
+            BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM,
+            backupfilesCustomEntry);
+
+    setComboIntStringKey(backupfilesPresetsCombo,
+            Cache.getDefault(BackupFiles.NS + "_PRESET",
+                    BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT));
+
+    backupsSetOptions(savedPreset);
+
+    backupsOptionsSetEnabled();
+    updateBackupFilesExampleLabel();
+  }
+
+  private boolean warnAboutSuffixReverseChange()
+  {
+    BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
+            .getSavedBackupEntry();
+    boolean savedSuffixReverse = bfpe.reverse;
+    int savedSuffixDigits = bfpe.digits;
+    String savedSuffixTemplate = bfpe.suffix;
+
+    boolean nowSuffixReverse = suffixReverse.isSelected();
+    int nowSuffixDigits = getSpinnerInt(suffixDigitsSpinner, 3);
+    String nowSuffixTemplate = suffixTemplate.getText();
+    return nowSuffixReverse != savedSuffixReverse
+            && nowSuffixDigits == savedSuffixDigits
+            && nowSuffixTemplate != null
+            && nowSuffixTemplate.equals(savedSuffixTemplate);
+  }
+
+  /**
    * Initialises the Backups tabbed panel.
    * 
    * @return
@@ -1692,70 +1763,318 @@ public class GPreferences extends JPanel
   private JPanel initBackupsTab()
   {
     JPanel backupsTab = new JPanel();
-    backupsTab.setBorder(new TitledBorder(MessageManager
-            .getString("label.backup_files")));
+    backupsTab.setBorder(new TitledBorder(
+            MessageManager.getString("label.backup_files")));
     backupsTab.setLayout(new GridBagLayout());
 
-    enableBackupFiles.setFont(LABEL_FONT);
-    enableBackupFiles.setText(
-            MessageManager.getString("label.enable_backupfiles"));
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.weightx = 0.0;
+    gbc.weighty = 0.0;
+    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
+    gbc.fill = GridBagConstraints.NONE;
+
+    initBackupsTabPresetsPanel();
+    initBackupsTabSuffixPanel();
+    initBackupsTabKeepFilesPanel();
+    initBackupsTabFilenameExamplesPanel();
+
+    enableBackupFiles.setFont(LABEL_FONT_BOLD);
     enableBackupFiles
-            .setSelected(Cache.getDefault(BackupFiles.ENABLED, true));
+            .setText(MessageManager.getString("label.enable_backupfiles"));
     enableBackupFiles.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        boolean selected = enableBackupFiles.isSelected();
         // enable other options only when the first is checked
-        backupsOptionsSetEnabled(selected);
+        backupsOptionsSetEnabled();
       }
     });
 
-    GridBagConstraints gbc = new GridBagConstraints();
-    gbc.weightx = 1.0;
-    gbc.weighty = 0.0;
-    gbc.anchor = GridBagConstraints.NORTHWEST;
 
-    // enable checkbox 1 row
+    // enable checkbox 1 col
     gbc.gridwidth = 1;
-    gbc.gridy = 0;
+    gbc.gridheight = 1;
+    gbc.gridx = 0;
+    gbc.gridy = 0; // row 0
     backupsTab.add(enableBackupFiles, gbc);
 
-    // whole suffix panel next row
-    initBackupsTabSuffixPanel();
-    gbc.gridy = 1;
-    backupsTab.add(suffixPanel, gbc);
+    // summary of scheme box (over two rows)
+    gbc.gridx = 1;
+    gbc.weightx = 0.0;
+    gbc.gridheight = 2;
+    gbc.anchor = GridBagConstraints.FIRST_LINE_END;
+    gbc.fill = GridBagConstraints.BOTH;
+    backupsTab.add(exampleFilesPanel, gbc);
+    gbc.gridheight = 1;
+    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
+    gbc.fill = GridBagConstraints.NONE;
 
-    // keep files panel
-    initBackupsTabKeepFilesPanel();
-    gbc.gridy = 2;
+    // fill empty space on right
+    gbc.gridx++;
+    gbc.weightx = 1.0;
+    backupsTab.add(new JPanel(), gbc);
+
+    // schemes box
+    gbc.weightx = 0.0;
+    gbc.gridx = 0;
+    gbc.gridy++; // row 1
+    backupsTab.add(presetsPanel, gbc);
+
+    // now using whole row
+    gbc.gridwidth = 2;
+    gbc.gridheight = 1;
+    // keep files box
+    gbc.gridx = 0;
+    gbc.gridy++; // row 2
     backupsTab.add(keepfilesPanel, gbc);
 
-    // whole examples panel next row
-    initBackupsTabFilenameExamplesPanel();
-    gbc.gridy = 3;
-    backupsTab.add(exampleFilesPanel, gbc);
+    // filename strategy box
+    gbc.gridy++; // row 3
+    backupsTab.add(suffixPanel, gbc);
 
+    // fill empty space
+    gbc.gridy++; // row 4
+    gbc.weighty = 1.0;
+    backupsTab.add(new JPanel(), gbc);
+
+    backupsOptionsSetEnabled();
     return backupsTab;
   }
 
+  private JPanel initBackupsTabPresetsPanel()
+  {
+
+    String title = MessageManager.getString("label.schemes");
+
+    presetsPanel.setLayout(new GridBagLayout());
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.weightx = 0.0;
+    gbc.weighty = 0.0;
+    gbc.anchor = GridBagConstraints.BASELINE_LEADING;
+    gbc.fill = GridBagConstraints.NONE;
+    gbc.gridwidth = 1;
+    gbc.gridheight = 1;
+
+    // "Scheme: "
+    gbc.gridx = 0;
+    gbc.gridy = 0;
+
+    presetsComboLabel = new JLabel(title + ":");
+    presetsPanel.add(presetsComboLabel, gbc);
+
+    List<Object> entries = Arrays
+            .asList((Object[]) BackupFilesPresetEntry.backupfilesPresetEntries);
+    List<String> tooltips = Arrays.asList(
+            BackupFilesPresetEntry.backupfilesPresetEntryDescriptions);
+    backupfilesPresetsCombo = JvSwingUtils.buildComboWithTooltips(entries,
+            tooltips);
+    /*
+    for (int i = 0; i < BackupFilesPresetEntry.backupfilesPresetEntries.length; i++)
+    {
+      backupfilesPresetsCombo
+              .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]);
+    }
+    */
+
+    backupfilesPresetsCombo.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        int key = getComboIntStringKey(backupfilesPresetsCombo);
+        if (!customiseCheckbox.isSelected())
+        {
+          backupfilesPresetsComboLastSelected = key;
+        }
+        if (key == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
+        {
+          if (customiseCheckbox.isSelected())
+          {
+            // got here by clicking on customiseCheckbox so don't change the values
+            backupfilesCustomOptionsSetEnabled();
+          }
+          else
+          {
+            backupsTabUpdatePresets();
+            backupfilesCustomOptionsSetEnabled();
+          }
+        }
+        else
+        {
+          customiseCheckbox.setSelected(false);
+          backupsTabUpdatePresets();
+          backupfilesCustomOptionsSetEnabled();
+        }
+      }
+    });
+
+    // dropdown list of preset schemes
+    gbc.gridx = 1;
+    presetsPanel.add(backupfilesPresetsCombo, gbc);
+
+    revertButton.setText(MessageManager.getString("label.cancel_changes"));
+    revertButton.setToolTipText(
+            MessageManager.getString("label.cancel_changes_description"));
+    revertButton.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        backupsSetOptions(
+                BackupFilesPresetEntry.backupfilesPresetEntriesValues.get(
+                        BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM));
+        backupfilesCustomOptionsSetEnabled();
+      }
+
+    });
+    revertButton.setFont(LABEL_FONT);
+
+    customiseCheckbox.setFont(LABEL_FONT);
+    customiseCheckbox.setText(MessageManager.getString("label.customise"));
+    customiseCheckbox.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        int currently = getComboIntStringKey(backupfilesPresetsCombo);
+        if (customiseCheckbox.isSelected())
+        {
+          backupfilesPresetsComboLastSelected = currently;
+          setComboIntStringKey(backupfilesPresetsCombo,
+                  BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM);
+        }
+        else
+        {
+          setComboIntStringKey(backupfilesPresetsCombo,
+                  backupfilesPresetsComboLastSelected);
+
+        }
+        backupfilesCustomOptionsSetEnabled();
+      }
+    });
+    customiseCheckbox.setToolTipText(
+            MessageManager.getString("label.customise_description"));
+
+    // customise checkbox
+    gbc.gridx = 0;
+    gbc.gridy++;
+    presetsPanel.add(customiseCheckbox, gbc);
+
+    // "Cancel changes" button (aligned with combo box above)
+    gbc.gridx = 1;
+    presetsPanel.add(revertButton, gbc);
+
+    return presetsPanel;
+  }
+
+  private JPanel initBackupsTabFilenameExamplesPanel()
+  {
+    String title = MessageManager
+            .getString("label.scheme_examples");
+    TitledBorder tb = new TitledBorder(title);
+    exampleFilesPanel.setBorder(tb);
+    exampleFilesPanel.setLayout(new GridBagLayout());
+
+
+    backupfilesExampleLabel.setEditable(false);
+    backupfilesExampleLabel
+            .setBackground(exampleFilesPanel.getBackground());
+
+    updateBackupFilesExampleLabel();
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.weightx = 1.0;
+    gbc.weighty = 1.0;
+    gbc.fill = GridBagConstraints.NONE;
+    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
+
+    exampleFilesPanel.add(backupfilesExampleLabel, gbc);
+    return exampleFilesPanel;
+  }
+
+  private void backupsTabUpdatePresets()
+  {
+    IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo
+            .getSelectedItem();
+    int key = entry.k;
+    String value = entry.v;
+
+    if (BackupFilesPresetEntry.backupfilesPresetEntriesValues
+            .containsKey(key))
+    {
+      backupsSetOptions(
+              BackupFilesPresetEntry.backupfilesPresetEntriesValues
+                      .get(key));
+    }
+    else
+    {
+      Cache.log.error(
+              "Preset '" + value + "' [key:" + key + "] not implemented");
+    }
+
+    // Custom options will now be enabled when the customiseCheckbox is checked
+    // (performed above)
+    // backupfilesCustomOptionsSetEnabled();
+    updateBackupFilesExampleLabel();
+  }
+
+  protected int getComboIntStringKey(
+          JComboBox<Object> backupfilesPresetsCombo2)
+  {
+    IntKeyStringValueEntry e;
+    try
+    {
+      e = (IntKeyStringValueEntry) backupfilesPresetsCombo2
+              .getSelectedItem();
+    } catch (Exception ex)
+    {
+      Cache.log.error(
+              "Problem casting Combo entry to IntKeyStringValueEntry.");
+      e = null;
+    }
+    return e != null ? e.k : 0;
+  }
+
+  protected void setComboIntStringKey(
+          JComboBox<Object> backupfilesPresetsCombo2,
+          int key)
+  {
+    for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++)
+    {
+      IntKeyStringValueEntry e;
+      try
+      {
+        e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i);
+      } catch (Exception ex)
+      {
+        Cache.log.error(
+                "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. ");
+        continue;
+      }
+      if (e.k == key)
+      {
+        backupfilesPresetsCombo2.setSelectedIndex(i);
+        break;
+      }
+    }
+    // backupsTabUpdatePresets();
+  }
 
-  public JPanel initBackupsTabSuffixPanel()
+  private JPanel initBackupsTabSuffixPanel()
   {
     suffixPanel.setBorder(new TitledBorder(
-            MessageManager.getString("label.suffix_format")));
+            MessageManager.getString("label.backup_filename_strategy")));
     suffixPanel.setLayout(new GridBagLayout());
 
     suffixTemplateLabel
-            .setText(MessageManager.getString("label.suffix_template"));
+            .setText(MessageManager.getString("label.append_to_filename"));
     suffixTemplateLabel.setHorizontalAlignment(SwingConstants.LEFT);
     suffixTemplateLabel.setFont(LABEL_FONT);
 
-    String suffix = Cache.getDefault(BackupFiles.SUFFIX, BackupFiles.getNumPlaceHolder());
-    suffixTemplate.setText(suffix);
-    final String tooltip = JvSwingUtils.wrapTooltip(true, MessageManager
-            .getString("label.suffix_template_tooltip"));
+    final String tooltip = JvSwingUtils.wrapTooltip(true,
+            MessageManager.getString("label.append_to_filename_tooltip"));
     suffixTemplate.setToolTipText(tooltip);
     suffixTemplate.addActionListener(new ActionListener()
     {
@@ -1763,15 +2082,19 @@ public class GPreferences extends JPanel
       public void actionPerformed(ActionEvent e)
       {
         updateBackupFilesExampleLabel();
+        backupfilesCustomOptionsSetEnabled();
+        backupfilesRevertButtonSetEnabled(true);
       }
 
     });
-    KeyListener kl = new KeyListener()
+    suffixTemplate.addKeyListener(new KeyListener()
     {
       @Override
       public void keyReleased(KeyEvent e)
       {
         updateBackupFilesExampleLabel();
+        backupfilesCustomOptionsSetEnabled();
+        backupfilesRevertButtonSetEnabled(true);
       }
 
       @Override
@@ -1779,62 +2102,62 @@ public class GPreferences extends JPanel
       {
       }
 
-      // disable use of ':'
+      // disable use of ':' or '/' or '\'
       @Override
       public void keyTyped(KeyEvent e)
       {
         char c = e.getKeyChar();
-        if (c == ':')
+        if (c == ':' || c == '/' || c == '\\')
         {
-          // don't process ':'
+          // don't process ':' or '/' or '\'
           e.consume();
         }
       }
 
-    };
-    suffixTemplate.addKeyListener(kl);
+    });
 
     // digits spinner
     suffixDigitsLabel
             .setText(MessageManager.getString("label.index_digits"));
     suffixDigitsLabel.setHorizontalAlignment(SwingConstants.LEFT);
     suffixDigitsLabel.setFont(LABEL_FONT);
-    int defaultmin = 1;
-    try
-    {
-      defaultmin = Integer.parseInt(
-              MessageManager.getString("default.suffix_index_digits_min"));
-    } catch (Exception e)
+    ChangeListener c = new ChangeListener()
     {
-      defaultmin = 1;
-      System.out.println(
-              "Exception setting suffix digits min from default.suffix_index_digits_min label, setting to "
-                      + defaultmin);
-    }
-    int defaultmax = 6;
-    try {
-      defaultmax = Integer.parseInt(
-              MessageManager.getString("default.suffix_index_digits_max"));
-    } catch (Exception e) {
-      defaultmax = 6;
-      System.out.println(
-              "Exception setting suffix digits max from default.suffix_index_digits_max label, setting to "
-                      + defaultmax);
-    }
-    setIntegerSpinner(suffixDigitsSpinner, defaultmin, defaultmax,
-            Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3));
+      @Override
+      public void stateChanged(ChangeEvent e)
+      {
+        backupfilesRevertButtonSetEnabled(true);
+        updateBackupFilesExampleLabel();
+      }
 
-    suffixReverse.setSelected(
-            Cache.getDefault(BackupFiles.REVERSE_ORDER, false));
-    suffixReverse.setLabels(
-            MessageManager.getString("label.reverse_roll"),
+    };
+    setIntegerSpinner(suffixDigitsSpinner, BackupFilesPresetEntry.DIGITSMIN,
+            BackupFilesPresetEntry.DIGITSMAX, 3, c);
+
+    suffixReverse.setLabels(MessageManager.getString("label.reverse_roll"),
             MessageManager.getString("label.increment_index"));
     suffixReverse.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        updateBackupFilesExampleLabel();
+        boolean okay = true;
+        if (warnAboutSuffixReverseChange())
+        {
+          // Warning popup
+          okay = confirmSuffixReverseChange();
+        }
+        if (okay)
+        {
+          backupfilesRevertButtonSetEnabled(true);
+          updateBackupFilesExampleLabel();
+        }
+        else
+        {
+          boolean savedSuffixReverse = BackupFilesPresetEntry
+                  .getSavedBackupEntry().reverse;
+          suffixReverse.setSelected(savedSuffixReverse);
+        }
       }
     });
 
@@ -1849,15 +2172,15 @@ public class GPreferences extends JPanel
     sgbc.weightx = 1.0;
     sgbc.weighty = 0.0;
     sgbc.fill = GridBagConstraints.NONE;
-    suffixPanel.add(suffixTemplateLabel,sgbc);
-    
+    suffixPanel.add(suffixTemplateLabel, sgbc);
+
     sgbc.gridx = 1;
     sgbc.fill = GridBagConstraints.HORIZONTAL;
     suffixPanel.add(suffixTemplate, sgbc);
-    
+
     // second row (number of digits spinner)
     sgbc.gridy = 1;
-    
+
     sgbc.gridx = 0;
     sgbc.fill = GridBagConstraints.NONE;
     suffixPanel.add(suffixDigitsLabel, sgbc);
@@ -1879,14 +2202,26 @@ public class GPreferences extends JPanel
     return suffixPanel;
   }
 
+  private boolean confirmSuffixReverseChange()
+  {
+    boolean ret = false;
+    String warningMessage = MessageManager
+            .getString("label.warning_confirm_change_reverse");
+    int confirm = JvOptionPane.showConfirmDialog(Desktop.desktop,
+            warningMessage,
+            MessageManager.getString("label.change_increment_decrement"),
+            JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE);
+
+    ret = (confirm == JvOptionPane.YES_OPTION);
+    return ret;
+  }
+
   private JPanel initBackupsTabKeepFilesPanel()
   {
     keepfilesPanel.setBorder(
             new TitledBorder(MessageManager.getString("label.keep_files")));
     keepfilesPanel.setLayout(new GridBagLayout());
 
-    backupfilesKeepAll
-            .setSelected(Cache.getDefault(BackupFiles.NO_MAX, true));
     backupfilesKeepAll.setLabels(
             MessageManager.getString("label.keep_all_backup_files"),
             MessageManager.getString(
@@ -1896,6 +2231,7 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
+        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
     });
@@ -1904,22 +2240,39 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        boolean selected = backupfilesKeepAll.isSelected();
-        keepRollMaxOptionsEnabled(!selected);
+        backupfilesRevertButtonSetEnabled(true);
+        keepRollMaxOptionsEnabled();
         updateBackupFilesExampleLabel();
       }
     });
 
-    setIntegerSpinner(backupfilesRollMaxSpinner, 1, 999,
-            Cache.getDefault(BackupFiles.ROLL_MAX, 3));
+    ChangeListener c = new ChangeListener()
+    {
+      @Override
+      public void stateChanged(ChangeEvent e)
+      {
+        backupfilesRevertButtonSetEnabled(true);
+        updateBackupFilesExampleLabel();
+      }
+
+    };
+    setIntegerSpinner(backupfilesRollMaxSpinner,
+            BackupFilesPresetEntry.ROLLMAXMIN,
+            BackupFilesPresetEntry.ROLLMAXMAX, 4, true, c);
 
-    backupfilesConfirmDelete.setSelected(
-            Cache.getDefault(BackupFiles.CONFIRM_DELETE_OLD, true));
     backupfilesConfirmDelete.setLabels(
-            MessageManager.getString("label.confirm_delete"),
+            MessageManager.getString("label.always_ask"),
             MessageManager.getString("label.auto_delete"));
+    backupfilesConfirmDelete.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        backupfilesRevertButtonSetEnabled(true);
+      }
+    });
     // update the enabled section
-    keepRollMaxOptionsEnabled(!backupfilesKeepAll.isSelected());
+    keepRollMaxOptionsEnabled();
 
     GridBagConstraints kgbc = new GridBagConstraints();
 
@@ -1942,7 +2295,7 @@ public class GPreferences extends JPanel
     keepfilesPanel.add(backupfilesKeepAll.getFalseButton(), kgbc);
 
     kgbc.gridx = 1;
-    // kgbc.fill = GridBagConstraints.HORIZONTAL;
+    kgbc.gridwidth = GridBagConstraints.REMAINDER;
     keepfilesPanel.add(backupfilesRollMaxSpinner, kgbc);
 
     // third row (indented)
@@ -1953,84 +2306,62 @@ public class GPreferences extends JPanel
     kgbc.gridwidth = GridBagConstraints.REMAINDER;
     kgbc.fill = GridBagConstraints.HORIZONTAL;
     kgbc.weightx = 1.0;
-    keepfilesPanel.add(backupfilesConfirmDelete.getTrueButton(), kgbc);
 
-    // fourth row (indented)
-    kgbc.gridy = 3;
-    keepfilesPanel.add(backupfilesConfirmDelete.getFalseButton(), kgbc);
-    return keepfilesPanel;
-  }
-
-  private JPanel initBackupsTabFilenameExamplesPanel()
-  {
-    exampleFilesPanel.setBorder(new TitledBorder(
-            MessageManager.getString("label.examples")));
-    exampleFilesPanel.setLayout(new GridBagLayout());
+    JPanel jp = new JPanel();
+    jp.setLayout(new FlowLayout());
+    oldBackupFilesLabel
+            .setText(MessageManager
+                    .getString("label.autodelete_old_backup_files"));
+    oldBackupFilesLabel.setFont(LABEL_FONT);
+    oldBackupFilesLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    jp.add(oldBackupFilesLabel);
+    jp.add(backupfilesConfirmDelete.getTrueButton());
+    jp.add(backupfilesConfirmDelete.getFalseButton());
+    keepfilesPanel.add(jp, kgbc);
 
-    exampleLabel.setText(
-            MessageManager.getString("label.suffix_example_filenames"));
-    exampleLabel.setFont(LABEL_FONT);
-    exampleLabel.setHorizontalAlignment(SwingConstants.LEFT);
-
-    backupfilesExampleLabel.setEditable(false);
-    backupfilesExampleLabel.setPreferredSize(new Dimension(300, 100));
-    backupfilesExampleLabel.setAlignmentX(LEFT_ALIGNMENT);
-    backupfilesExampleLabel.setAlignmentY(TOP_ALIGNMENT);
-    
-    backupfilesExampleLabel.setFont(LABEL_FONT_ITALIC);
-    backupfilesExampleLabel.setBackground(exampleLabel.getBackground());
-
-    /*
-    exampleScrollPane.setBounds(0, 0, 200, 100);
-    exampleScrollPane.setPreferredSize(new Dimension(800, 800));
-    exampleScrollPane.add(backupfilesExampleLabel);
-    */
-    updateBackupFilesExampleLabel();
-
-    GridBagConstraints gbc = new GridBagConstraints();
-    gbc.anchor = GridBagConstraints.WEST;
-
-    gbc.gridy = 0;
-    exampleFilesPanel.add(exampleLabel, gbc);
-    gbc.gridy = 1;
-    exampleFilesPanel.add(backupfilesExampleLabel, gbc);
-    // exampleFilesPanel.add(exampleScrollPane, gbc);
-    return exampleFilesPanel;
+    return keepfilesPanel;
   }
 
-  private void updateBackupFilesExampleLabel()
+  protected void updateBackupFilesExampleLabel()
   {
     int exampleindex = 12;
-    String base = "filename";
-    String extension = ".fa";
-
-    String suffix = suffixTemplate.getText();
-    int digits = 3;
-    try {
-      suffixDigitsSpinner.commitEdit();
-      digits = (Integer) suffixDigitsSpinner.getValue();
-      digits = digits < 1 ? 1 : digits;
-    } catch (Exception e)
+    String base = MessageManager.getString("label.filename") + ".fa";
+    if (base == null || base.length() == 0)
     {
-      System.out.println("Failed casting (Integer) suffixTemplateSpinner.getValue()");
+      base = "file_name.fa";
     }
+
     boolean reverse = suffixReverse.isSelected();
     boolean keepAll = backupfilesKeepAll.isSelected();
     int rollMax = 4;
-    try
+    String suffix = suffixTemplate.getText();
+    int digits = 3;
+
+    backupfilesExampleLabel.setFont(LABEL_FONT_ITALIC);
+    if (suffix == null || suffix.length() == 0)
     {
-      backupfilesRollMaxSpinner.commitEdit();
-      rollMax = (Integer) backupfilesRollMaxSpinner.getValue();
-      rollMax = rollMax < 1 ? 1 : rollMax;
-    } catch (Exception e)
+      backupfilesExampleLabel
+              .setText(MessageManager.getString("label.no_backup_files"));
+      backupfilesExampleLabel.setFont(LABEL_FONT_BOLD);
+      return;
+    }
+
+    rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 4);
+    rollMax = rollMax < 1 ? 1 : rollMax;
+
+    if (suffix.indexOf(BackupFiles.NUM_PLACEHOLDER) == -1)
     {
-      System.out.println(
-              "Failed casting (Integer) backupfilesRollMaxSpinner.getValue()");
+      rollMax = 1;
     }
 
-    int surround = 3;
+    digits = getSpinnerInt(suffixDigitsSpinner, 3);
+    digits = digits < 1 ? 1 : digits;
+
+    int lowersurround = 2;
+    int uppersurround = 0;
     StringBuilder exampleSB = new StringBuilder();
     boolean firstLine = true;
+    int lineNumber = 0;
     if (reverse)
     {
 
@@ -2038,11 +2369,12 @@ public class GPreferences extends JPanel
       int max = keepAll ? exampleindex : rollMax;
       for (int index = min; index <= max; index++)
       {
-        if (index == min + surround && index <= max - surround)
+        if (index == min + lowersurround && index < max - uppersurround - 1)
         {
           exampleSB.append("\n...");
+          lineNumber++;
         }
-        else if (index > min + surround && index <= max - surround)
+        else if (index > min + lowersurround && index < max - uppersurround)
         {
           // nothing
         }
@@ -2055,20 +2387,29 @@ public class GPreferences extends JPanel
           else
           {
             exampleSB.append("\n");
+            lineNumber++;
           }
-          exampleSB.append(BackupFilenameFilter.getBackupFilename(index,
-                  base, suffix, digits, extension));
+          exampleSB.append(BackupFilenameParts.getBackupFilename(index,
+                  base, suffix, digits));
           if (min == max)
           {
             // no extra text needed
           }
           else if (index == min)
           {
-            exampleSB.append(" (most recent)");
+            String newest = MessageManager.getString("label.braced_newest");
+            if (newest != null && newest.length() > 0)
+            {
+              exampleSB.append(" " + newest);
+            }
           }
           else if (index == max)
           {
-            exampleSB.append(" (oldest)");
+            String oldest = MessageManager.getString("label.braced_oldest");
+            if (oldest != null && oldest.length() > 0)
+            {
+              exampleSB.append(" " + oldest);
+            }
           }
         }
       }
@@ -2083,11 +2424,12 @@ public class GPreferences extends JPanel
       for (int index = min; index <= max; index++)
       {
 
-        if (index == min + surround && index <= max - surround)
+        if (index == min + lowersurround && index < max - uppersurround - 1)
         {
           exampleSB.append("\n...");
+          lineNumber++;
         }
-        else if (index > min + surround && index <= max - surround)
+        else if (index > min + lowersurround && index < max - uppersurround)
         {
           // nothing
         }
@@ -2100,53 +2442,89 @@ public class GPreferences extends JPanel
           else
           {
             exampleSB.append("\n");
+            lineNumber++;
           }
-          exampleSB.append(BackupFilenameFilter.getBackupFilename(index,
-                  base, suffix, digits, extension));
+          exampleSB.append(BackupFilenameParts.getBackupFilename(index,
+                  base, suffix, digits));
           if (min == max)
           {
             // no extra text needed
           }
           else if (index == min)
           {
-            exampleSB.append(" (oldest)");
+            String oldest = MessageManager.getString("label.braced_oldest");
+            if (oldest != null && oldest.length() > 0)
+            {
+              exampleSB.append(" " + oldest);
+            }
           }
           else if (index == max)
           {
-            exampleSB.append(" (most recent)");
+            String newest = MessageManager.getString("label.braced_newest");
+            if (newest != null && newest.length() > 0)
+            {
+              exampleSB.append(" " + newest);
+            }
           }
         }
       }
 
     }
 
+    // add some extra empty lines to pad out the example files box. ugh, please tell
+    // me how to do this better
+    int remainingLines = lowersurround + uppersurround + 1 - lineNumber;
+    if (remainingLines > 0)
+    {
+      for (int i = 0; i < remainingLines; i++)
+      {
+        exampleSB.append("\n ");
+        lineNumber++;
+      }
+    }
+
     backupfilesExampleLabel.setText(exampleSB.toString());
   }
 
-  protected void setIntegerSpinner(JSpinner s, int min,
-          int max, int def)
+  protected void setIntegerSpinner(JSpinner s, int min, int max, int def,
+          boolean useExistingVal, ChangeListener c)
+  {
+    int i = def;
+    if (useExistingVal)
+    {
+      try
+      {
+        i = ((Integer) s.getValue()).intValue();
+      } catch (Exception e)
+      {
+        Cache.log.error(
+                "Exception casting the initial value of s.getValue()");
+      }
+    }
+
+    setIntegerSpinner(s, min, max, i, c);
+  }
+
+  protected void setIntegerSpinner(JSpinner s, int min, int max, int def,
+          ChangeListener c)
   {
     // integer spinner for number of digits
     if (def > max)
     {
       max = def;
     }
+    if (def < min)
+    {
+      def = min;
+    }
     SpinnerModel sModel = new SpinnerNumberModel(def, min, max, 1);
     s.setModel(sModel);
 
-    s.addChangeListener(new ChangeListener()
-    {
-      @Override
-      public void stateChanged(ChangeEvent e)
-      {
-        updateBackupFilesExampleLabel();
-      }
-
-    });
+    s.addChangeListener(c);
 
   }
 
-  public static int getSpinnerInt(JSpinner s, int def)
+  protected static int getSpinnerInt(JSpinner s, int def)
   {
     int i = def;
     try
@@ -2155,36 +2533,130 @@ public class GPreferences extends JPanel
       i = (Integer) s.getValue();
     } catch (Exception e)
     {
-      System.out.println("Failed casting (Integer) JSpinner s.getValue()");
+      Cache.log.error("Failed casting (Integer) JSpinner s.getValue()");
     }
     return i;
   }
 
-  private void keepRollMaxOptionsEnabled(boolean enabled)
+  private void keepRollMaxOptionsEnabled()
   {
+    boolean enabled = backupfilesKeepAll.isEnabled()
+            && !backupfilesKeepAll.isSelected();
+    oldBackupFilesLabel.setEnabled(enabled);
     backupfilesRollMaxSpinner.setEnabled(enabled);
     backupfilesConfirmDelete.setEnabled(enabled);
-
   }
-  private void backupsOptionsSetEnabled(boolean enabled)
+
+  private void backupfilesKeepAllSetEnabled(boolean tryEnabled)
   {
-    suffixPanel.setEnabled(enabled);
+    boolean enabled = tryEnabled && enableBackupFiles.isSelected()
+            && customiseCheckbox.isSelected()
+            && suffixTemplate.getText()
+                    .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1;
     keepfilesPanel.setEnabled(enabled);
-    exampleFilesPanel.setEnabled(enabled);
+    backupfilesKeepAll.setEnabled(enabled);
+    oldBackupFilesLabel.setEnabled(enabled);
+    keepRollMaxOptionsEnabled();
+  }
 
-    suffixTemplate.setEnabled(enabled);
-    suffixTemplateLabel.setEnabled(enabled);
+  private void backupfilesSuffixTemplateDigitsSetEnabled()
+  {
+    boolean enabled = suffixTemplate.isEnabled() && suffixTemplate.getText()
+            .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1;
     suffixDigitsLabel.setEnabled(enabled);
     suffixDigitsSpinner.setEnabled(enabled);
     suffixReverse.setEnabled(enabled);
-    backupfilesKeepAll.setEnabled(enabled);
-    backupfilesRollMaxSpinner.setEnabled(enabled);
-    backupfilesConfirmDelete.setEnabled(enabled);
-    exampleLabel.setEnabled(enabled);
-    exampleScrollPane.setEnabled(enabled);
+  }
+
+  private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled)
+  {
+    boolean enabled = tryEnabled && enableBackupFiles.isSelected()
+            && customiseCheckbox.isSelected();
+    suffixPanel.setEnabled(enabled);
+    suffixTemplateLabel.setEnabled(enabled);
+    suffixTemplate.setEnabled(enabled);
+    backupfilesSuffixTemplateDigitsSetEnabled();
+  }
+
+  private void backupfilesRevertButtonSetEnabled(boolean tryEnabled)
+  {
+    boolean enabled = tryEnabled && enableBackupFiles.isSelected()
+            && customiseCheckbox.isSelected() && backupfilesCustomChanged();
+    revertButton.setEnabled(enabled);
+  }
+
+  private boolean backupfilesCustomChanged()
+  {
+    BackupFilesPresetEntry custom = BackupFilesPresetEntry.backupfilesPresetEntriesValues
+            .get(BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM);
+    BackupFilesPresetEntry current = getBackupfilesCurrentEntry();
+    return !custom.equals(current);
+  }
+
+  protected BackupFilesPresetEntry getBackupfilesCurrentEntry()
+  {
+    String suffix = suffixTemplate.getText();
+    int digits = getSpinnerInt(suffixDigitsSpinner, 3);
+    boolean reverse = suffixReverse.isSelected();
+    boolean keepAll = backupfilesKeepAll.isSelected();
+    int rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 3);
+    boolean confirmDelete = backupfilesConfirmDelete.isSelected();
+
+    BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(suffix, digits,
+            reverse, keepAll, rollMax, confirmDelete);
+
+    return bfpe;
+  }
+
+  protected void backupfilesCustomOptionsSetEnabled()
+  {
+    boolean enabled = customiseCheckbox.isSelected();
+
+    backupfilesRevertButtonSetEnabled(enabled);
+    backupfilesSuffixTemplateSetEnabled(enabled);
+    backupfilesKeepAllSetEnabled(enabled);
+  }
+
+  private void backupfilesSummarySetEnabled()
+  {
+    boolean enabled = enableBackupFiles.isSelected();
     backupfilesExampleLabel.setEnabled(enabled);
+    exampleFilesPanel.setEnabled(enabled);
+  }
+
+  private void backupfilesPresetsSetEnabled()
+  {
+    boolean enabled = enableBackupFiles.isSelected();
+    presetsPanel.setEnabled(enabled);
+    presetsComboLabel.setEnabled(enabled);
+    backupfilesPresetsCombo.setEnabled(enabled);
+    customiseCheckbox.setEnabled(enabled);
+    revertButton.setEnabled(enabled);
+  }
+
+  protected void backupsOptionsSetEnabled()
+  {
+    backupfilesPresetsSetEnabled();
+    backupfilesSummarySetEnabled();
+    backupfilesCustomOptionsSetEnabled();
+  }
+
+  protected void backupsSetOptions(String suffix, int digits,
+          boolean reverse, boolean keepAll, int rollMax,
+          boolean confirmDelete)
+  {
+    suffixTemplate.setText(suffix);
+    suffixDigitsSpinner.setValue(digits);
+    suffixReverse.setSelected(reverse);
+    backupfilesKeepAll.setSelected(keepAll);
+    backupfilesRollMaxSpinner.setValue(rollMax);
+    backupfilesConfirmDelete.setSelected(confirmDelete);
+  }
 
-    keepRollMaxOptionsEnabled(enabled && !backupfilesKeepAll.isSelected());
+  protected void backupsSetOptions(BackupFilesPresetEntry p)
+  {
+    backupsSetOptions(p.suffix, p.digits, p.reverse, p.keepAll, p.rollMax,
+            p.confirmDelete);
   }
 
   protected void autoIdWidth_actionPerformed()
@@ -2372,3 +2844,4 @@ public class GPreferences extends JPanel
 
   }
 }
+