JAL-2674 reverted attempt at visible regions iterator
authorkiramt <k.mourao@dundee.ac.uk>
Fri, 29 Sep 2017 09:26:15 +0000 (10:26 +0100)
committerkiramt <k.mourao@dundee.ac.uk>
Fri, 29 Sep 2017 09:26:15 +0000 (10:26 +0100)
src/jalview/appletgui/SeqCanvas.java
src/jalview/datamodel/HiddenColumns.java
src/jalview/gui/SeqCanvas.java
test/jalview/datamodel/HiddenColumnsTest.java

index 8d429c7..5d55473 100755 (executable)
@@ -565,20 +565,25 @@ public class SeqCanvas extends Panel implements ViewportListenerI
       int blockEnd = endRes;
 
       HiddenColumns hidden = av.getAlignment().getHiddenColumns();
-      Iterator<int[]> regions = hidden.getBoundedVisRegionIterator(startRes,
-              endRes);
+      Iterator<int[]> regions = hidden.iterator();
       while (regions.hasNext())
       {
         int[] region = regions.next();
+        int hideStart = region[0];
+        int hideEnd = region[1];
 
-        blockStart = region[0];
+        if (hideStart <= blockStart)
+        {
+          blockStart += (hideEnd - hideStart) + 1;
+          continue;
+        }
 
         /*
          * draw up to just before the next hidden region, or the end of
          * the visible region, whichever comes first
          */
-        blockEnd = Math.min(region[1], blockStart + screenYMax - screenY);
-
+        blockEnd = Math.min(hideStart - 1,
+                blockStart + screenYMax - screenY);
         g1.translate(screenY * avcharWidth, 0);
 
         draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
@@ -587,7 +592,7 @@ 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 == region[1])
+        if (av.getShowHiddenMarkers() && blockEnd == hideStart - 1)
         {
           g1.setColor(Color.blue);
           g1.drawLine((blockEnd - blockStart + 1) * avcharWidth - 1,
@@ -597,6 +602,7 @@ public class SeqCanvas extends Panel implements ViewportListenerI
 
         g1.translate(-screenY * avcharWidth, 0);
         screenY += blockEnd - blockStart + 1;
+        blockStart = hideEnd + 1;
 
         if (screenY > screenYMax)
         {
@@ -604,17 +610,17 @@ public class SeqCanvas extends Panel implements ViewportListenerI
           return;
         }
       }
+
       if (screenY <= screenYMax)
       {
         // remaining visible region to render
-        blockEnd = blockStart + (endRes - startRes) - screenY;
+        blockEnd = blockStart + screenYMax - screenY;
         g1.translate(screenY * avcharWidth, 0);
         draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
 
         g1.translate(-screenY * avcharWidth, 0);
       }
     }
-
   }
 
   // int startRes, int endRes, int startSeq, int endSeq, int x, int y,
index 82e25b9..b915423 100644 (file)
@@ -1525,11 +1525,6 @@ public class HiddenColumns
     return new BoundedStartRegionIterator(start, end, useCopy);
   }
 
