update author list in license for (JAL-826)
[jalview.git] / src / jalview / datamodel / SearchResults.java
index b9176b4..3efb713 100755 (executable)
@@ -1,20 +1,19 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
- * 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 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.
- *
- * 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
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * 
+ * 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.
+ * 
+ * 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/>.
  */
 package jalview.datamodel;
 
@@ -24,20 +23,23 @@ public class SearchResults
   Match[] matches;
 
   /**
-   * This method replaces the old search results which merely
-   * held an alignment index of search matches. This broke
-   * when sequences were moved around the alignment
-   * @param seq Sequence
-   * @param start int
-   * @param end int
+   * This method replaces the old search results which merely held an alignment
+   * index of search matches. This broke when sequences were moved around the
+   * alignment
+   * 
+   * @param seq
+   *          Sequence
+   * @param start
+   *          int
+   * @param end
+   *          int
    */
   public void addResult(SequenceI seq, int start, int end)
   {
     if (matches == null)
     {
       matches = new Match[]
-          {
-          new Match(seq, start, end)};
+      { new Match(seq, start, end) };
       return;
     }
 
@@ -56,9 +58,34 @@ public class SearchResults
   }
 
   /**
-   * This Method returns the search matches which lie between the
-   * start and end points of the sequence in question. It is
-   * optimised for returning objects for drawing on SequenceCanvas
+   * Quickly check if the given sequence is referred to in the search results
+   * 
+   * @param sequence
+   *          (specific alignment sequence or a dataset sequence)
+   * @return true if the results involve sequence
+   */
+  public boolean involvesSequence(SequenceI sequence)
+  {
+    if (matches == null || matches.length == 0)
+    {
+      return false;
+    }
+    SequenceI ds = sequence.getDatasetSequence();
+    for (int m = 0; m < matches.length; m++)
+    {
+      if (matches[m].sequence != null
+              && (matches[m].sequence == sequence || matches[m].sequence == ds))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This Method returns the search matches which lie between the start and end
+   * points of the sequence in question. It is optimised for returning objects
+   * for drawing on SequenceCanvas
    */
   public int[] getResults(SequenceI sequence, int start, int end)
   {
@@ -69,25 +96,27 @@ public class SearchResults
 
     int[] result = null;
     int[] tmp = null;
-    int resultLength, matchStart=0, matchEnd=0;
+    int resultLength, matchStart = 0, matchEnd = 0;
     boolean mfound;
     for (int m = 0; m < matches.length; m++)
     {
-      mfound=false;
+      mfound = false;
       if (matches[m].sequence == sequence)
-        {
+      {
         mfound = true;
         // locate aligned position
         matchStart = sequence.findIndex(matches[m].start) - 1;
         matchEnd = sequence.findIndex(matches[m].end) - 1;
-        }
-      else if (matches[m].sequence == sequence.getDatasetSequence()) {
+      }
+      else if (matches[m].sequence == sequence.getDatasetSequence())
+      {
         mfound = true;
         // locate region in local context
         matchStart = sequence.findIndex(matches[m].start) - 1;
         matchEnd = sequence.findIndex(matches[m].end) - 1;
       }
-      if (mfound) {
+      if (mfound)
+      {
         if (matchStart <= end && matchEnd >= start)
         {
           if (matchStart < start)
@@ -103,8 +132,7 @@ public class SearchResults
           if (result == null)
           {
             result = new int[]
-                {
-                matchStart, matchEnd};
+            { matchStart, matchEnd };
           }
           else
           {
@@ -115,6 +143,9 @@ public class SearchResults
             result[resultLength] = matchStart;
             result[resultLength + 1] = matchEnd;
           }
+        } else {\r
+          // debug\r
+          // System.err.println("Outwith bounds!" + matchStart+">"+end +"  or " + matchEnd+"<"+start);\r
         }
       }
     }
@@ -144,7 +175,9 @@ public class SearchResults
   class Match
   {
     SequenceI sequence;
+
     int start;
+
     int end;
 
     public Match(SequenceI seq, int start, int end)