JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
[jalview.git] / src / jalview / jbgui / GPreferences.java
index 9327569..7784cf4 100755 (executable)
@@ -31,8 +31,6 @@ import jalview.gui.JvSwingUtils;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.io.BackupFilenameParts;
 import jalview.io.BackupFiles;
-import jalview.io.BackupFilesPresetEntry;
-import jalview.io.IntKeyStringValueEntry;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 
@@ -54,8 +52,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 java.util.HashMap;
+import java.util.Map;
 
 import javax.swing.AbstractCellEditor;
 import javax.swing.BorderFactory;
@@ -66,6 +64,7 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
+import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.JScrollPane;
@@ -93,6 +92,7 @@ import javax.swing.table.TableCellRenderer;
  * @author $author$
  * @version $Revision$
  */
+@SuppressWarnings("serial")
 public class GPreferences extends JPanel
 {
   private static final Font LABEL_FONT = JvSwingUtils.getLabelFont();
@@ -180,6 +180,8 @@ public class GPreferences extends JPanel
 
   protected JComboBox<String> structViewer = new JComboBox<>();
 
+  protected JTextField structureDimensions = new JTextField();
+
   protected JTextField chimeraPath = new JTextField();
 
   protected ButtonGroup mappingMethod = new ButtonGroup();
@@ -215,13 +217,13 @@ public class GPreferences extends JPanel
   /*
    * Connections tab components
    */
-  protected JTable linkUrlTable = new JTable();
+  public JTable linkUrlTable = new JTable();
 
-  protected JButton editLink = new JButton();
+  public JButton editLink = new JButton();
 
-  protected JButton deleteLink = new JButton();
+  public JButton deleteLink = new JButton();
 
-  protected JTextField filterTB = new JTextField();
+  public JTextField filterTB = new JTextField();
 
   protected JButton doReset = new JButton();
 
@@ -302,15 +304,9 @@ public class GPreferences extends JPanel
 
   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 JComboBox<IntKeyStringValueEntry> backupfilesPresetsCombo = new JComboBox<>();
 
   protected JPanel suffixPanel = new JPanel();
 
@@ -380,11 +376,11 @@ public class GPreferences extends JPanel
     tabbedPane.add(initConnectionsTab(),
             MessageManager.getString("label.connections"));
 
-    if (!Platform.isJS())
-    {
-      tabbedPane.add(initBackupsTab(),
-              MessageManager.getString("label.backups"));
-    }
+       if (!Platform.isJS()) 
+       {
+         tabbedPane.add(initBackupsTab(), 
+                       MessageManager.getString("label.backups"));
+       }
 
     tabbedPane.add(initLinksTab(),
             MessageManager.getString("label.urllinks"));
@@ -1287,6 +1283,7 @@ public class GPreferences extends JPanel
     structViewer.addItem(ViewerType.JMOL.name());
     structViewer.addItem(ViewerType.CHIMERA.name());
     structViewer.addActionListener(new ActionListener()
+
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1297,6 +1294,20 @@ public class GPreferences extends JPanel
     });
     structureTab.add(structViewer);
 
+    // BH 2019.07.12
+    ypos += lineSpacing;
+    JLabel dimLabel = new JLabel();
+    dimLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
+    dimLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    dimLabel.setText(
+            MessageManager.getString("label.structure_dimensions"));
+    dimLabel.setBounds(new Rectangle(10, ypos, 140, height));
+    structureTab.add(dimLabel);
+
+    structureDimensions.setFont(LABEL_FONT);
+    structureDimensions.setBounds(new Rectangle(160, ypos, 120, height));
+    structureTab.add(structureDimensions);
+
     ypos += lineSpacing;
     JLabel pathLabel = new JLabel();
     pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
