JAL-2937 Cygwin path preference, method refactoring
[jalview.git] / src / jalview / jbgui / GPreferences.java
index 289434a..6ff335e 100755 (executable)
@@ -26,6 +26,7 @@ import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.gui.JvSwingUtils;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
@@ -40,7 +41,6 @@ import java.awt.Insets;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -82,8 +82,8 @@ public class GPreferences extends JPanel
 {
   private static final Font LABEL_FONT = JvSwingUtils.getLabelFont();
 
-  private static final Font LABEL_FONT_ITALIC = JvSwingUtils.getLabelFont(
-          false, true);
+  private static final Font LABEL_FONT_ITALIC = JvSwingUtils
+          .getLabelFont(false, true);
 
   /*
    * Visual tab components
@@ -187,6 +187,19 @@ public class GPreferences extends JPanel
   protected JComboBox<String> nucColour = new JComboBox<>();
 
   /*
+   * Overview tab components
+   */
+  protected JPanel gapColour = new JPanel();
+
+  protected JPanel hiddenColour = new JPanel();
+
+  protected JCheckBox useLegacyGap;
+
+  protected JCheckBox showHiddenAtStart;
+
+  protected JLabel gapLabel;
+
+  /*
    * Connections tab components
    */
   protected JTable linkUrlTable = new JTable();
@@ -262,27 +275,17 @@ public class GPreferences extends JPanel
    */
   protected JPanel hmmerTab = new JPanel();
 
-  protected JCheckBox trimTermini = new JCheckBox();
-
-  protected ButtonGroup backgroundFreqSource = new ButtonGroup();
-
-  protected AbstractButton uniprot = new JCheckBox();
-
-  protected AbstractButton alignment = new JCheckBox();
+  protected JCheckBox hmmrTrimTermini = new JCheckBox();
 
-  protected JLabel sequencesToKeep = new JLabel();
+  protected AbstractButton hmmerBackgroundUniprot = new JCheckBox();
 
-  protected JTextField numberOfSequencesToKeepField = new JTextField();
+  protected AbstractButton hmmerBackgroundAlignment = new JCheckBox();
 
-  protected JLabel installationLocation = new JLabel();
-
-  protected JCheckBox isHMMERInstalled = new JCheckBox();
+  protected JTextField hmmerSequenceCount = new JTextField();
 
   protected JTextField hmmerPath = new JTextField();
 
-  protected JLabel hmmsearch = new JLabel();
-
-  protected JLabel hmmalign = new JLabel();
+  protected JTextField cygwinPath = new JTextField();
 
   /*
    * DAS Settings tab
@@ -329,6 +332,9 @@ public class GPreferences extends JPanel
     tabbedPane.add(initColoursTab(),
             MessageManager.getString("label.colours"));
 
+    tabbedPane.add(initOverviewTab(),
+            MessageManager.getString("label.overview"));
+
     tabbedPane.add(initStructureTab(),
             MessageManager.getString("label.structure"));
 
@@ -360,7 +366,7 @@ public class GPreferences extends JPanel
 
     /*
      * Handler to validate a tab before leaving it - currently only for
-     * Structure.
+     * Structure
      */
     tabbedPane.addChangeListener(new ChangeListener()
     {
@@ -378,16 +384,6 @@ public class GPreferences extends JPanel
             return;
           }
         }
-        else if (lastTab == hmmerTab
-                && tabbedPane.getSelectedComponent() != hmmerTab
-                && isHMMERInstalled.isSelected())
-        {
-          if (!validateHMMER())
-          {
-            tabbedPane.setSelectedComponent(hmmerTab);
-          }
-          return;
-        }
         lastTab = tabbedPane.getSelectedComponent();
       }
 
@@ -404,18 +400,18 @@ public class GPreferences extends JPanel
     JPanel editingTab = new JPanel();
     editingTab.setLayout(null);
     autoCalculateConsCheck.setFont(LABEL_FONT);
-    autoCalculateConsCheck.setText(MessageManager
-            .getString("label.autocalculate_consensus"));
+    autoCalculateConsCheck.setText(
+            MessageManager.getString("label.autocalculate_consensus"));
     autoCalculateConsCheck.setBounds(new Rectangle(21, 52, 209, 23));
     padGaps.setFont(LABEL_FONT);
-    padGaps.setText(MessageManager.getString("label.pad_gaps_when_editing"));
+    padGaps.setText(
+            MessageManager.getString("label.pad_gaps_when_editing"));
     padGaps.setBounds(new Rectangle(22, 94, 168, 23));
     sortByTree.setFont(LABEL_FONT);
     sortByTree
             .setText(MessageManager.getString("label.sort_with_new_tree"));
-    sortByTree
-            .setToolTipText(MessageManager
-                    .getString("label.any_trees_calculated_or_loaded_alignment_automatically_sort"));
+    sortByTree.setToolTipText(MessageManager.getString(
+            "label.any_trees_calculated_or_loaded_alignment_automatically_sort"));
     sortByTree.setBounds(new Rectangle(22, 136, 168, 23));
     editingTab.add(autoCalculateConsCheck);
     editingTab.add(padGaps);
