/* * 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.Iterator; import java.util.List; import java.util.NoSuchElementException; /** * An iterator which iterates over all visible columns in an alignment * * @author kmourao * */ public class VisibleColsIterator implements Iterator { private int last; private int current; private int next; private List hidden; private int lasthiddenregion; public VisibleColsIterator(int firstcol, int lastcol, HiddenColumns hiddenCols) { last = lastcol; current = firstcol; next = firstcol; hidden = hiddenCols.getHiddenColumnsCopy(); lasthiddenregion = -1; if (hidden != null) { int i = 0; for (i = 0; i < hidden.size(); ++i) { if (current >= hidden.get(i)[0] && current <= hidden.get(i)[1]) { // current is hidden, move to right current = hidden.get(i)[1] + 1; next = current; } if (current < hidden.get(i)[0]) { break; } } lasthiddenregion = i - 1; for (i = hidden.size() - 1; i >= 0; --i) { if (last >= hidden.get(i)[0] && last <= hidden.get(i)[1]) { // last is hidden, move to left last = hidden.get(i)[0] - 1; } if (last > hidden.get(i)[1]) { break; } } } } @Override public boolean hasNext() { return next <= last; } @Override public Integer next() { if (next > last) { throw new NoSuchElementException(); } current = next; if ((hidden != null) && (lasthiddenregion + 1 < hidden.size())) { // still some more hidden regions if (next + 1 < hidden.get(lasthiddenregion + 1)[0]) { // next+1 is still before the next hidden region next++; } else if ((next + 1 >= hidden.get(lasthiddenregion + 1)[0]) && (next + 1 <= hidden.get(lasthiddenregion + 1)[1])) { // next + 1 is in the next hidden region next = hidden.get(lasthiddenregion + 1)[1] + 1; lasthiddenregion++; } } else { // finished with hidden regions, just increment normally next++; } return current; } @Override public void remove() { throw new UnsupportedOperationException(); } }