JAL-2759 rationalise visible contigs iteration
[jalview.git] / src / jalview / datamodel / VisibleContigsIterator.java
1 package jalview.datamodel;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 /**
8  * An iterator which iterates over visible regions in a range.
9  */
10 public class VisibleContigsIterator implements Iterator<int[]>
11 {
12   private List<int[]> vcontigs = new ArrayList<>();
13
14   private int currentPosition = 0;
15
16   private boolean endsAtHidden = false;
17
18   VisibleContigsIterator(int start, int end,
19           List<int[]> hiddenColumns)
20   {
21     if (hiddenColumns != null && hiddenColumns.size() > 0)
22     {
23       int vstart = start;
24       int hideStart;
25       int hideEnd;
26
27       for (int[] region : hiddenColumns)
28       {
29         endsAtHidden = false;
30         hideStart = region[0];
31         hideEnd = region[1];
32
33         // navigate to start
34         if (hideEnd < vstart)
35         {
36           continue;
37         }
38         if (hideStart > vstart)
39         {
40           int[] contig = new int[] { vstart, hideStart - 1 };
41           vcontigs.add(contig);
42           endsAtHidden = true;
43         }
44         vstart = hideEnd + 1;
45
46         // exit if we're past the end
47         if (vstart >= end)
48         {
49           break;
50         }
51       }
52
53       if (vstart < end)
54       {
55         int[] contig = new int[] { vstart, end - 1 };
56         vcontigs.add(contig);
57         endsAtHidden = false;
58       }
59     }
60     else
61     {
62       int[] contig = new int[] { start, end - 1 };
63       vcontigs.add(contig);
64     }
65   }
66
67   @Override
68   public boolean hasNext()
69   {
70     return (currentPosition < vcontigs.size());
71   }
72
73   @Override
74   public int[] next()
75   {
76     int[] result = vcontigs.get(currentPosition);
77     currentPosition++;
78     return result;
79   }
80
81   public boolean endsAtHidden()
82   {
83     return endsAtHidden;
84   }
85 }
86