@@ -424,51 +420,26 @@ public class GPreferences extends JPanel
   }
 
   /**
-   * Initialises the hmmer tabbed panel.
+   * Initialises the hmmer tabbed panel
    * 
    * @return
    */
   private JPanel initHMMERTab()
   {
     hmmerTab.setLayout(null);
+    final int lineSpacing = 20;
 
-    hmmalign.setFont(LABEL_FONT);
-    hmmalign.setText(MessageManager.getString("label.hmmalign_label"));
-    hmmalign.setBounds(new Rectangle(22, 10, 200, 23));
-
-    trimTermini.setFont(LABEL_FONT);
-    trimTermini.setText(MessageManager.getString("label.trim_termini"));
-    trimTermini.setBounds(new Rectangle(22, 30, 200, 23));
-
-    hmmsearch.setFont(LABEL_FONT);
-    hmmsearch.setText(MessageManager.getString("label.hmmsearch_label"));
-    hmmsearch.setBounds(new Rectangle(250, 10, 200, 23));
-
-    sequencesToKeep.setFont(LABEL_FONT);
-    sequencesToKeep
-            .setText(MessageManager.getString("label.no_of_sequences"));
-    sequencesToKeep.setBounds(new Rectangle(250, 30, 125, 23));
-    numberOfSequencesToKeepField.setBounds(new Rectangle(375, 30, 40, 23));
-
-    isHMMERInstalled.setFont(LABEL_FONT);
-    isHMMERInstalled.setText(
-            MessageManager.getString("label.hmmer_installed"));
-    isHMMERInstalled.setBounds(new Rectangle(22, 180, 200, 23));
-    isHMMERInstalled.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        boolean status = isHMMERInstalled.isSelected();
-        installationLocation.setEnabled(status);
-        hmmerPath.setEnabled(status);
-      }
-    });
-    installationLocation.setFont(LABEL_FONT);
-    installationLocation.setText(
-            MessageManager.getString("label.change_hmmer_location"));
-    installationLocation.setBounds(new Rectangle(22, 200, 200, 23));
-    hmmerPath.setBounds(new Rectangle(22, 220, 200, 23));
+    /*
+     * path to hmmer binaries folder
+     */
+    JLabel hmmerLocation = new JLabel(
+            MessageManager.getString("label.hmmer_location"));
+    hmmerLocation.setFont(LABEL_FONT);
+    int xPos = 22;
+    int yPos = 10;
+    hmmerLocation.setBounds(new Rectangle(xPos, yPos, 250, 23));
+    yPos += lineSpacing;
+    hmmerPath.setBounds(new Rectangle(xPos, yPos, 300, 23));
     hmmerPath.addMouseListener(new MouseAdapter()
     {
       @Override
@@ -480,34 +451,96 @@ public class GPreferences extends JPanel
           if (chosen != null)
           {
             hmmerPath.setText(chosen);
+            validateHmmerPath();
           }
         }
       }
     });
+    hmmerTab.add(hmmerLocation);
+    hmmerTab.add(hmmerPath);
+
+    /*
+     * path to Cygwin binaries folder (for Windows)
+     */
+    if (Platform.isWindows())
+    {
+      JLabel cygwinLocation = new JLabel(
+              MessageManager.getString("label.cygwin_location"));
+      cygwinLocation.setFont(LABEL_FONT);
+      yPos += lineSpacing * 2;
+      cygwinLocation.setBounds(new Rectangle(xPos, yPos, 250, 23));
+      yPos += lineSpacing;
+      cygwinPath.setBounds(new Rectangle(xPos, yPos, 300, 23));
+      cygwinPath.addMouseListener(new MouseAdapter()
+      {
+        @Override
+        public void mouseClicked(MouseEvent e)
+        {
+          if (e.getClickCount() == 2)
+          {
+            String chosen = openFileChooser(true);
+            if (chosen != null)
+            {
+              cygwinPath.setText(chosen);
+              validateCygwinPath();
+            }
+          }
+        }
+      });
+      hmmerTab.add(cygwinLocation);
+      hmmerTab.add(cygwinPath);
+    }
 
-    backgroundFreqSource.add(uniprot);
-    backgroundFreqSource.add(alignment);
-    backgroundFreqSource.setSelected(uniprot.getModel(), true);
+    /*
+     * preferences for hmmalign
+     */
+    yPos += lineSpacing * 2;
+    JPanel alignOptions = new JPanel(new FlowLayout(FlowLayout.LEFT));
+    JvSwingUtils.createTitledBorder(alignOptions,
+            MessageManager.getString("label.hmmalign_label"), true);
+    yPos += lineSpacing;
+    hmmrTrimTermini.setFont(LABEL_FONT);
+    hmmrTrimTermini.setText(MessageManager.getString("label.trim_termini"));
+    alignOptions.add(hmmrTrimTermini);
+    hmmerTab.add(alignOptions);
+    alignOptions.setBounds(new Rectangle(xPos, yPos, 300, 43));
+
+    /*
+     * preferences for hmmsearch
+     */
+    yPos += lineSpacing * 3;
+    JPanel searchOptions = new JPanel(new FlowLayout(FlowLayout.LEFT));
+    JvSwingUtils.createTitledBorder(searchOptions,
+            MessageManager.getString("label.hmmsearch_label"), true);
+    searchOptions.setBounds(new Rectangle(xPos, yPos, 300, 43));
+    JLabel sequencesToKeep = new JLabel(
+            MessageManager.getString("label.no_of_sequences"));
+    sequencesToKeep.setFont(LABEL_FONT);
+    // hmmerSequenceCount.setBounds(new Rectangle(xPos + 250, yPos, 60, 23));
+    searchOptions.add(sequencesToKeep);
+    searchOptions.add(hmmerSequenceCount);
+    hmmerTab.add(searchOptions);
 