@@ -1758,41 +1769,34 @@ public class GPreferences extends JPanel
 
   protected void loadLastSavedBackupsOptions()
   {
-    BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry
-            .getSavedBackupEntry();
     enableBackupFiles
-            .setSelected(Cache.getDefault(BackupFiles.ENABLED,
-                    !Platform.isJS()));
-
-    BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry
-            .createBackupFilesPresetEntry(Cache
-                    .getDefault(BackupFilesPresetEntry.CUSTOMCONFIG, null));
-    if (backupfilesCustomEntry == null)
-    {
-      backupfilesCustomEntry = BackupFilesPresetEntry.backupfilesPresetEntriesValues
-              .get(BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT);
-    }
-    BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
-            BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM,
-            backupfilesCustomEntry);
-
+            .setSelected(Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS()));
     setComboIntStringKey(backupfilesPresetsCombo,
-            Cache.getDefault(BackupFiles.NS + "_PRESET",
-                    BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT));
-
-    backupsSetOptions(savedPreset);
+            Cache.getDefault(BackupFiles.NS + "_PRESET", 1));
+    suffixTemplate.setText(Cache.getDefault(BackupFiles.SUFFIX,
+            ".bak" + BackupFiles.NUM_PLACEHOLDER));
+    suffixDigitsSpinner
+            .setValue(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3));
+    suffixReverse.setSelected(
+            Cache.getDefault(BackupFiles.REVERSE_ORDER, false));
+    backupfilesKeepAll
+            .setSelected(Cache.getDefault(BackupFiles.NO_MAX, false));
+    backupfilesRollMaxSpinner
+            .setValue(Cache.getDefault(BackupFiles.ROLL_MAX, 3));
+    backupfilesConfirmDelete.setSelected(
+            Cache.getDefault(BackupFiles.CONFIRM_DELETE_OLD, true));
 
     backupsOptionsSetEnabled();
     updateBackupFilesExampleLabel();
   }
 
-  private boolean warnAboutSuffixReverseChange()
+  protected boolean warnAboutSuffixReverseChange()
   {
-    BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
-            .getSavedBackupEntry();
-    boolean savedSuffixReverse = bfpe.reverse;
-    int savedSuffixDigits = bfpe.digits;
-    String savedSuffixTemplate = bfpe.suffix;
+    boolean savedSuffixReverse = Cache.getDefault(BackupFiles.REVERSE_ORDER,
+            false);
+    int savedSuffixDigits = Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3);
+    String savedSuffixTemplate = Cache.getDefault(BackupFiles.SUFFIX,
+            ".bak" + BackupFiles.NUM_PLACEHOLDER);
 
     boolean nowSuffixReverse = suffixReverse.isSelected();
     int nowSuffixDigits = getSpinnerInt(suffixDigitsSpinner, 3);
@@ -1869,6 +1873,7 @@ public class GPreferences extends JPanel
     gbc.gridy++; // row 1
     backupsTab.add(presetsPanel, gbc);
 
+    // gbc.anchor = GridBagConstraints.NORTHWEST;
     // now using whole row
     gbc.gridwidth = 2;
     gbc.gridheight = 1;
@@ -1890,10 +1895,50 @@ public class GPreferences extends JPanel
     return backupsTab;
   }
 
+  protected static final int BACKUPFILESSCHEMECUSTOMISE = 0;
+
+  private static final IntKeyStringValueEntry[] backupfilesPresetEntries = {
+      new IntKeyStringValueEntry(1,
+              MessageManager.getString("label.default")),
+      new IntKeyStringValueEntry(2,
+              MessageManager.getString("label.single_file")),
+      new IntKeyStringValueEntry(3,
+              MessageManager.getString("label.keep_all_versions")),
+      new IntKeyStringValueEntry(4,
+              MessageManager.getString("label.rolled_backups")),
+      // ...
+      // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last)
+      new IntKeyStringValueEntry(BACKUPFILESSCHEMECUSTOMISE,
+              MessageManager.getString("label.customise")) };
+
+  private static final Map<Integer, BackupFilesPresetEntry> backupfilesPresetEntriesValues = new HashMap<Integer, BackupFilesPresetEntry>()
+  {
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 125L;
+
+    {
+      put(1, new BackupFilesPresetEntry(
+              ".bak" + BackupFiles.NUM_PLACEHOLDER, 3, false, false, 3,
+              false));
+      put(2, new BackupFilesPresetEntry("~", 1, false, false, 1, false));
+      put(3, new BackupFilesPresetEntry(".v" + BackupFiles.NUM_PLACEHOLDER,
+              3, false, true, 10, true));
+      put(4, new BackupFilesPresetEntry(
+              "_bak." + BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9,
+              false));
+    }
+  };
+
   private JPanel initBackupsTabPresetsPanel()
   {
 
     String title = MessageManager.getString("label.schemes");
+    // TitledBorder tb = new TitledBorder(new EmptyBorder(0, 0, 0, 0), title);
+    // TitledBorder tb = new TitledBorder(title);
+    // tb.setTitleFont(LABEL_FONT);
+    // presetsPanel.setBorder(tb);
 
     presetsPanel.setLayout(new GridBagLayout());
 
@@ -1908,53 +1953,24 @@ public class GPreferences extends JPanel
     // "Scheme: "
     gbc.gridx = 0;
     gbc.gridy = 0;
+    presetsPanel.add(new JLabel(title + ":"), gbc);
 
-    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++)
+    for (int i = 0; i < backupfilesPresetEntries.length; i++)
     {
-      backupfilesPresetsCombo
-              .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]);
+      backupfilesPresetsCombo.addItem(backupfilesPresetEntries[i]);
     }
