Merge branch 'releases/Release_2_10_4_Branch_merged_JAL-2759' into releases/Release_2...
[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. Provides a
9  * special "endsAtHidden" indicator to allow callers to determine if the final
10  * visible column is adjacent to a hidden region.
11  */
12 public class VisibleContigsIterator implements Iterator<int[]>
13 {
14   private List<int[]> vcontigs = new ArrayList<>();
15
16   private int currentPosition = 0;
17
18   private boolean endsAtHidden = false;
19
20   VisibleContigsIterator(int start, int end,
21           List<int[]> hiddenColumns)
22   {
23     if (hiddenColumns != null && hiddenColumns.size() > 0)
24     {
25       int vstart = start;
26       int hideStart;
27       int hideEnd;
28
29       for (int[] region : hiddenColumns)
30       {
31         endsAtHidden = false;
32         hideStart = region[0];
33         hideEnd = region[1];
34
35         // navigate to start
36         if (hideEnd < vstart)
37         {
38           continue;
39         }
40         if (hideStart > vstart)
41         {
42           if (end - 1 > hideStart - 1)
43           {
44             int[] contig = new int[] { vstart, hideStart - 1 };
45             vcontigs.add(contig);
46             endsAtHidden = true;
47           }
48           else
49           {
50             int[] contig = new int[] { vstart, end - 1 };
51             vcontigs.add(contig);
52           }
53         }
54         vstart = hideEnd + 1;
55
56         // exit if we're past the end
57         if (vstart >= end)
58         {
59           break;
60         }
61       }
62
63       if (vstart < end)
64       {
65         int[] contig = new int[] { vstart, end - 1 };
66         vcontigs.add(contig);
67         endsAtHidden = false;
68       }
69     }
70     else
71     {
72       int[] contig = new int[] { start, end - 1 };
73       vcontigs.add(contig);
74     }
75   }
76
77   @Override
78   public boolean hasNext()
79   {
80     return (currentPosition < vcontigs.size());
81   }
82
83   @Override
84   public int[] next()
85   {
86     int[] result = vcontigs.get(currentPosition);
87     currentPosition++;
88     return result;
89   }
90
91   public boolean endsAtHidden()
92   {
93     return endsAtHidden;
94   }
95 }
96