-    uniprot.setText(MessageManager.getString("label.freq_uniprot"));
-    uniprot.setFont(LABEL_FONT);
-    uniprot.setBounds(new Rectangle(22, 260, 255, 23));
+    ButtonGroup backgroundFreqSource = new ButtonGroup();
+    backgroundFreqSource.add(hmmerBackgroundUniprot);
+    backgroundFreqSource.add(hmmerBackgroundAlignment);
+    backgroundFreqSource.setSelected(hmmerBackgroundUniprot.getModel(), true);
 
-    alignment.setText(MessageManager.getString("label.freq_alignment"));
-    alignment.setFont(LABEL_FONT);
-    alignment.setBounds(new Rectangle(22, 280, 255, 23));
+    /*
+     * preferences for Information Content annotation
+     */
+    yPos += lineSpacing * 3;
+    hmmerBackgroundUniprot.setText(MessageManager.getString("label.freq_uniprot"));
+    hmmerBackgroundUniprot.setFont(LABEL_FONT);
+    hmmerBackgroundUniprot.setBounds(new Rectangle(xPos, yPos, 255, 23));
 
-    hmmerTab.add(uniprot);
-    hmmerTab.add(alignment);
-    hmmerTab.add(hmmalign);
-    hmmerTab.add(hmmsearch);
-    hmmerTab.add(installationLocation);
-    hmmerTab.add(hmmerPath);
-    hmmerTab.add(trimTermini);
-    hmmerTab.add(sequencesToKeep);
-    hmmerTab.add(sequencesToKeep);
-    hmmerTab.add(numberOfSequencesToKeepField);
-    hmmerTab.add(isHMMERInstalled);
+    yPos += lineSpacing;
+    hmmerBackgroundAlignment.setText(MessageManager.getString("label.freq_alignment"));
+    hmmerBackgroundAlignment.setFont(LABEL_FONT);
+    hmmerBackgroundAlignment.setBounds(new Rectangle(xPos, yPos, 300, 23));
+
+    hmmerTab.add(hmmerBackgroundUniprot);
+    hmmerTab.add(hmmerBackgroundAlignment);
 
     return hmmerTab;
   }
@@ -564,11 +597,10 @@ public class GPreferences extends JPanel
     pirjv.setFont(LABEL_FONT);
     pirjv.setHorizontalAlignment(SwingConstants.LEFT);
     autoIdWidth.setFont(LABEL_FONT);
-    autoIdWidth.setText(MessageManager
-            .getString("label.automatically_set_id_width"));
-    autoIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true,
-            MessageManager
-                    .getString("label.adjusts_width_generated_eps_png")));
+    autoIdWidth.setText(
+            MessageManager.getString("label.automatically_set_id_width"));
+    autoIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager
+            .getString("label.adjusts_width_generated_eps_png")));
     autoIdWidth.setBounds(new Rectangle(228, 96, 188, 23));
     autoIdWidth.addActionListener(new ActionListener()
     {
@@ -580,14 +612,13 @@ public class GPreferences extends JPanel
       }
     });
     userIdWidthlabel.setFont(LABEL_FONT);
-    userIdWidthlabel.setText(MessageManager
-            .getString("label.figure_id_column_width"));
-    userIdWidth
-            .setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager
-                    .getString("label.manually_specify_width_left_column")));
-    userIdWidthlabel
-            .setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager
-                    .getString("label.manually_specify_width_left_column")));
+    userIdWidthlabel.setText(
+            MessageManager.getString("label.figure_id_column_width"));
+    userIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager
+            .getString("label.manually_specify_width_left_column")));
+    userIdWidthlabel.setToolTipText(
+            JvSwingUtils.wrapTooltip(true, MessageManager.getString(
+                    "label.manually_specify_width_left_column")));
     userIdWidthlabel.setBounds(new Rectangle(236, 120, 168, 23));
     userIdWidth.setFont(JvSwingUtils.getTextAreaFont());
     userIdWidth.setText("");
@@ -602,8 +633,8 @@ public class GPreferences extends JPanel
       }
     });
     modellerOutput.setFont(LABEL_FONT);
-    modellerOutput.setText(MessageManager
-            .getString("label.use_modeller_output"));
+    modellerOutput
+            .setText(MessageManager.getString("label.use_modeller_output"));
     modellerOutput.setBounds(new Rectangle(228, 226, 168, 23));
     embbedBioJSON.setFont(LABEL_FONT);
     embbedBioJSON.setText(MessageManager.getString("label.embbed_biojson"));
@@ -642,8 +673,8 @@ public class GPreferences extends JPanel
     JLabel browserLabel = new JLabel();
     browserLabel.setFont(LABEL_FONT);
     browserLabel.setHorizontalAlignment(SwingConstants.TRAILING);
-    browserLabel.setText(MessageManager
-            .getString("label.default_browser_unix"));
+    browserLabel.setText(
+            MessageManager.getString("label.default_browser_unix"));
     defaultBrowser.setFont(LABEL_FONT);
     defaultBrowser.setText("");
 
@@ -663,9 +694,10 @@ public class GPreferences extends JPanel
     initConnTabCheckboxes();
 
     // Add default Browser text box
-    connectTab.add(browserLabel, new GridBagConstraints(0, 0, 1, 1, 0.0,
-            0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
-            new Insets(10, 0, 5, 5), 5, 1));
+    connectTab.add(browserLabel,
+            new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.NONE,
+                    new Insets(10, 0, 5, 5), 5, 1));
     defaultBrowser.setFont(LABEL_FONT);
     defaultBrowser.setText("");
 