-    */
 
+    // put "Previously saved scheme" item in italics (it's not really
+    // selectable, as such -- it deselects itself when selected) and
+    // "Customise" in bold
+    backupfilesPresetsCombo
+            .setRenderer(new BackupFilesPresetsComboBoxRenderer());
     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();
-        }
+        backupsTabUpdatePresets();
       }
     });
 
@@ -1963,55 +1979,20 @@ public class GPreferences extends JPanel
     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();
+        loadLastSavedBackupsOptions();
       }
 
     });
     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;
+    gbc.gridy++;
     presetsPanel.add(revertButton, gbc);
 
     return presetsPanel;
@@ -2020,7 +2001,7 @@ public class GPreferences extends JPanel
   private JPanel initBackupsTabFilenameExamplesPanel()
   {
     String title = MessageManager
-            .getString("label.scheme_examples");
+            .getString("label.summary_of_backups_scheme");
     TitledBorder tb = new TitledBorder(title);
     exampleFilesPanel.setBorder(tb);
     exampleFilesPanel.setLayout(new GridBagLayout());
@@ -2042,72 +2023,49 @@ public class GPreferences extends JPanel
     return exampleFilesPanel;
   }
 
-  private void backupsTabUpdatePresets()
+  protected void backupsTabUpdatePresets()
   {
     IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo
             .getSelectedItem();
-    int key = entry.k;
-    String value = entry.v;
+    int key = entry.getKey();
+    String value = entry.getValue();
 
-    if (BackupFilesPresetEntry.backupfilesPresetEntriesValues
-            .containsKey(key))
+    // BACKUPFILESSCHEMECUSTOMISE (==0) reserved for "Custom"
+    if (key != BACKUPFILESSCHEMECUSTOMISE)
     {
-      backupsSetOptions(
-              BackupFilesPresetEntry.backupfilesPresetEntriesValues
-                      .get(key));
-    }
-    else
-    {
-      Cache.log.error(
-              "Preset '" + value + "' [key:" + key + "] not implemented");
+      if (backupfilesPresetEntriesValues.containsKey(key))
+      {
+        backupsSetOptions(backupfilesPresetEntriesValues.get(key));
+      }
+      else
+      {
+        System.out.println("Preset '" + value + "' not implemented");
+      }
     }
 
-    // Custom options will now be enabled when the customiseCheckbox is checked
-    // (performed above)
-    // backupfilesCustomOptionsSetEnabled();
+    backupfilesCustomOptionsSetEnabled();
     updateBackupFilesExampleLabel();
   }
 
-  protected int getComboIntStringKey(
-          JComboBox<Object> backupfilesPresetsCombo2)
+  protected int getComboIntStringKey(JComboBox<IntKeyStringValueEntry> c)
   {
-    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;
+    IntKeyStringValueEntry e = (IntKeyStringValueEntry) c.getSelectedItem();
+    return e != null ? e.getKey() : 0;
   }
 
-  protected void setComboIntStringKey(
-          JComboBox<Object> backupfilesPresetsCombo2,
+  protected void setComboIntStringKey(JComboBox<IntKeyStringValueEntry> c,
           int key)
   {
-    for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++)
+    for (int i = 0; i < c.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)
+      IntKeyStringValueEntry e = c.getItemAt(i);
+      if (e.getKey() == key)
       {
-        backupfilesPresetsCombo2.setSelectedIndex(i);
+        c.setSelectedIndex(i);
         break;
       }
     }
-    // backupsTabUpdatePresets();
+    backupsTabUpdatePresets();
   }
 
   private JPanel initBackupsTabSuffixPanel()
@@ -2131,18 +2089,16 @@ public class GPreferences extends JPanel
       {
         updateBackupFilesExampleLabel();
         backupfilesCustomOptionsSetEnabled();
-        backupfilesRevertButtonSetEnabled(true);
       }
 
     });
-    suffixTemplate.addKeyListener(new KeyListener()
+    KeyListener kl = new KeyListener()
     {
       @Override
       public void keyReleased(KeyEvent e)
       {
         updateBackupFilesExampleLabel();
         backupfilesCustomOptionsSetEnabled();
-        backupfilesRevertButtonSetEnabled(true);
       }
 
       @Override
@@ -2162,25 +2118,26 @@ public class GPreferences extends JPanel
         }
       }
 
