JAL-1807
[jalview.git] / src / jalview / analysis / Finder.java
index c584903..3562dee 100644 (file)
@@ -1,25 +1,36 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * 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.
- * 
+ * 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * 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.jsdev.RegExp;
+import jalview.jsdev.api.RegExpInterface;
+import jalview.util.Comparison;
+
+import java.util.Vector;
 
-import jalview.datamodel.*;
+//import com.stevesoft.pat.Regex;
 
 public class Finder
 {
@@ -30,15 +41,17 @@ public class Finder
 
   AlignmentI alignment;
 
-  jalview.datamodel.SequenceGroup selection = null;
+  SequenceGroup selection = null;
 
   Vector idMatch = null;
 
   boolean caseSensitive = false;
 
+  private boolean includeDescription = false;
+
   boolean findAll = false;
 
-  com.stevesoft.pat.Regex regex = null;
+  RegExpInterface regex = null;
 
   /**
    * hold's last-searched position between calles to find(false)
@@ -75,38 +88,17 @@ public class Finder
     {
       searchString = searchString.toUpperCase();
     }
-    regex = new com.stevesoft.pat.Regex(searchString);
+    regex = RegExp.newRegex(searchString);
     regex.setIgnoreCase(!caseSensitive);
     searchResults = new SearchResults();
     idMatch = new Vector();
     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)
@@ -131,6 +123,28 @@ public class Finder
       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);
@@ -142,6 +156,19 @@ public class Finder
             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;
+          }
+        }
       }
       item = seq.getSequenceAsString();
 
@@ -158,7 +185,7 @@ public class Finder
 
       for (int j = 0; j < item.length(); j++)
       {
-        if (!jalview.util.Comparison.isGap(item.charAt(j)))
+        if (!Comparison.isGap(item.charAt(j)))
         {
           noGapsSB.append(item.charAt(j));
           spaces.addElement(new Integer(insertCount));
@@ -184,7 +211,7 @@ public class Finder
           {
             continue;
           }
-
+// if invalid string used, then regex has no matched to/from
           int sres = seq
                   .findPosition(resIndex
                           + Integer.parseInt(spaces.elementAt(resIndex)
@@ -283,7 +310,7 @@ public class Finder
   /**
    * @return the selection
    */
-  public jalview.datamodel.SequenceGroup getSelection()
+  public SequenceGroup getSelection()
   {
     return selection;
   }
@@ -292,7 +319,7 @@ public class Finder
    * @param selection
    *          the selection to set
    */
-  public void setSelection(jalview.datamodel.SequenceGroup selection)
+  public void setSelection(SequenceGroup selection)
   {
     this.selection = selection;
   }
@@ -308,7 +335,7 @@ public class Finder
   /**
    * @return the regex
    */
-  public com.stevesoft.pat.Regex getRegex()
+  public RegExpInterface getRegex()
   {
     return regex;
   }
@@ -354,4 +381,14 @@ public class Finder
   {
     this.seqIndex = seqIndex;
   }
+
+  public boolean isIncludeDescription()
+  {
+    return includeDescription;
+  }
+
+  public void setIncludeDescription(boolean includeDescription)
+  {
+    this.includeDescription = includeDescription;
+  }
 }