Merge branch 'develop' into features/JAL-2446NCList
[jalview.git] / src / jalview / controller / AlignViewController.java
index bc7f212..d1d61d2 100644 (file)
@@ -238,83 +238,65 @@ public class AlignViewController implements AlignViewControllerI
     int nseq = 0;
     for (SequenceI sq : seqs)
     {
-      boolean sequenceHasFeature = false;
       if (sq != null)
       {
-        SequenceFeature[] sfs = sq.getSequenceFeatures();
-        if (sfs != null)
+        int ist = sq.findPosition(sqcol.getStartRes());
+        int iend = sq.findPosition(sqcol.getEndRes()); // see JAL-2526
+        List<SequenceFeature> sfs = sq.getFeatures().findFeatures(ist,
+                iend, featureType);
+        boolean overlap = false;
+        for (SequenceFeature sf : sfs)
         {
-          int ist = sq.findIndex(sq.getStart());
-          int iend = sq.findIndex(sq.getEnd());
-          if (iend < startPosition || ist > endPosition)
+          // future functionality - featureType == null means mark columns
+          // containing all displayed features
+          if (sf != null && (featureType.equals(sf.getType())))
           {
-            // sequence not in region
-            continue;
-          }
-          for (SequenceFeature sf : sfs)
-          {
-            // future functionality - featureType == null means mark columns
-            // containing all displayed features
-            if (sf != null && (featureType.equals(sf.getType())))
-            {
-              // optimisation - could consider 'spos,apos' like cursor argument
-              // - findIndex wastes time by starting from first character and
-              // counting
-
-              int sfStartCol = sq.findIndex(sf.getBegin());
-              int sfEndCol = sq.findIndex(sf.getEnd());
-
-              if (sf.isContactFeature())
-              {
-                /*
-                 * 'contact' feature - check for 'start' or 'end'
-                 * position within the selected region
-                 */
-                if (sfStartCol >= startPosition
-                        && sfStartCol <= endPosition)
-                {
-                  bs.set(sfStartCol - 1);
-                  sequenceHasFeature = true;
-                }
-                if (sfEndCol >= startPosition && sfEndCol <= endPosition)
-                {
-                  bs.set(sfEndCol - 1);
-                  sequenceHasFeature = true;
-                }
-                continue;
-              }
+            int sfStartCol = sq.findIndex(sf.getBegin());
+            int sfEndCol = sq.findIndex(sf.getEnd()); // inefficient - JAL-2526
 
+            if (sf.isContactFeature())
+            {
               /*
-               * contiguous feature - select feature positions (if any) 
-               * within the selected region
+               * 'contact' feature - check for 'start' or 'end'
+               * position within the selected region
                */
-              if (sfStartCol > endPosition || sfEndCol < startPosition)
-              {
-                // feature is outside selected region
-                continue;
-              }
-              sequenceHasFeature = true;
-              if (sfStartCol < startPosition)
-              {
-                sfStartCol = startPosition;
-              }
-              if (sfStartCol < ist)
+              if (sfStartCol >= startPosition && sfStartCol <= endPosition)
               {
-                sfStartCol = ist;
+                bs.set(sfStartCol - 1);
+                overlap = true;
               }
-              if (sfEndCol > endPosition)
+              if (sfEndCol >= startPosition && sfEndCol <= endPosition)
               {
-                sfEndCol = endPosition;
-              }
-              for (; sfStartCol <= sfEndCol; sfStartCol++)
-              {
-                bs.set(sfStartCol - 1); // convert to base 0
+                bs.set(sfEndCol - 1);
+                overlap = true;
               }
+              continue;
+            }
+
+            /*
+             * contiguous feature - select feature positions (if any) 
+             * within the selected region
+             */
+            if (sfStartCol < startPosition)
+            {
+              sfStartCol = startPosition;
+            }
+            if (sfStartCol < ist)
+            {
+              sfStartCol = ist;
+            }
+            if (sfEndCol > endPosition)
+            {
+              sfEndCol = endPosition;
+            }
+            for (; sfStartCol <= sfEndCol; sfStartCol++)
+            {
+              bs.set(sfStartCol - 1); // convert to base 0
+              overlap = true;
             }
           }
         }
-
-        if (sequenceHasFeature)
+        if (overlap)
         {
           nseq++;
         }