-    });
+    };
+    suffixTemplate.addKeyListener(kl);
 
     // digits spinner
     suffixDigitsLabel
             .setText(MessageManager.getString("label.index_digits"));
     suffixDigitsLabel.setHorizontalAlignment(SwingConstants.LEFT);
     suffixDigitsLabel.setFont(LABEL_FONT);
+    int defaultmin = 1;
+    int defaultmax = 6;
     ChangeListener c = new ChangeListener()
     {
       @Override
       public void stateChanged(ChangeEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
 
     };
-    setIntegerSpinner(suffixDigitsSpinner, BackupFilesPresetEntry.DIGITSMIN,
-            BackupFilesPresetEntry.DIGITSMAX, 3, c);
+    setIntegerSpinner(suffixDigitsSpinner, defaultmin, defaultmax, 3, c);
 
     suffixReverse.setLabels(MessageManager.getString("label.reverse_roll"),
             MessageManager.getString("label.increment_index"));
@@ -2197,13 +2154,12 @@ public class GPreferences extends JPanel
         }
         if (okay)
         {
-          backupfilesRevertButtonSetEnabled(true);
           updateBackupFilesExampleLabel();
         }
         else
         {
-          boolean savedSuffixReverse = BackupFilesPresetEntry
-                  .getSavedBackupEntry().reverse;
+          boolean savedSuffixReverse = Cache
+                  .getDefault(BackupFiles.REVERSE_ORDER, false);
           suffixReverse.setSelected(savedSuffixReverse);
         }
       }
@@ -2250,12 +2206,12 @@ public class GPreferences extends JPanel
     return suffixPanel;
   }
 
-  private boolean confirmSuffixReverseChange()
+  protected boolean confirmSuffixReverseChange()
   {
     boolean ret = false;
     String warningMessage = MessageManager
             .getString("label.warning_confirm_change_reverse");
-    int confirm = JvOptionPane.showConfirmDialog(Desktop.desktop,
+    int confirm = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
             warningMessage,
             MessageManager.getString("label.change_increment_decrement"),
             JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE);
@@ -2279,7 +2235,6 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
     });
@@ -2288,7 +2243,6 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         keepRollMaxOptionsEnabled();
         updateBackupFilesExampleLabel();
       }
@@ -2299,26 +2253,15 @@ public class GPreferences extends JPanel
       @Override
       public void stateChanged(ChangeEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
 
     };
-    setIntegerSpinner(backupfilesRollMaxSpinner,
-            BackupFilesPresetEntry.ROLLMAXMIN,
-            BackupFilesPresetEntry.ROLLMAXMAX, 4, true, c);
+    setIntegerSpinner(backupfilesRollMaxSpinner, 1, 999, 4, true, c);
 
     backupfilesConfirmDelete.setLabels(
             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();
 
@@ -2354,6 +2297,13 @@ 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);
+    */
 
     JPanel jp = new JPanel();
     jp.setLayout(new FlowLayout());
@@ -2409,7 +2359,6 @@ public class GPreferences extends JPanel
     int uppersurround = 0;
     StringBuilder exampleSB = new StringBuilder();
     boolean firstLine = true;
-    int lineNumber = 0;
     if (reverse)
     {
 
@@ -2420,7 +2369,6 @@ public class GPreferences extends JPanel
         if (index == min + lowersurround && index < max - uppersurround - 1)
         {
           exampleSB.append("\n...");
-          lineNumber++;
         }
         else if (index > min + lowersurround && index < max - uppersurround)
         {
@@ -2435,7 +2383,6 @@ public class GPreferences extends JPanel
           else
           {
             exampleSB.append("\n");
-            lineNumber++;
           }
           exampleSB.append(BackupFilenameParts.getBackupFilename(index,
                   base, suffix, digits));
@@ -2475,7 +2422,6 @@ public class GPreferences extends JPanel
         if (index == min + lowersurround && index < max - uppersurround - 1)
         {
           exampleSB.append("\n...");
-          lineNumber++;
         }
         else if (index > min + lowersurround && index < max - uppersurround)
         {
@@ -2490,7 +2436,6 @@ public class GPreferences extends JPanel
           else
           {
             exampleSB.append("\n");
-            lineNumber++;
           }
           exampleSB.append(BackupFilenameParts.getBackupFilename(index,
                   base, suffix, digits));
@@ -2519,18 +2464,6 @@ public class GPreferences extends JPanel
 
     }
 
-    // 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());
   }
 
@@ -2545,7 +2478,7 @@ public class GPreferences extends JPanel
         i = Integer.parseInt((String) s.getValue());
       } catch (Exception e)
       {
-        Cache.log.error(
+        System.out.println(
                 "Exception casting the initial value of s.getValue()");
       }
     }
