/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.datamodel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* An iterator which iterates over visible start positions of hidden column
* regions in a range.
*/
public class StartRegionIterator implements Iterator
{
// start position to iterate from
private int start;
// end position to iterate to
private int end;
// current index in hiddenColumns
private int currentPosition = 0;
// local copy or reference to hiddenColumns
private List positions = null;
/**
* Construct an iterator over hiddenColums 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 of hiddenColumns for iteration (set
* to true if calling from outwith the HiddenColumns class)
*/
StartRegionIterator(int lowerBound, int upperBound,
List hiddenColumns)
{
this(null, lowerBound, upperBound, hiddenColumns);
}
/**
* Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
*
* @param pos
* a hidden cursor position to start from - may be null
* @param lowerBound
* lower bound to iterate from - will be ignored if pos != null
* @param upperBound
* upper bound to iterate to
* @param hiddenColumns
* the hidden columns collection to use
*/
StartRegionIterator(HiddenCursorPosition pos, int lowerBound,
int upperBound, List hiddenColumns)
{
start = lowerBound;
end = upperBound;
if (hiddenColumns != null)
{
positions = new ArrayList<>(hiddenColumns.size());
// navigate to start, keeping count of hidden columns
int i = 0;
int hiddenSoFar = 0;
if (pos != null)
{
// use the cursor position provided
i = pos.getRegionIndex();
hiddenSoFar = pos.getHiddenSoFar();
}
else
{
// navigate to start
while ((i < hiddenColumns.size())
&& (hiddenColumns.get(i)[0] < start + hiddenSoFar))
{
int[] region = hiddenColumns.get(i);
hiddenSoFar += region[1] - region[0] + 1;
i++;
}
}
// 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 + hiddenSoFar))
{
int[] region = hiddenColumns.get(i);
positions.add(region[0] - hiddenSoFar);
hiddenSoFar += region[1] - region[0] + 1;
i++;
}
}
else
{
positions = new ArrayList<>();
}
}
@Override
public boolean hasNext()
{
return (currentPosition < positions.size());
}
/**
* Get next hidden region start position
*
* @return the start position in *visible* coordinates
*/
@Override
public Integer next()
{
int result = positions.get(currentPosition);
currentPosition++;
return result;
}
}