@@ -679,21 +711,25 @@ public class GPreferences extends JPanel
             new Insets(10, 0, 5, 12), 4, 10));
 
     // Add usage stats, version check and questionnaire checkboxes
-    connectTab.add(usagestats, new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0,
-            GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
-            new Insets(0, 2, 5, 5), 70, 1));
-    connectTab.add(questionnaire, new GridBagConstraints(1, 2, 1, 1, 1.0,
-            0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
-            new Insets(0, 2, 5, 10), 70, 1));
-    connectTab.add(versioncheck, new GridBagConstraints(0, 3, 1, 1, 1.0,
-            0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
-            new Insets(0, 2, 5, 5), 70, 1));
+    connectTab.add(usagestats,
+            new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
+                    new Insets(0, 2, 5, 5), 70, 1));
+    connectTab.add(questionnaire,
+            new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
+                    new Insets(0, 2, 5, 10), 70, 1));
+    connectTab.add(versioncheck,
+            new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
+                    new Insets(0, 2, 5, 5), 70, 1));
 
     // Add padding so the panel doesn't look ridiculous
     JPanel spacePanel = new JPanel();
-    connectTab.add(spacePanel, new GridBagConstraints(0, 4, 1, 1, 1.0, 1.0,
-            GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,
-                    0, 0, 5), 70, 1));
+    connectTab.add(spacePanel,
+            new GridBagConstraints(0, 4, 1, 1, 1.0, 1.0,
+                    GridBagConstraints.WEST, GridBagConstraints.BOTH,
+                    new Insets(0, 0, 0, 5), 70, 1));
 
     return connectTab;
   }
@@ -726,8 +762,8 @@ public class GPreferences extends JPanel
 
     // Panel for links functionality
     JPanel linkPanel = new JPanel(new GridBagLayout());
-    linkPanel.setBorder(new TitledBorder(MessageManager
-            .getString("label.url_linkfrom_sequence_id")));
+    linkPanel.setBorder(new TitledBorder(
+            MessageManager.getString("label.url_linkfrom_sequence_id")));
 
     // Put the Url links panel together
 
@@ -826,7 +862,7 @@ public class GPreferences extends JPanel
     // no current selection, so initially disable delete/edit buttons
     editLink.setEnabled(false);
     deleteLink.setEnabled(false);
-    
+
     newLink.addActionListener(new java.awt.event.ActionListener()
     {
       @Override
@@ -929,21 +965,26 @@ public class GPreferences extends JPanel
             MessageManager.getString("label.proxy_server"));
     proxyPanel.setBorder(titledBorder1);
     proxyPanel.setLayout(new GridBagLayout());
-    proxyPanel.add(serverLabel, new GridBagConstraints(0, 1, 1, 1, 0.0,
-            0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
-            new Insets(0, 2, 2, 0), 5, 0));
-    proxyPanel.add(portLabel, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0,
-            GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,
-                    0, 2, 0), 11, 0));
-    proxyPanel.add(useProxy, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0,
-            GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,
-                    2, 5, 185), 2, -4));
-    proxyPanel.add(proxyPortTB, new GridBagConstraints(3, 1, 1, 1, 1.0,
-            0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
-            new Insets(0, 2, 2, 2), 54, 1));
-    proxyPanel.add(proxyServerTB, new GridBagConstraints(1, 1, 1, 1, 1.0,
-            0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
-            new Insets(0, 2, 2, 0), 263, 1));
+    proxyPanel.add(serverLabel,
+            new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.NONE,
+                    new Insets(0, 2, 2, 0), 5, 0));
+    proxyPanel.add(portLabel,
+            new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.NONE,
+                    new Insets(0, 0, 2, 0), 11, 0));
+    proxyPanel.add(useProxy,
+            new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.NONE,
+                    new Insets(0, 2, 5, 185), 2, -4));
+    proxyPanel.add(proxyPortTB,
+            new GridBagConstraints(3, 1, 1, 1, 1.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
+                    new Insets(0, 2, 2, 2), 54, 1));
+    proxyPanel.add(proxyServerTB,
+            new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0,
+                    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
+                    new Insets(0, 2, 2, 0), 263, 1));
 
     return proxyPanel;
   }
