/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program 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 2 * of the License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.gui; import java.util.*; /** * NOTE: Columns are zero based. */ public class ColumnSelection { Vector selected = new Vector(); //Vector of int [] {startCol, endCol} Vector hiddenColumns; /** * DOCUMENT ME! * * @param col DOCUMENT ME! */ public void addElement(int col) { if (!selected.contains(new Integer(col))) { selected.addElement(new Integer(col)); } } /** * DOCUMENT ME! */ public void clear() { selected.removeAllElements(); } /** * DOCUMENT ME! * * @param col DOCUMENT ME! */ public void removeElement(int col) { Integer colInt = new Integer(col); if (selected.contains(colInt)) { selected.removeElement(colInt); } } public void removeElements(int start, int end) { Integer colInt; for(int i=start; i max) { max = columnAt(i); } } return max; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getMin() { int min = 1000000000; for (int i = 0; i < selected.size(); i++) { if (columnAt(i) < min) { min = columnAt(i); } } return min; } /** * DOCUMENT ME! * * @param start DOCUMENT ME! * @param change DOCUMENT ME! */ public void compensateForEdit(int start, int change) { for (int i = 0; i < size(); i++) { int temp = columnAt(i); if (temp >= start) { selected.setElementAt(new Integer(temp - change), i); } } if(hiddenColumns!=null) { for(int i=0; i start) { region[0] -= change; region[1] -= change; } if(region[0]<0) region[0] = 0; if(region[1] <0) region[1] = 0; } } } /** * This Method is used to return all the HiddenColumn regions * less than the given index. * @param end int * @return Vector */ public Vector getHiddenColumns() { return hiddenColumns; } public int adjustForHiddenColumns(int column) { int result = column; if (hiddenColumns != null) { for (int i = 0; i < hiddenColumns.size(); i++) { int[] region = (int[]) hiddenColumns.elementAt(i); if (result >= region[0]) { result += region[1] - region[0] + 1; } } } return result; } /** * Use this method to find out where a visible column is in the alignment * when hidden columns exist * @param hiddenColumn int * @return int */ public int findColumnPosition(int hiddenColumn) { int result = hiddenColumn; if (hiddenColumns != null) { int index = 0; int gaps = 0; do { int[] region = (int[]) hiddenColumns.elementAt(index); if (hiddenColumn > region[1]) { result -= region[1]+1-region[0]; } index++; } while (index < hiddenColumns.size()); result -= gaps; } return result; } /** * Use this method to determine where the next hiddenRegion starts */ public int findHiddenRegionPosition(int hiddenRegion) { int result = 0; if (hiddenColumns != null) { int index = 0; int gaps = 0; do { int[] region = (int[]) hiddenColumns.elementAt(index); if(hiddenRegion==0) { return region[0]; } gaps += region[1] +1 - region[0]; result = region[1] +1; index++; } while(index < hiddenRegion+1); result -= gaps; } return result; } /** * THis method returns the rightmost limit of a * region of an alignment with hidden columns. * In otherwords, the next hidden column. * @param index int */ public int getHiddenBoundaryRight(int alPos) { if (hiddenColumns != null) { int index = 0; do { int[] region = (int[]) hiddenColumns.elementAt(index); if(alPos < region[0]) return region[0]; index++; } while(index < hiddenColumns.size()); } return alPos; } /** * THis method returns the rightmost limit of a * region of an alignment with hidden columns. * In otherwords, the next hidden column. * @param index int */ public int getHiddenBoundaryLeft(int alPos) { if (hiddenColumns != null) { int index = hiddenColumns.size()-1; do { int[] region = (int[]) hiddenColumns.elementAt(index); if(alPos > region[1]) return region[1]; index--; } while(index >-1); } return alPos; } public void hideColumns(int res, AlignViewport av) { if(hiddenColumns==null) hiddenColumns = new Vector(); // First find out range of columns to hide int min = res, max = res+1; while( contains(min) ) { removeElement(min); min --; } while( contains(max) ) { removeElement(max); max ++; } min++; max--; boolean added = false; for(int i=0; i= region[0] && column <= region[1]) { return false; } } return true; } }