JAL-1517 update copyright to version 2.8.2
[jalview.git] / src / jalview / datamodel / SearchResults.java
index b9176b4..dcb1306 100755 (executable)
@@ -1,20 +1,20 @@
 /*
- * 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.8.2)
+ * Copyright (C) 2014 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.
+ *  
+ * 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/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.datamodel;
 
@@ -24,20 +24,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 +59,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 +97,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 +133,7 @@ public class SearchResults
           if (result == null)
           {
             result = new int[]
-                {
-                matchStart, matchEnd};
+            { matchStart, matchEnd };
           }
           else
           {
@@ -116,6 +145,12 @@ public class SearchResults
             result[resultLength + 1] = matchEnd;
           }
         }
+        else
+        {
+          // debug
+          // System.err.println("Outwith bounds!" + matchStart+">"+end +"  or "
+          // + matchEnd+"<"+start);
+        }
       }
     }
     return result;
@@ -144,7 +179,9 @@ public class SearchResults
   class Match
   {
     SequenceI sequence;
+
     int start;
+
     int end;
 
     public Match(SequenceI seq, int start, int end)