X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=6fb584ca4774b3ec6a2ab2996d101d567d642af0;hb=f41f5deaf0c8c1bbfb3fe4ca8be208d27b8e11d7;hp=835d7e97f94ced58f0b00e494684095354ec1f49;hpb=be32c14cd8e48fe0a207cd7030cb9cd46f894678;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index 835d7e9..6fb584c 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -34,9 +34,15 @@ import java.util.Vector; */ public class ColumnSelection { + /* + * list of selected columns (not ordered) + */ Vector selected = new Vector(); - // Vector of int [] {startCol, endCol} + /* + * list of hidden column [start, end] ranges; the list is maintained in + * ascending start column order + */ Vector hiddenColumns; /** @@ -102,10 +108,10 @@ public class ColumnSelection } /** - * - * @return Vector containing selected columns as Integers + * Returns a list of selected columns. The list contains no duplicates but is + * not necessarily ordered. */ - public Vector getSelected() + public List getSelected() { return selected; } @@ -123,26 +129,11 @@ public class ColumnSelection } /** - * Column number at position i in selection - * - * @param i - * index into selected columns - * - * @return column number in alignment - */ - public int columnAt(int i) - { - return selected.elementAt(i).intValue(); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! + * Answers true if no columns are selected, else false */ - public int size() + public boolean isEmpty() { - return selected.size(); + return selected == null || selected.isEmpty(); } /** @@ -154,11 +145,11 @@ public class ColumnSelection { int max = -1; - for (int i = 0; i < selected.size(); i++) + for (int sel : getSelected()) { - if (columnAt(i) > max) + if (sel > max) { - max = columnAt(i); + max = sel; } } @@ -174,11 +165,11 @@ public class ColumnSelection { int min = 1000000000; - for (int i = 0; i < selected.size(); i++) + for (int sel : getSelected()) { - if (columnAt(i) < min) + if (sel < min) { - min = columnAt(i); + min = sel; } } @@ -196,9 +187,9 @@ public class ColumnSelection public List compensateForEdit(int start, int change) { List deletedHiddenColumns = null; - for (int i = 0; i < size(); i++) + for (int i = 0; i < selected.size(); i++) { - int temp = columnAt(i); + int temp = selected.get(i); if (temp >= start) { @@ -254,13 +245,13 @@ public class ColumnSelection */ private void compensateForDelEdits(int start, int change) { - for (int i = 0; i < size(); i++) + for (int i = 0; i < selected.size(); i++) { - int temp = columnAt(i); + int temp = selected.get(i); if (temp >= start) { - // if this ever changes to List.set(), swap parameter order!! + // if this ever changes to List.set(), must swap parameter order!!! selected.setElementAt(new Integer(temp - change), i); } } @@ -486,6 +477,7 @@ public class ColumnSelection /** * This Method is used to return all the HiddenColumn regions + * * @return empty list or List of hidden column intervals */ public List getHiddenColumns() @@ -637,14 +629,20 @@ public class ColumnSelection public void hideSelectedColumns() { - while (size() > 0) + while (!selected.isEmpty()) { - int column = getSelected().firstElement().intValue(); + int column = selected.get(0).intValue(); hideColumns(column); } } + /** + * Adds the specified column range to the hidden columns + * + * @param start + * @param end + */ public void hideColumns(int start, int end) { if (hiddenColumns == null) @@ -652,50 +650,68 @@ public class ColumnSelection hiddenColumns = new Vector(); } - boolean added = false; - boolean overlap = false; - + /* + * traverse existing hidden ranges and insert / amend / append as + * appropriate + */ for (int i = 0; i < hiddenColumns.size(); i++) { int[] region = hiddenColumns.elementAt(i); - if (start <= region[1] && end >= region[0]) + + if (end < region[0] - 1) { - hiddenColumns.removeElementAt(i); - overlap = true; - break; + /* + * insert discontiguous preceding range + */ + hiddenColumns.insertElementAt(new int[] { start, end }, i); + return; } - else if (end < region[0] && start < region[0]) + + if (end <= region[1]) { - hiddenColumns.insertElementAt(new int[] - { start, end }, i); - added = true; - break; + /* + * new range overlaps existing, or is contiguous preceding it - adjust + * start column + */ + region[0] = Math.min(region[0], start); + return; } - } - if (overlap) - { - hideColumns(start, end); - } - else if (!added) - { - hiddenColumns.addElement(new int[] - { start, end }); + if (start <= region[1] + 1) + { + /* + * new range overlaps existing, or is contiguous following it - adjust + * start and end columns + */ + region[0] = Math.min(region[0], start); + region[1] = Math.max(region[1], end); + return; + } } + /* + * remaining case is that the new range follows everything else + */ + hiddenColumns.addElement(new int[] { start, end }); } /** - * This method will find a range of selected columns around the column - * specified + * Hides the specified column and any adjacent selected columns * * @param res * int */ public void hideColumns(int col) { - // First find out range of columns to hide - int min = col, max = col + 1; + /* + * deselect column (whether selected or not!) + */ + removeElement(col); + + /* + * find adjacent selected columns + */ + int min = col - 1, max = col + 1; while (contains(min)) { removeElement(min); @@ -708,6 +724,9 @@ public class ColumnSelection max++; } + /* + * min, max are now the closest unselected columns + */ min++; max--; if (min > max) @@ -718,6 +737,9 @@ public class ColumnSelection hideColumns(min, max); } + /** + * Unhides, and adds to the selection list, all hidden columns + */ public void revealAllHiddenColumns() { if (hiddenColumns != null) @@ -735,12 +757,18 @@ public class ColumnSelection hiddenColumns = null; } - public void revealHiddenColumns(int res) + /** + * Reveals, and marks as selected, the hidden column range with the given + * start column + * + * @param start + */ + public void revealHiddenColumns(int start) { for (int i = 0; i < hiddenColumns.size(); i++) { int[] region = hiddenColumns.elementAt(i); - if (res == region[0]) + if (start == region[0]) { for (int j = region[0]; j < region[1] + 1; j++) { @@ -761,9 +789,8 @@ public class ColumnSelection { if (hiddenColumns != null) { - for (int i = 0; i < hiddenColumns.size(); i++) + for (int[] region : hiddenColumns) { - int[] region = hiddenColumns.elementAt(i); if (column >= region[0] && column <= region[1]) { return false; @@ -909,16 +936,14 @@ public class ColumnSelection } if (hideStart > vstart) { - visiblecontigs.add(new int[] - { vstart, hideStart - 1 }); + visiblecontigs.add(new int[] { vstart, hideStart - 1 }); } vstart = hideEnd + 1; } if (vstart < end) { - visiblecontigs.add(new int[] - { vstart, end - 1 }); + visiblecontigs.add(new int[] { vstart, end - 1 }); } int[] vcontigs = new int[visiblecontigs.size() * 2]; for (int i = 0, j = visiblecontigs.size(); i < j; i++) @@ -933,8 +958,7 @@ public class ColumnSelection } else { - return new int[] - { start, end - 1 }; + return new int[] { start, end - 1 }; } } @@ -975,7 +999,7 @@ public class ColumnSelection if (hiddenColumns != null && hiddenColumns.size() > 0) { // then mangle the alignmentAnnotation annotation array - Vector annels = new Vector(); + Vector annels = new Vector(); Annotation[] els = null; List regions = getHiddenColumns(); int blockStart = start, blockEnd = end; @@ -1035,7 +1059,7 @@ public class ColumnSelection alignmentAnnotation.annotations = new Annotation[w]; w = 0; - for (Annotation [] chnk : annels) + for (Annotation[] chnk : annels) { System.arraycopy(chnk, 0, alignmentAnnotation.annotations, w, chnk.length); @@ -1082,7 +1106,7 @@ public class ColumnSelection */ public void addElementsFrom(ColumnSelection colsel) { - if (colsel != null && colsel.size() > 0) + if (colsel != null && !colsel.isEmpty()) { for (Integer col : colsel.getSelected()) { @@ -1138,7 +1162,7 @@ public class ColumnSelection * profileseq marked as hidden. */ public static ColumnSelection propagateInsertions(SequenceI profileseq, - Alignment al, AlignmentView input) + AlignmentI al, AlignmentView input) { int profsqpos = 0; @@ -1284,7 +1308,7 @@ public class ColumnSelection { return hiddenColumns != null && hiddenColumns.size() > 0; } - + /** * * @return true if there are more than one set of columns hidden @@ -1308,7 +1332,7 @@ public class ColumnSelection hideColumns(r[0], r[1]); } } - + public boolean filterAnnotations(Annotation[] annotations, AnnotationFilterParameter filterParams) {