@@ -2577,12 +2510,12 @@ public class GPreferences extends JPanel
       i = (Integer) s.getValue();
     } catch (Exception e)
     {
-      Cache.log.error("Failed casting (Integer) JSpinner s.getValue()");
+      System.out.println("Failed casting (Integer) JSpinner s.getValue()");
     }
     return i;
   }
 
-  private void keepRollMaxOptionsEnabled()
+  protected void keepRollMaxOptionsEnabled()
   {
     boolean enabled = backupfilesKeepAll.isEnabled()
             && !backupfilesKeepAll.isSelected();
@@ -2591,10 +2524,10 @@ public class GPreferences extends JPanel
     backupfilesConfirmDelete.setEnabled(enabled);
   }
 
-  private void backupfilesKeepAllSetEnabled(boolean tryEnabled)
+  protected void backupfilesKeepAllSetEnabled(boolean tryEnabled)
   {
     boolean enabled = tryEnabled && enableBackupFiles.isSelected()
-            && customiseCheckbox.isSelected()
+            && getComboIntStringKey(backupfilesPresetsCombo) == 0
             && suffixTemplate.getText()
                     .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1;
     keepfilesPanel.setEnabled(enabled);
@@ -2615,48 +2548,18 @@ public class GPreferences extends JPanel
   private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled)
   {
     boolean enabled = tryEnabled && enableBackupFiles.isSelected()
-            && customiseCheckbox.isSelected();
+            && getComboIntStringKey(backupfilesPresetsCombo) == 0;
     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();
+    int scheme = getComboIntStringKey(backupfilesPresetsCombo);
+    boolean enabled = scheme == 0 && enableBackupFiles.isSelected();
 
-    backupfilesRevertButtonSetEnabled(enabled);
     backupfilesSuffixTemplateSetEnabled(enabled);
     backupfilesKeepAllSetEnabled(enabled);
   }
@@ -2672,10 +2575,7 @@ public class GPreferences extends JPanel
   {
     boolean enabled = enableBackupFiles.isSelected();
     presetsPanel.setEnabled(enabled);
-    presetsComboLabel.setEnabled(enabled);
     backupfilesPresetsCombo.setEnabled(enabled);
-    customiseCheckbox.setEnabled(enabled);
-    revertButton.setEnabled(enabled);
   }
 
   protected void backupsOptionsSetEnabled()
@@ -2864,6 +2764,7 @@ public class GPreferences extends JPanel
       button.setHorizontalAlignment(SwingConstants.CENTER);
       this.button.addActionListener(new ActionListener()
       {
+        @SuppressWarnings("synthetic-access")
         @Override
         public void actionPerformed(ActionEvent e)
         {
@@ -2889,3 +2790,85 @@ public class GPreferences extends JPanel
   }
 }
 
+class IntKeyStringValueEntry
+{
+  int k;
+
+  String v;
+
+  public IntKeyStringValueEntry(int k, String v)
+  {
+    this.k = k;
+    this.v = v;
+  }
+
+  @Override
+  public String toString()
+  {
+    return this.getValue();
+  }
+
+  public int getKey()
+  {
+    return k;
+  }
+
+  public String getValue()
+  {
+    return v;
+  }
+}
+
+class BackupFilesPresetEntry
+{
+  String suffix;
+
+  int digits;
+
+  boolean reverse;
+
+  boolean keepAll;
+
+  int rollMax;
+
+  boolean confirmDelete;
+
+  public BackupFilesPresetEntry(String suffix, int digits, boolean reverse,
+          boolean keepAll, int rollMax, boolean confirmDelete)
+  {
+    this.suffix = suffix;
+    this.digits = digits;
+    this.reverse = reverse;
+    this.keepAll = keepAll;
+    this.rollMax = rollMax;
+    this.confirmDelete = confirmDelete;
+  }
+}
+
+class BackupFilesPresetsComboBoxRenderer extends DefaultListCellRenderer
+{
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 88L;
+
+  @Override
+  public Component getListCellRendererComponent(JList<?> list, Object value,
+          int index, boolean isSelected, boolean cellHasFocus)
+  {
+    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+    
+    try {
+      IntKeyStringValueEntry e = (IntKeyStringValueEntry) value;
+      if (e.getKey() == GPreferences.BACKUPFILESSCHEMECUSTOMISE)
+      {
+        // "Customise" item
+        this.setFont(this.getFont().deriveFont(Font.BOLD));
+      }
+    } catch (Exception e) {
+      return this;
+    }
+
+    return this;
+  }
+}