JAL-2629 refactoring of Hmmer preferences
[jalview.git] / src / jalview / gui / Preferences.java
index ed86eab..b0fd215 100755 (executable)
@@ -22,14 +22,9 @@ package jalview.gui;
 
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.bin.Cache;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.HiddenMarkovModel;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceI;
 import jalview.gui.Help.HelpId;
 import jalview.gui.StructureViewer.ViewerType;
-import jalview.hmmer.HMMBuildThread;
+import jalview.hmmer.HmmerCommand;
 import jalview.io.FileFormatI;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -54,11 +49,12 @@ import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
 import java.awt.event.MouseEvent;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Scanner;
 
 import javax.help.HelpSetException;
 import javax.swing.JColorChooser;
@@ -214,28 +210,32 @@ public class Preferences extends GPreferences
     /*
      * Set HMMER tab defaults
      */
-    trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
-    isHMMERInstalled
-            .setSelected(Cache.getDefault("HMMER_INSTALLED", false));
+    hmmrTrimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
     if (Cache.getDefault("USE_UNIPROT", false))
     {
-      uniprot.setSelected(true);
+      hmmerBackgroundUniprot.setSelected(true);
     }
     else
     {
-      alignment.setSelected(true);
+      hmmerBackgroundAlignment.setSelected(true);
     }
-    numberOfSequencesToKeepField
+    hmmerSequenceCount
             .setText(Cache.getProperty("SEQUENCES_TO_KEEP"));
-    installationLocation.setEnabled(isHMMERInstalled.isSelected());
-    hmmerPath.setEnabled(isHMMERInstalled.isSelected());
     hmmerPath.setText(Cache.getProperty(HMMER_PATH));
     hmmerPath.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        validateHMMERPath();
+        validateHMMERPath(true);
+      }
+    });
+    hmmerPath.addFocusListener(new FocusAdapter()
+    {
+      @Override
+      public void focusLost(FocusEvent e)
+      {
+        validateHMMERPath(true);
       }
     });
 
@@ -682,39 +682,32 @@ public class Preferences extends GPreferences
      * Save HMMER settings
      */
     Cache.applicationProperties.setProperty("TRIM_TERMINI",
-            Boolean.toString(trimTermini.isSelected()));
+            Boolean.toString(hmmrTrimTermini.isSelected()));
     Cache.applicationProperties.setProperty("USE_UNIPROT",
-            Boolean.toString(uniprot.isSelected()));
+            Boolean.toString(hmmerBackgroundUniprot.isSelected()));
     Cache.applicationProperties.setProperty("SEQUENCES_TO_KEEP",
-            numberOfSequencesToKeepField.getText());
+            hmmerSequenceCount.getText());
     Cache.applicationProperties.setProperty(HMMER_PATH,
             hmmerPath.getText());
-    boolean hmmerInstalled = isHMMERInstalled.isSelected();
-    Cache.applicationProperties.setProperty("HMMER_INSTALLED",
-            Boolean.toString(hmmerInstalled));
-    boolean hmmerFunctioning = validateHMMERPath(false);
-    Cache.applicationProperties.setProperty("HMMER_FUNCTIONING",
-            Boolean.toString(hmmerFunctioning));
     AlignFrame[] frames = Desktop.getAlignFrames();
-    boolean hmmerStatus = hmmerFunctioning && hmmerInstalled ? true : false;
     if (frames != null && frames.length > 0)
     {
-      for (AlignFrame frame : frames)
+      for (AlignFrame f : frames)
       {
-        frame.updateHMMERStatus(hmmerStatus);
+        f.updateHMMERStatus();
       }
     }
     
-    trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
+    hmmrTrimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
     if (Cache.getDefault("USE_UNIPROT", false))
     {
-      uniprot.setSelected(true);
+      hmmerBackgroundUniprot.setSelected(true);
     }
     else
     {
-      alignment.setSelected(true);
+      hmmerBackgroundAlignment.setSelected(true);
     }
-    numberOfSequencesToKeepField
+    hmmerSequenceCount
             .setText(Cache.getProperty("SEQUENCES_TO_KEEP"));
     hmmerPath.setText(Cache.getProperty(HMMER_PATH));
 
@@ -875,14 +868,6 @@ public class Preferences extends GPreferences
       structureTab.requestFocusInWindow();
       return false;
     }
-    if (isHMMERInstalled.isSelected())
-    {
-      if (!validateHMMER())
-      {
-        hmmerTab.requestFocusInWindow();
-        return false;
-      }
-    }
     return true;
   }
 
@@ -893,13 +878,6 @@ public class Preferences extends GPreferences
 
   }
 