-  public Iterator<int[]> getBoundedVisRegionIterator(int start, int end)
-  {
-    return new BoundedVisRegionIterator(start, end, true);
-  }
-
   /**
    * An iterator which iterates over hidden column regions in a range.
    * 
@@ -1733,125 +1728,4 @@ public class HiddenColumns
       return result;
     }
   }
-
-  class BoundedVisRegionIterator implements Iterator<int[]>
-  {
-    private int start; // start position to iterate from
-
-    private int end; // end position to iterate to
-
-    // current region in visColumns
-    private int[] currentRegion;
-
-    // current index in visColumns
-    private int currentPosition = 0;
-
-    private List<int[]> vcontigs = null;
-
-    /**
-     * Construct an iterator over visibleColumn regions bounded at
-     * [lowerBound,upperBound]
-     * 
-     * @param lowerBound
-     *          lower bound to iterate from
-     * @param upperBound
-     *          upper bound to iterate to
-     * @param useCopyCols
-     *          whether to make a local copy for iteration (set to true if
-     *          calling from outwith the HiddenColumns class)
-     */
-    BoundedVisRegionIterator(int lowerBound, int upperBound,
-            boolean useCopy)
-    {
-      try
-      {
-        start = lowerBound;
-        end = upperBound;
-
-        if (useCopy)
-        {
-          // assume that if useCopy is false the calling code has locked
-          // hiddenColumns
-          LOCK.readLock().lock();
-        }
-
-        int visStart = start;
-
-        if (hiddenColumns != null)
-        {
-          vcontigs = new ArrayList<>(hiddenColumns.size() + 1);
-
-          // navigate to start, keeping count of hidden columns
-          int i = 0;
-          int[] region = null;
-          while ((i < hiddenColumns.size())
-                  && (hiddenColumns.get(i)[0] <= start))
-          {
-            i++;
-          }
-          // if there was a hidden region before (i>=1), and it ended after
-          // start
-          // and before end, adjust visStart to be just after that region
-          if (i > 0)
-          {
-            region = hiddenColumns.get(i - 1);
-            if ((region[1] > start) && (region[1] < end))
-            {
-              visStart = region[1] + 1;
-            }
-            else if (region[1] >= end)
-            {
-              // previous hidden region covers whole range [start,end]
-              // early exit - vcontigs is empty
-              return;
-            }
-          }
-
-          // iterate from start to end, adding start positions of each
-          // hidden region. Positions are visible columns count, not absolute
-          while (i < hiddenColumns.size()
-                  && (hiddenColumns.get(i)[0] < end))
-          {
-            region = hiddenColumns.get(i);
-            int[] prevVisibleRegion = new int[] { visStart, region[0] - 1 };
-            vcontigs.add(prevVisibleRegion);
-            visStart = region[1] + 1;
-            i++;
-          }
-          // add on a final visible region if needed
-          if (visStart <= end)
-          {
-            int[] lastRegion = new int[] { visStart, end };
-            vcontigs.add(lastRegion);
-          }
-        }
-        else
-        {
-          vcontigs = new ArrayList<>();
-          int[] lastRegion = new int[] { start, end };
-          vcontigs.add(lastRegion);
-        }
-      } finally
-      {
-        if (useCopy)
-        {
-          LOCK.readLock().unlock();
-        }
-      }
-    }
-
-    @Override
-    public boolean hasNext()
-    {
-      return (currentPosition < vcontigs.size());
-    }
-
-    @Override
-    public int[] next()
-    {
-      currentRegion = vcontigs.get(currentPosition);
-      currentPosition++;
-      return currentRegion;
-    }
-  }
 }
index 122e29a..b7d74de 100755 (executable)
@@ -856,20 +856,25 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
       int blockEnd = endRes;
 
       HiddenColumns hidden = av.getAlignment().getHiddenColumns();
