Merge commit 'ab43013b7e357b84b4abade0dba949668dfb2a0e' into develop
[jalview.git] / src / jalview / analysis / Finder.java
index 3d1a70c..faf79d1 100644 (file)
@@ -1,26 +1,31 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
+ * Copyright (C) 2014 The Jalview Authors
  * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
  * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.analysis;
 
-import java.util.*;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
 
-import jalview.datamodel.*;
+import java.util.Vector;
 
 public class Finder
 {
@@ -37,6 +42,8 @@ public class Finder
 
   boolean caseSensitive = false;
 
+  private boolean includeDescription = false;
+
   boolean findAll = false;
 
   com.stevesoft.pat.Regex regex = null;
@@ -53,7 +60,9 @@ public class Finder
   }
 
   /**
-   * restart search at given sequence and residue on alignment and (optionally) contained in selection
+   * restart search at given sequence and residue on alignment and (optionally)
+   * contained in selection
+   * 
    * @param alignment
    * @param selectionGroup
    * @param seqIndex
@@ -81,31 +90,10 @@ public class Finder
     Sequence seq;
     String item = null;
     boolean found = false;
-
-    // //// is the searchString a residue number?
-    try
-    {
-      int res = Integer.parseInt(searchString);
-      found = true;
-      if (selection == null || selection.getSize() < 1)
-      {
-        seq = (Sequence) alignment.getSequenceAt(0);
-      }
-      else
-      {
-        seq = (Sequence) (selection.getSequenceAt(0));
-      }
-
-      searchResults.addResult(seq, res, res);
-      hasResults = true;
-    } catch (NumberFormatException ex)
-    {
-    }
+    int end = alignment.getHeight();
 
     // /////////////////////////////////////////////
 
-    int end = alignment.getHeight();
-
     if (selection != null)
     {
       if ((selection.getSize() < 1)
@@ -119,7 +107,7 @@ public class Finder
     {
       seq = (Sequence) alignment.getSequenceAt(seqIndex);
 
-      if ((selection != null && selection.getSize()>0)
+      if ((selection != null && selection.getSize() > 0)
               && !selection.getSequences(null).contains(seq))
       {
         seqIndex++;
@@ -127,8 +115,31 @@ public class Finder
 
         continue;
       }
-      if (resIndex<0) {
-        resIndex=0;
+      if (resIndex < 0)
+      {
+        resIndex = 0;
+        // test for one off matches - sequence position and sequence ID
+        // //// is the searchString a residue number?
+        try
+        {
+          int res = Integer.parseInt(searchString);
+          // possibly a residue number - check if valid for seq
+          if (seq.getEnd() >= res)
+          {
+            searchResults.addResult(seq, res, res);
+            hasResults = true;
+            // resIndex=seq.getLength();
+            // seqIndex++;
+            if (!findAll)
+            {
+              found = true;
+              break;
+            }
+          }
+        } catch (NumberFormatException ex)
+        {
+        }
+
         if (regex.search(seq.getName()))
         {
           idMatch.addElement(seq);
@@ -136,7 +147,20 @@ public class Finder
           if (!findAll)
           {
             // stop and return the match
-            found=true;
+            found = true;
+            break;
+          }
+        }
+
+        if (isIncludeDescription() && seq.getDescription() != null
+                && regex.search(seq.getDescription()))
+        {
+          idMatch.addElement(seq);
+          hasResults = true;
+          if (!findAll)
+          {
+            // stop and return the match
+            found = true;
             break;
           }
         }
@@ -176,13 +200,13 @@ public class Finder
         {
           resIndex = regex.matchedFrom();
 
-          if ((selection != null && selection.getSize()>0)
+          if ((selection != null && selection.getSize() > 0)
                   && ((resIndex + Integer.parseInt(spaces.elementAt(
                           resIndex).toString())) < selection.getStartRes()))
           {
             continue;
           }
-
+// if invalid string used, then regex has no matched to/from
           int sres = seq
                   .findPosition(resIndex
                           + Integer.parseInt(spaces.elementAt(resIndex)
@@ -219,15 +243,11 @@ public class Finder
     }
 
     /**
-     * We now search the Id string in the main search loop.
-     * for (int id = 0; id < alignment.getHeight(); id++)
-    {
-      if (regex.search(alignment.getSequenceAt(id).getName()))
-      {
-        idMatch.addElement(alignment.getSequenceAt(id));
-        hasResults = true;
-      }
-    } */
+     * We now search the Id string in the main search loop. for (int id = 0; id
+     * < alignment.getHeight(); id++) { if
+     * (regex.search(alignment.getSequenceAt(id).getName())) {
+     * idMatch.addElement(alignment.getSequenceAt(id)); hasResults = true; } }
+     */
     return hasResults;
   }
 
@@ -241,7 +261,7 @@ public class Finder
 
   /**
    * @param alignment
-   *                the alignment to set
+   *          the alignment to set
    */
   public void setAlignment(AlignmentI alignment)
   {
@@ -258,7 +278,7 @@ public class Finder
 
   /**
    * @param caseSensitive
-   *                the caseSensitive to set
+   *          the caseSensitive to set
    */
   public void setCaseSensitive(boolean caseSensitive)
   {
@@ -275,7 +295,7 @@ public class Finder
 
   /**
    * @param findAll
-   *                the findAll to set
+   *          the findAll to set
    */
   public void setFindAll(boolean findAll)
   {
@@ -292,7 +312,7 @@ public class Finder
 
   /**
    * @param selection
-   *                the selection to set
+   *          the selection to set
    */
   public void setSelection(jalview.datamodel.SequenceGroup selection)
   {
@@ -333,7 +353,7 @@ public class Finder
 
   /**
    * @param resIndex
-   *                the resIndex to set
+   *          the resIndex to set
    */
   public void setResIndex(int resIndex)
   {
@@ -350,10 +370,20 @@ public class Finder
 
   /**
    * @param seqIndex
-   *                the seqIndex to set
+   *          the seqIndex to set
    */
   public void setSeqIndex(int seqIndex)
   {
     this.seqIndex = seqIndex;
   }
+
+  public boolean isIncludeDescription()
+  {
+    return includeDescription;
+  }
+
+  public void setIncludeDescription(boolean includeDescription)
+  {
+    this.includeDescription = includeDescription;
+  }
 }