-  @Override
-  protected boolean validateHMMER()
-  {
-    return validateHMMERPath();
-
-  }
-
   /**
    * DOCUMENT ME!
    */
@@ -1194,94 +1172,27 @@ public class Preferences extends GPreferences
   }
   
   /**
-   * Returns true if hmmer path contains the necessary valid executables, else
-   * show an error dialog (if showing dialog).
+   * Returns true if hmmer path is to a folder that contains an executable
+   * hmmbuild or hmmbuild.exe, else false (optionally after showing a warning
+   * dialog)
    */
-  private boolean validateHMMERPath(boolean showDialog)
+  @Override
+  protected boolean validateHMMERPath(boolean showWarning)
   {
-    int missing = 0;
-    String message = "";
     String folder = hmmerPath.getText().trim();
-    if (folder.length() > 0)
-    {
-      File f = new File(folder);
-      if (!f.exists())
-      {
-        if (showDialog)
-        {
-          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
-                MessageManager.getString("label.folder_not_exists"),
-                MessageManager.getString("label.invalid_folder"),
-                JvOptionPane.ERROR_MESSAGE);
-        }
-        return false;
-      }
-      AlignmentI alignment = new Alignment(
-              new SequenceI[]
-      { new Sequence("test", "WLWL", 0, 3) });
-      if (canExecute(folder + "/hmmbuild"))
-        {
-        validateHMMBuild(alignment);
-        }
-      else
-      {
-        message += MessageManager.getString("label.hmmbuild_not_found")
-                + "\n";
-        missing++;
-      }
-
-
-      if (canExecute(folder + "/hmmalign"))
-        {
-
-        }
-      else
-      {
-        message += MessageManager.getString("label.hmmalign_not_found")
-                + "\n";
-        missing++;
-      }
 
-
-      if (canExecute(folder + "/hmmsearch"))
-        {
-
-        }
-      else
-      {
-        message += MessageManager.getString("label.hmmsearch_not_found")
-                + "\n";
-        missing++;
-      }
-      }
-
-      if (missing > 0)
-      {
-        if (missing < 3)
-        {
-          if (showDialog)
-          {
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
-                  MessageManager.getString("label.invalid_folder"),
-                  JvOptionPane.ERROR_MESSAGE);
-          }
-          return false;
-        }
-        else
-        {
-          if (showDialog)
-          {
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop,
-                  MessageManager.getString("label.no_binaries"),
-                  MessageManager.getString("label.invalid_folder"),
-                  JvOptionPane.ERROR_MESSAGE);
-          }
-
-          return false;
-        }
-      }
-
-    return true;
+    if (HmmerCommand.getExecutable(HmmerCommand.HMMBUILD, folder) != null)
+    {
+      return true;
+    }
+    if (showWarning && folder.length() > 0)
+    {
+      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+              MessageManager.getString("label.hmmbuild_not_found"),
+              MessageManager.getString("label.invalid_folder"),
+              JvOptionPane.ERROR_MESSAGE);
+    }
+    return false;
   }
 
   /**
@@ -1308,57 +1219,6 @@ public class Preferences extends GPreferences
   }
 
   /**
-   * Runs hmmbuild to check if it is working. While doing this it parses the
-   * version of HMMER.
-   * 
-   * @param frame
-   * @return
-   */
-  public boolean validateHMMBuild(AlignmentI alignment)
-  {
-    HMMBuildThread hmmbuild = new HMMBuildThread(alignment);
-    hmmbuild.hmmbuildWaitTillComplete();
-    SequenceI hmmSeq = alignment.getSequenceAt(0);
-    HiddenMarkovModel hmm;
-    if (hmmSeq.isHMMConsensusSequence() && hmmSeq.getHMM() != null)
-    {
-      hmm = hmmSeq.getHMM();
-
-      if (hmm.getNumberOfSymbols() < 1)
-      {
-        return false;
-      }
-    }
-    else
-    {
-      return false;
-    }
-
-    String header = hmm.getFileHeader();
-    if (header == null)
-    {
-      return false;
-    }
-    else
-    {
-      Scanner scanner = new Scanner(header);
-      scanner.next();
-      String string = scanner.next();
-      String version = string.substring(1);
-      Cache.setProperty("HMMER_VERSION", version);
-      scanner.close();
-
-    }
-    return true;
-  }
-
-
-  private boolean validateHMMERPath()
-  {
-    return validateHMMERPath(true);
-  }
-
-  /**
    * If Chimera is selected, check it can be found on default or user-specified
    * path, if not show a warning/help dialog.
    */