Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / datamodel / VisibleContigsIterator.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.datamodel;
22
23 import java.util.ArrayList;
24 import java.util.Iterator;
25 import java.util.List;
26
27 /**
28  * An iterator which iterates over visible regions in a range. Provides a
29  * special "endsAtHidden" indicator to allow callers to determine if the final
30  * visible column is adjacent to a hidden region.
31  */
32 public class VisibleContigsIterator implements Iterator<int[]>
33 {
34   private List<int[]> vcontigs = new ArrayList<>();
35
36   private int currentPosition = 0;
37
38   private boolean endsAtHidden = false;
39
40   VisibleContigsIterator(int start, int end, List<int[]> hiddenColumns)
41   {
42     if (hiddenColumns != null && hiddenColumns.size() > 0)
43     {
44       int vstart = start;
45       int hideStart;
46       int hideEnd;
47
48       for (int[] region : hiddenColumns)
49       {
50         endsAtHidden = false;
51         hideStart = region[0];
52         hideEnd = region[1];
53
54         // navigate to start
55         if (hideEnd < vstart)
56         {
57           continue;
58         }
59         if (hideStart > vstart)
60         {
61           if (end - 1 > hideStart - 1)
62           {
63             int[] contig = new int[] { vstart, hideStart - 1 };
64             vcontigs.add(contig);
65             endsAtHidden = true;
66           }
67           else
68           {
69             int[] contig = new int[] { vstart, end - 1 };
70             vcontigs.add(contig);
71           }
72         }
73         vstart = hideEnd + 1;
74
75         // exit if we're past the end
76         if (vstart >= end)
77         {
78           break;
79         }
80       }
81
82       if (vstart < end)
83       {
84         int[] contig = new int[] { vstart, end - 1 };
85         vcontigs.add(contig);
86         endsAtHidden = false;
87       }
88     }
89     else
90     {
91       int[] contig = new int[] { start, end - 1 };
92       vcontigs.add(contig);
93     }
94   }
95
96   @Override
97   public boolean hasNext()
98   {
99     return (currentPosition < vcontigs.size());
100   }
101
102   @Override
103   public int[] next()
104   {
105     int[] result = vcontigs.get(currentPosition);
106     currentPosition++;
107     return result;
108   }
109
110   public boolean endsAtHidden()
111   {
112     return endsAtHidden;
113   }
114 }