-      Iterator<int[]> regions = hidden.getBoundedVisRegionIterator(startRes,
-              endRes);
+      Iterator<int[]> regions = hidden.iterator();
       while (regions.hasNext())
       {
         int[] region = regions.next();
+        int hideStart = region[0];
+        int hideEnd = region[1];
 
-        blockStart = region[0];
+        if (hideStart <= blockStart)
+        {
+          blockStart += (hideEnd - hideStart) + 1;
+          continue;
+        }
 
         /*
          * draw up to just before the next hidden region, or the end of
          * the visible region, whichever comes first
          */
-        blockEnd = Math.min(region[1], blockStart + screenYMax - screenY);
-
+        blockEnd = Math.min(hideStart - 1,
+                blockStart + screenYMax - screenY);
         g1.translate(screenY * charWidth, 0);
 
         draw(g1, blockStart, blockEnd, startSeq, endSeq, yOffset);
@@ -878,7 +883,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
          * draw the downline of the hidden column marker (ScalePanel draws the
          * triangle on top) if we reached it
          */
-        if (av.getShowHiddenMarkers() && blockEnd == region[1])
+        if (av.getShowHiddenMarkers() && blockEnd == hideStart - 1)
         {
           g1.setColor(Color.blue);
 
@@ -889,6 +894,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
         g1.translate(-screenY * charWidth, 0);
         screenY += blockEnd - blockStart + 1;
+        blockStart = hideEnd + 1;
 
         if (screenY > screenYMax)
         {
@@ -903,7 +909,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
         blockEnd = blockStart + screenYMax - screenY;
         g1.translate(screenY * charWidth, 0);
         draw(g1, blockStart, blockEnd, startSeq, endSeq, yOffset);
-      
+
         g1.translate(-screenY * charWidth, 0);
       }
     }
@@ -1120,14 +1126,20 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
       int blockEnd = endRes;
 
       HiddenColumns hidden = av.getAlignment().getHiddenColumns();
-      Iterator<int[]> regions = hidden.getBoundedVisRegionIterator(startRes,
-              endRes);
+      Iterator<int[]> regions = hidden.iterator();
       while (regions.hasNext())
       {
         int[] region = regions.next();
+        int hideStart = region[0];
+        int hideEnd = region[1];
+
+        if (hideStart <= blockStart)
+        {
+          blockStart += (hideEnd - hideStart) + 1;
+          continue;
+        }
 
-        blockStart = region[0];
-        blockEnd = region[1];
+        blockEnd = hideStart - 1;
 
         g.translate(screenY * charWidth, 0);
         drawPartialGroupOutline(g, group,
@@ -1135,6 +1147,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
         g.translate(-screenY * charWidth, 0);
         screenY += blockEnd - blockStart + 1;
+        blockStart = hideEnd + 1;
 
         if (screenY > (endRes - startRes))
         {
index 92e0f90..1ad6d85 100644 (file)
@@ -1434,65 +1434,4 @@ public class HiddenColumnsTest
     assertEquals(6, next);
     assertFalse(it.hasNext());
   }
-
-  @Test(groups = "Functional")
-  public void testVisRegionsIterator()
-  {
-    HiddenColumns h = new HiddenColumns();
-    Iterator<int[]> it = h.getBoundedVisRegionIterator(0, 15);
-
-    // no hidden columns = single visible contig
-    assertTrue(it.hasNext());
-    assertEquals("[0, 15]", Arrays.toString(it.next()));
-
-    // hidden column region at start
-    h.hideColumns(0, 5);
-    it = h.getBoundedVisRegionIterator(0, 15);
-    assertTrue(it.hasNext());
-    assertEquals("[6, 15]", Arrays.toString(it.next()));
-
-    // hidden column region at end
-    h = new HiddenColumns();
-    h.hideColumns(8, 15);
-    it = h.getBoundedVisRegionIterator(0, 15);
-    assertTrue(it.hasNext());
-    assertEquals("[0, 7]", Arrays.toString(it.next()));
-
-    // hidden column region across whole region
-    h = new HiddenColumns();
-    h.hideColumns(0, 20);
-    it = h.getBoundedVisRegionIterator(0, 15);
-    assertFalse(it.hasNext());
-
-    // hidden column region in middle
-    h = new HiddenColumns();
-    h.hideColumns(1, 14);
-    it = h.getBoundedVisRegionIterator(0, 15);
-    assertTrue(it.hasNext());
-    assertEquals("[0, 0]", Arrays.toString(it.next()));
-    assertTrue(it.hasNext());
-    assertEquals("[15, 15]", Arrays.toString(it.next()));
-
-    // hidden column region just off either end
-    h = new HiddenColumns();
-    h.hideColumns(3, 14);
-    it = h.getBoundedVisRegionIterator(4, 13);
-    assertFalse(it.hasNext());
-
-    // multiple regions
-    h = new HiddenColumns();
-    h.hideColumns(3, 5);
-    h.hideColumns(7, 11);
-    h.hideColumns(14, 19);
-    h.hideColumns(24, 25);
-    h.hideColumns(35, 39);
-    it = h.getBoundedVisRegionIterator(8, 26);
-    assertTrue(it.hasNext());
-    assertEquals("[12, 13]", Arrays.toString(it.next()));
-    assertTrue(it.hasNext());
-    assertEquals("[20, 23]", Arrays.toString(it.next()));
-    assertTrue(it.hasNext());
-    assertEquals("[26, 26]", Arrays.toString(it.next()));
-    assertFalse(it.hasNext());
-  }
 }