@@ -954,22 +995,22 @@ public class GPreferences extends JPanel
   private void initConnTabCheckboxes()
   {
     // Usage stats checkbox label
-    usagestats.setText(MessageManager
-            .getString("label.send_usage_statistics"));
+    usagestats.setText(
+            MessageManager.getString("label.send_usage_statistics"));
     usagestats.setFont(LABEL_FONT);
     usagestats.setHorizontalAlignment(SwingConstants.RIGHT);
     usagestats.setHorizontalTextPosition(SwingConstants.LEADING);
 
     // Questionnaire checkbox label
-    questionnaire.setText(MessageManager
-            .getString("label.check_for_questionnaires"));
+    questionnaire.setText(
+            MessageManager.getString("label.check_for_questionnaires"));
     questionnaire.setFont(LABEL_FONT);
     questionnaire.setHorizontalAlignment(SwingConstants.RIGHT);
     questionnaire.setHorizontalTextPosition(SwingConstants.LEADING);
 
     // Check for latest version checkbox label
-    versioncheck.setText(MessageManager
-            .getString("label.check_for_latest_version"));
+    versioncheck.setText(
+            MessageManager.getString("label.check_for_latest_version"));
     versioncheck.setFont(LABEL_FONT);
     versioncheck.setHorizontalAlignment(SwingConstants.RIGHT);
     versioncheck.setHorizontalTextPosition(SwingConstants.LEADING);
@@ -1016,8 +1057,8 @@ public class GPreferences extends JPanel
   private JPanel initColoursTab()
   {
     JPanel coloursTab = new JPanel();
-    coloursTab.setBorder(new TitledBorder(MessageManager
-            .getString("action.open_new_alignment")));
+    coloursTab.setBorder(new TitledBorder(
+            MessageManager.getString("action.open_new_alignment")));
     coloursTab.setLayout(new FlowLayout());
     JLabel mincolourLabel = new JLabel();
     mincolourLabel.setFont(LABEL_FONT);
@@ -1055,10 +1096,11 @@ public class GPreferences extends JPanel
     JLabel protColourLabel = new JLabel();
     protColourLabel.setFont(LABEL_FONT);
     protColourLabel.setHorizontalAlignment(SwingConstants.LEFT);
-    protColourLabel.setText(MessageManager
-            .getString("label.prot_alignment_colour") + " ");
-    JvSwingUtils.addtoLayout(coloursTab, MessageManager
-            .getString("label.default_colour_scheme_for_alignment"),
+    protColourLabel.setText(
+            MessageManager.getString("label.prot_alignment_colour") + " ");
+    JvSwingUtils.addtoLayout(coloursTab,
+            MessageManager
+                    .getString("label.default_colour_scheme_for_alignment"),
             protColourLabel, protColour);
 
     nucColour.setFont(LABEL_FONT);
@@ -1066,27 +1108,175 @@ public class GPreferences extends JPanel
     JLabel nucColourLabel = new JLabel();
     nucColourLabel.setFont(LABEL_FONT);
     nucColourLabel.setHorizontalAlignment(SwingConstants.LEFT);
-    nucColourLabel.setText(MessageManager
-            .getString("label.nuc_alignment_colour") + " ");
-    JvSwingUtils.addtoLayout(coloursTab, MessageManager
-            .getString("label.default_colour_scheme_for_alignment"),
+    nucColourLabel.setText(
+            MessageManager.getString("label.nuc_alignment_colour") + " ");
+    JvSwingUtils.addtoLayout(coloursTab,
+            MessageManager
+                    .getString("label.default_colour_scheme_for_alignment"),
             nucColourLabel, nucColour);
 
     JPanel annotationShding = new JPanel();
-    annotationShding.setBorder(new TitledBorder(MessageManager
-            .getString("label.annotation_shading_default")));
+    annotationShding.setBorder(new TitledBorder(
+            MessageManager.getString("label.annotation_shading_default")));
     annotationShding.setLayout(new GridLayout(1, 2));
-    JvSwingUtils.addtoLayout(annotationShding, MessageManager
-            .getString("label.default_minimum_colour_annotation_shading"),
+    JvSwingUtils.addtoLayout(annotationShding,
+            MessageManager.getString(
+                    "label.default_minimum_colour_annotation_shading"),
             mincolourLabel, minColour);
-    JvSwingUtils.addtoLayout(annotationShding, MessageManager
-            .getString("label.default_maximum_colour_annotation_shading"),
+    JvSwingUtils.addtoLayout(annotationShding,
+            MessageManager.getString(
+                    "label.default_maximum_colour_annotation_shading"),
             maxcolourLabel, maxColour);
     coloursTab.add(annotationShding); // , FlowLayout.LEFT);
     return coloursTab;
   }
 
   /**
+   * Initialises the Overview tabbed panel.
+   * 
+   * @return
+   */
+  private JPanel initOverviewTab()
+  {
+    JPanel overviewPanel = new JPanel();
+    overviewPanel.setBorder(new TitledBorder(
+            MessageManager.getString("label.overview_settings")));
+
+    gapColour.setFont(LABEL_FONT);
+    // fixing the border colours stops apparent colour bleed from the panel
+    gapColour.setBorder(
+            BorderFactory.createEtchedBorder(Color.white, Color.lightGray));
+    gapColour.setPreferredSize(new Dimension(40, 20));
+    gapColour.addMouseListener(new MouseAdapter()
+    {
+      @Override
+      public void mousePressed(MouseEvent e)
+      {
+        gapColour_actionPerformed(gapColour);
+      }
+    });
+
+    hiddenColour.setFont(LABEL_FONT);
+    // fixing the border colours stops apparent colour bleed from the panel
+    hiddenColour.setBorder(
+            BorderFactory.createEtchedBorder(Color.white, Color.lightGray));
+    hiddenColour.setPreferredSize(new Dimension(40, 20));
+    hiddenColour.addMouseListener(new MouseAdapter()
+    {
+      @Override
+      public void mousePressed(MouseEvent e)
+      {
+        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.setFont(LABEL_FONT);
+    gapLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    gapLabel.setVerticalTextPosition(SwingConstants.TOP);
+    showHiddenAtStart = new JCheckBox(
+            MessageManager.getString("label.ov_show_hide_default"));
+    showHiddenAtStart.setFont(LABEL_FONT);
+    showHiddenAtStart.setHorizontalAlignment(SwingConstants.LEFT);
+    showHiddenAtStart.setVerticalTextPosition(SwingConstants.TOP);
+    JLabel hiddenLabel = new JLabel(
+            MessageManager.getString("label.hidden_colour"));
+    hiddenLabel.setFont(LABEL_FONT);
+    hiddenLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    hiddenLabel.setVerticalTextPosition(SwingConstants.TOP);
+
+    useLegacyGap.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        useLegacyGaps_actionPerformed(e);
+      }
+    });
+
+    overviewPanel.setLayout(new GridBagLayout());
+    GridBagConstraints c1 = new GridBagConstraints();
+
+    c1.fill = GridBagConstraints.HORIZONTAL;
+    c1.gridx = 0;
+    c1.gridy = 0;
+    c1.weightx = 1;
+    c1.ipady = 20;
+    c1.anchor = GridBagConstraints.FIRST_LINE_START;
+    overviewPanel.add(useLegacyGap, c1);
+
+    GridBagConstraints c2 = new GridBagConstraints();
+    c2.fill = GridBagConstraints.HORIZONTAL;
+    c2.gridx = 1;
+    c2.gridy = 0;
+    c2.insets = new Insets(0, 15, 0, 10);
+    overviewPanel.add(gapLabel, c2);
+
+    GridBagConstraints c3 = new GridBagConstraints();
+    c3.fill = GridBagConstraints.HORIZONTAL;
+    c3.gridx = 2;
+    c3.gridy = 0;
+    c3.insets = new Insets(0, 0, 0, 15);
+    overviewPanel.add(gapColour, c3);
+
+    GridBagConstraints c4 = new GridBagConstraints();
+    c4.fill = GridBagConstraints.HORIZONTAL;
+    c4.gridx = 0;
+    c4.gridy = 1;
+    c4.weightx = 1;
+    overviewPanel.add(showHiddenAtStart, c4);
+
+    GridBagConstraints c5 = new GridBagConstraints();
+    c5.fill = GridBagConstraints.HORIZONTAL;
+    c5.gridx = 1;
+    c5.gridy = 1;
+    c5.insets = new Insets(0, 15, 0, 10);
+    overviewPanel.add(hiddenLabel, c5);
+
+    GridBagConstraints c6 = new GridBagConstraints();
+    c6.fill = GridBagConstraints.HORIZONTAL;
+    c6.gridx = 2;
+    c6.gridy = 1;
+    c6.insets = new Insets(0, 0, 0, 15);
+    overviewPanel.add(hiddenColour, c6);
+
+    JButton resetButton = new JButton(
+            MessageManager.getString("label.reset_to_defaults"));
+
+    resetButton.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        resetOvDefaults_actionPerformed(e);
+      }
+    });
+
+    GridBagConstraints c7 = new GridBagConstraints();
+    c7.fill = GridBagConstraints.NONE;
+    c7.gridx = 0;
+    c7.gridy = 2;
+    c7.insets = new Insets(10, 0, 0, 0);
+    c7.anchor = GridBagConstraints.WEST;
+    overviewPanel.add(resetButton, c7);
+
+    // Add padding so the panel doesn't look ridiculous
+    JPanel spacePanel = new JPanel();
+    overviewPanel.add(spacePanel,
+            new GridBagConstraints(0, 3, 1, 1, 1.0, 1.0,
+                    GridBagConstraints.WEST, GridBagConstraints.BOTH,
+                    new Insets(0, 0, 0, 5), 0, 0));
+
+    return overviewPanel;
+  }
+
+  /**
    * Initialises the Structure tabbed panel.
    * 
    * @return
@@ -1095,8 +1285,8 @@ public class GPreferences extends JPanel
   {
     structureTab = new JPanel();
 
-    structureTab.setBorder(new TitledBorder(MessageManager
-            .getString("label.structure_options")));
+    structureTab.setBorder(new TitledBorder(
+            MessageManager.getString("label.structure_options")));
     structureTab.setLayout(null);
     final int width = 400;
     final int height = 22;
@@ -1130,8 +1320,8 @@ public class GPreferences extends JPanel
 
     ypos += lineSpacing;
     addSecondaryStructure.setFont(LABEL_FONT);
-    addSecondaryStructure.setText(MessageManager
-            .getString("label.autoadd_secstr"));
+    addSecondaryStructure
+            .setText(MessageManager.getString("label.autoadd_secstr"));
     addSecondaryStructure.setBounds(new Rectangle(25, ypos, width, height));
     structureTab.add(addSecondaryStructure);
 
@@ -1158,8 +1348,8 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        structureViewer_actionPerformed((String) structViewer
-                .getSelectedItem());
+        structureViewer_actionPerformed(
+                (String) structViewer.getSelectedItem());
       }
     });
     structureTab.add(structViewer);
@@ -1250,8 +1440,8 @@ public class GPreferences extends JPanel
     }
 
     // chooser.setFileView(new JalviewFileView());
-    chooser.setDialogTitle(MessageManager
-            .getString("label.open_local_file"));
+    chooser.setDialogTitle(
+            MessageManager.getString("label.open_local_file"));
     chooser.setToolTipText(MessageManager.getString("action.open"));
 
     int value = chooser.showOpenDialog(this);
@@ -1263,46 +1453,11 @@ public class GPreferences extends JPanel
     return choice;
   }
 
-  /**
-   * Validate the structure tab preferences; if invalid, set focus on this tab.
-   * 
-   * @param e
-   */
-  protected boolean validateStructure(FocusEvent e)
-  {
-    if (!validateStructure())
-    {
-      e.getComponent().requestFocusInWindow();
-      return false;
-    }
-    return true;
-  }
-
-  /**
-   * Validate the hmmer tab preferences; if invalid, set focus on this tab.
-   * 
-   * @param e
-   */
-  protected boolean validateHMMER(FocusEvent e)
-  {
-    if (!validateHMMER())
-    {
-      e.getComponent().requestFocusInWindow();
-      return false;
-    }
-    return true;
-  }
-
   protected boolean validateStructure()
   {
     return false;
   }
 
-  protected boolean validateHMMER()
-  {
-    return false;
-  }
-
   /**
    * Initialises the Visual tabbed panel.
    * 
@@ -1311,8 +1466,8 @@ public class GPreferences extends JPanel
   private JPanel initVisualTab()
   {
     JPanel visualTab = new JPanel();
-    visualTab.setBorder(new TitledBorder(MessageManager
-            .getString("action.open_new_alignment")));
+    visualTab.setBorder(new TitledBorder(
+            MessageManager.getString("action.open_new_alignment")));
     visualTab.setLayout(null);
     fullScreen.setFont(LABEL_FONT);
     fullScreen.setHorizontalAlignment(SwingConstants.RIGHT);
@@ -1347,21 +1502,21 @@ public class GPreferences extends JPanel
     showGroupbits.setFont(LABEL_FONT);
     showGroupbits.setHorizontalAlignment(SwingConstants.RIGHT);
     showGroupbits.setHorizontalTextPosition(SwingConstants.LEFT);
-    showGroupbits.setText(MessageManager.getString("action.show_group")
-            + ":");
+    showGroupbits
+            .setText(MessageManager.getString("action.show_group") + ":");
     JLabel showConsensbits = new JLabel();
     showConsensbits.setFont(LABEL_FONT);
     showConsensbits.setHorizontalAlignment(SwingConstants.RIGHT);
     showConsensbits.setHorizontalTextPosition(SwingConstants.LEFT);
-    showConsensbits.setText(MessageManager.getString("label.consensus")
-            + ":");
+    showConsensbits
+            .setText(MessageManager.getString("label.consensus") + ":");
     showConsensHistogram.setEnabled(false);
     showConsensHistogram.setFont(LABEL_FONT);
     showConsensHistogram.setHorizontalAlignment(SwingConstants.RIGHT);
     showConsensHistogram.setHorizontalTextPosition(SwingConstants.LEFT);
     showConsensHistogram.setSelected(true);
-    showConsensHistogram.setText(MessageManager
-            .getString("label.histogram"));
+    showConsensHistogram
+            .setText(MessageManager.getString("label.histogram"));
     showConsensLogo.setEnabled(false);
     showConsensLogo.setFont(LABEL_FONT);
     showConsensLogo.setHorizontalAlignment(SwingConstants.RIGHT);
@@ -1379,22 +1534,22 @@ public class GPreferences extends JPanel
     showGroupConservation.setHorizontalAlignment(SwingConstants.RIGHT);
     showGroupConservation.setHorizontalTextPosition(SwingConstants.LEFT);
     showGroupConservation.setSelected(true);
-    showGroupConservation.setText(MessageManager
-            .getString("label.conservation"));
+    showGroupConservation
+            .setText(MessageManager.getString("label.conservation"));
     showNpTooltip.setEnabled(true);
     showNpTooltip.setFont(LABEL_FONT);
     showNpTooltip.setHorizontalAlignment(SwingConstants.RIGHT);
     showNpTooltip.setHorizontalTextPosition(SwingConstants.LEFT);
     showNpTooltip.setSelected(true);
-    showNpTooltip.setText(MessageManager
-            .getString("label.non_positional_features"));
+    showNpTooltip.setText(
+            MessageManager.getString("label.non_positional_features"));
     showDbRefTooltip.setEnabled(true);
     showDbRefTooltip.setFont(LABEL_FONT);
     showDbRefTooltip.setHorizontalAlignment(SwingConstants.RIGHT);
     showDbRefTooltip.setHorizontalTextPosition(SwingConstants.LEFT);
     showDbRefTooltip.setSelected(true);
-    showDbRefTooltip.setText(MessageManager
-            .getString("label.database_references"));
+    showDbRefTooltip
+            .setText(MessageManager.getString("label.database_references"));
     annotations.setFont(LABEL_FONT);
     annotations.setHorizontalAlignment(SwingConstants.RIGHT);
     annotations.setHorizontalTextPosition(SwingConstants.LEFT);
@@ -1429,8 +1584,8 @@ public class GPreferences extends JPanel
     showUnconserved.setHorizontalAlignment(SwingConstants.RIGHT);
     showUnconserved.setHorizontalTextPosition(SwingConstants.LEFT);
     showUnconserved.setSelected(true);
-    showUnconserved.setText(MessageManager
-            .getString("action.show_unconserved"));
+    showUnconserved
+            .setText(MessageManager.getString("action.show_unconserved"));
     showUnconserved.addActionListener(new ActionListener()
     {
       @Override
@@ -1468,10 +1623,10 @@ public class GPreferences extends JPanel
     scaleProteinToCdna.setFont(LABEL_FONT);
     scaleProteinToCdna.setHorizontalAlignment(SwingConstants.RIGHT);
     scaleProteinToCdna.setHorizontalTextPosition(SwingConstants.LEADING);
-    scaleProteinToCdna.setText(MessageManager
-            .getString("label.scale_protein_to_cdna"));
-    scaleProteinToCdna.setToolTipText(MessageManager
-            .getString("label.scale_protein_to_cdna_tip"));
+    scaleProteinToCdna.setText(
+            MessageManager.getString("label.scale_protein_to_cdna"));
+    scaleProteinToCdna.setToolTipText(
+            MessageManager.getString("label.scale_protein_to_cdna_tip"));
     JLabel gapLabel = new JLabel();
     gapLabel.setFont(LABEL_FONT);
     gapLabel.setHorizontalAlignment(SwingConstants.RIGHT);
@@ -1563,12 +1718,10 @@ public class GPreferences extends JPanel
     autoAnnotSettings.add(showConsensbits);
     autoAnnotSettings.add(showConsensHistogram);
     autoAnnotSettings.add(showConsensLogo);
-    
-    
 
     JPanel tooltipSettings = new JPanel();
-    tooltipSettings.setBorder(new TitledBorder(MessageManager
-            .getString("label.sequence_id_tooltip")));
+    tooltipSettings.setBorder(new TitledBorder(
+            MessageManager.getString("label.sequence_id_tooltip")));
     tooltipSettings.setBounds(173, 140, 220, 62);
     tooltipSettings.setLayout(new GridLayout(2, 1));
     tooltipSettings.add(showDbRefTooltip);
@@ -1587,11 +1740,11 @@ public class GPreferences extends JPanel
     idItalics.setFont(LABEL_FONT_ITALIC);
     idItalics.setHorizontalAlignment(SwingConstants.RIGHT);
     idItalics.setHorizontalTextPosition(SwingConstants.LEADING);
-    idItalics.setText(MessageManager
-            .getString("label.sequence_name_italics"));
+    idItalics.setText(
+            MessageManager.getString("label.sequence_name_italics"));
     openoverv.setFont(LABEL_FONT);
-    openoverv.setActionCommand(MessageManager
-            .getString("label.open_overview"));
+    openoverv.setActionCommand(
+            MessageManager.getString("label.open_overview"));
     openoverv.setHorizontalAlignment(SwingConstants.RIGHT);
     openoverv.setHorizontalTextPosition(SwingConstants.LEFT);
     openoverv.setText(MessageManager.getString("label.open_overview"));
@@ -1644,12 +1797,28 @@ public class GPreferences extends JPanel
   {
   }
 
+  protected void gapColour_actionPerformed(JPanel panel)
+  {
+  }
+
+  protected void hiddenColour_actionPerformed(JPanel panel)
+  {
+  }
+
   protected void showunconserved_actionPerformed(ActionEvent e)
   {
     // TODO Auto-generated method stub
 
   }
 
+  protected void useLegacyGaps_actionPerformed(ActionEvent e)
+  {
+  }
+
+  protected void resetOvDefaults_actionPerformed(ActionEvent e)
+  {
+  }
+
   /**
    * DOCUMENT ME!
    * 
@@ -1724,8 +1893,8 @@ public class GPreferences extends JPanel
   /**
    * Customer renderer for JTable: supports column of radio buttons
    */
-  public class RadioButtonRenderer extends JRadioButton implements
-          TableCellRenderer
+  public class RadioButtonRenderer extends JRadioButton
+          implements TableCellRenderer
   {
     public RadioButtonRenderer()
     {
@@ -1742,14 +1911,14 @@ public class GPreferences extends JPanel
 
       // set colours to match rest of table
       if (isSelected)
-       {
-         setBackground(table.getSelectionBackground());
-         setForeground(table.getSelectionForeground());
-       }
-       else
-       {
-         setBackground(table.getBackground());
-         setForeground(table.getForeground());
+      {
+        setBackground(table.getSelectionBackground());
+        setForeground(table.getSelectionForeground());
+      }
+      else
+      {
+        setBackground(table.getBackground());
+        setForeground(table.getForeground());
       }
       return this;
     }
@@ -1759,42 +1928,45 @@ public class GPreferences extends JPanel
    * Customer cell editor for JTable: supports column of radio buttons in
    * conjunction with renderer
    */
-  public class RadioButtonEditor extends AbstractCellEditor implements
-            TableCellEditor
-    {
-      private JRadioButton button = new JRadioButton();
+  public class RadioButtonEditor extends AbstractCellEditor
+          implements TableCellEditor
+  {
+    private JRadioButton button = new JRadioButton();
 
-      public RadioButtonEditor()
-      {
+    public RadioButtonEditor()
+    {
       button.setHorizontalAlignment(SwingConstants.CENTER);
       this.button.addActionListener(new ActionListener()
+      {
+        @Override
+        public void actionPerformed(ActionEvent e)
         {
-          @Override
-          public void actionPerformed(ActionEvent e)
-          {
-            fireEditingStopped();
-          }
-        });
-      }
+          fireEditingStopped();
+        }
+      });
+    }
 
-      @Override
-      public Component getTableCellEditorComponent(JTable table,
-              Object value, boolean isSelected, int row, int column)
-      {
+    @Override
+    public Component getTableCellEditorComponent(JTable table, Object value,
+            boolean isSelected, int row, int column)
+    {
       button.setSelected((boolean) value);
-        return button;
-      }
+      return button;
+    }
 
-      @Override
-      public Object getCellEditorValue()
-      {
+    @Override
+    public Object getCellEditorValue()
+    {
       return button.isSelected();
-      }
+    }
 
   }
 
-  public void hmmerPath_actionPerformed(ActionEvent e)
+  protected void validateHmmerPath()
   {
+  }
 
+  protected void validateCygwinPath()
+  {
   }
 }