bd036e41e397ddb2c7c147bdf55ecc310c9a5ef4
[jalview.git] / src / jalview / datamodel / StartRegionIterator.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 start positions of hidden column
9  * regions in a range.
10  */
11 public class StartRegionIterator implements Iterator<Integer>
12 {
13   // start position to iterate from
14   private int start;
15
16   // end position to iterate to
17   private int end;
18
19   // current index in hiddenColumns
20   private int currentPosition = 0;
21
22   // local copy or reference to hiddenColumns
23   private List<Integer> positions = null;
24
25   /**
26    * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
27    * 
28    * @param lowerBound
29    *          lower bound to iterate from
30    * @param upperBound
31    *          upper bound to iterate to
32    * @param useCopyCols
33    *          whether to make a local copy of hiddenColumns for iteration (set
34    *          to true if calling from outwith the HiddenColumns class)
35    */
36   StartRegionIterator(int lowerBound, int upperBound,
37           List<int[]> hiddenColumns)
38   {
39     this(null, lowerBound, upperBound, hiddenColumns);
40   }
41
42   /**
43    * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
44    * 
45    * @param pos
46    *          a hidden cursor position to start from - may be null
47    * @param lowerBound
48    *          lower bound to iterate from - will be ignored if pos != null
49    * @param upperBound
50    *          upper bound to iterate to
51    * @param hiddenColumns
52    *          the hidden columns collection to use
53    */
54   StartRegionIterator(HiddenCursorPosition pos, int lowerBound,
55           int upperBound, List<int[]> hiddenColumns)
56   {
57     start = lowerBound;
58     end = upperBound;
59
60     if (hiddenColumns != null)
61     {
62       positions = new ArrayList<>(hiddenColumns.size());
63
64       // navigate to start, keeping count of hidden columns
65       int i = 0;
66       int hiddenSoFar = 0;
67       
68       if (pos != null)
69       {
70         // use the cursor position provided
71         i = pos.getRegionIndex();
72         hiddenSoFar = pos.getHiddenSoFar();
73       }
74       else
75       {
76         // navigate to start
77         while ((i < hiddenColumns.size())
78                 && (hiddenColumns.get(i)[0] < start + hiddenSoFar))
79         {
80           int[] region = hiddenColumns.get(i);
81           hiddenSoFar += region[1] - region[0] + 1;
82           i++;
83         }
84       }
85
86       // iterate from start to end, adding start positions of each
87       // hidden region. Positions are visible columns count, not absolute
88       while (i < hiddenColumns.size()
89               && (hiddenColumns.get(i)[0] <= end + hiddenSoFar))
90       {
91         int[] region = hiddenColumns.get(i);
92         positions.add(region[0] - hiddenSoFar);
93         hiddenSoFar += region[1] - region[0] + 1;
94         i++;
95       }
96     }
97     else
98     {
99       positions = new ArrayList<>();
100     }
101
102   }
103
104   @Override
105   public boolean hasNext()
106   {
107     return (currentPosition < positions.size());
108   }
109
110   /**
111    * Get next hidden region start position
112    * 
113    * @return the start position in *visible* coordinates
114    */
115   @Override
116   public Integer next()
117   {
118     int result = positions.get(currentPosition);
119     currentPosition++;
120     return result;
121   }
122 }
123