JAL-2759 rationalise visible contigs iteration
[jalview.git] / src / jalview / appletgui / SeqCanvas.java
index 67b21bc..e83d04a 100755 (executable)
@@ -25,6 +25,7 @@ import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.datamodel.VisibleContigsIterator;
 import jalview.renderer.ScaleRenderer;
 import jalview.renderer.ScaleRenderer.ScaleMark;
 import jalview.viewmodel.AlignmentViewport;
@@ -560,30 +561,23 @@ public class SeqCanvas extends Panel implements ViewportListenerI
     else
     {
       int screenY = 0;
-      final int screenYMax = endRes - startRes;
-      int blockStart = startRes;
-      int blockEnd = endRes; // equals blockStart + screenYMax - screenY;
+      int blockStart;
+      int blockEnd;
 
       HiddenColumns hidden = av.getAlignment().getHiddenColumns();
-      Iterator<int[]> regions = hidden.iterator();
+      VisibleContigsIterator regions = (VisibleContigsIterator) hidden
+              .getVisibleBlocksIterator(startRes, endRes, true);
+
       while (regions.hasNext())
       {
         int[] region = regions.next();
-        int hideStart = region[0];
-        int hideEnd = region[1];
-
-        if (hideStart <= blockStart)
-        {
-          blockStart += (hideEnd - hideStart) + 1;
-          blockEnd += (hideEnd - hideStart) + 1;
-          continue;
-        }
+        blockEnd = region[1];
+        blockStart = region[0];
 
         /*
          * draw up to just before the next hidden region, or the end of
          * the visible region, whichever comes first
          */
-        blockEnd = Math.min(blockEnd, hideStart - 1);
         g1.translate(screenY * avcharWidth, 0);
 
         draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
@@ -592,7 +586,8 @@ public class SeqCanvas extends Panel implements ViewportListenerI
          * draw the downline of the hidden column marker (ScalePanel draws the
          * triangle on top) if we reached it
          */
-        if (av.getShowHiddenMarkers() && blockEnd == hideStart - 1)
+        if (av.getShowHiddenMarkers()
+                && (regions.hasNext() || regions.endsAtHidden()))
         {
           g1.setColor(Color.blue);
           g1.drawLine((blockEnd - blockStart + 1) * avcharWidth - 1,
@@ -602,22 +597,6 @@ public class SeqCanvas extends Panel implements ViewportListenerI
 
         g1.translate(-screenY * avcharWidth, 0);
         screenY += blockEnd - blockStart + 1;
-        blockStart = hideEnd + 1;
-        blockEnd = blockStart + screenYMax - screenY;
-
-        if (screenY > screenYMax)
-        {
-          // already rendered last block
-          return;
-        }
-      }
-
-      if (screenY <= screenYMax)
-      {
-        // remaining visible region to render
-        g1.translate(screenY * avcharWidth, 0);
-        draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
-        g1.translate(-screenY * avcharWidth, 0);
       }
     }
   }