X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=c2327819c81923ce95e11d96da730e9544718cc4;hb=e224b72118c12cd77ae96f0f8d86c123e0416dc7;hp=c23b77285db81afb5540345ce8d503acfbe59bf9;hpb=964c6de914dd7b2ef51feeb0d374cca23742f3ef;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index c23b772..c232781 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -20,6 +20,7 @@ */ package jalview.datamodel; +import jalview.util.Comparison; import jalview.util.ShiftList; import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField; @@ -207,6 +208,7 @@ public class ColumnSelection } IntList selected = new IntList(); + /* * list of hidden column [start, end] ranges; the list is maintained in * ascending start column order @@ -741,8 +743,9 @@ public class ColumnSelection public void hideSelectedColumns() { - synchronized (selected) { - for (int[] selregions:selected.getRanges()) + synchronized (selected) + { + for (int[] selregions : selected.getRanges()) { hideColumns(selregions[0], selregions[1]); } @@ -806,7 +809,7 @@ public class ColumnSelection /* * remaining case is that the new range follows everything else */ - hiddenColumns.addElement(new int[] { start, end }); + hiddenColumns.addElement(new int[] { start, end }); } /** @@ -1077,6 +1080,76 @@ public class ColumnSelection } /** + * Locate the first and last position visible for this sequence. if seq isn't + * visible then return the position of the left and right of the hidden + * boundary region + * + * @param seq + * @return int[] { visible start, visible end, first seqpos, last seqpos } + */ + public int[] locateVisibleBoundsOfSequence(SequenceI seq) + { + int fpos=seq.getStart(),lpos= seq.getEnd(); + int start = 0; + int end = seq.getLength(); + + if (hiddenColumns == null || hiddenColumns.size() == 0) + { + return new int[] { seq.findIndex(fpos), seq.findIndex(lpos), fpos, + lpos }; + } + + // Simply walk along the sequence whilst watching for hidden column + // boundaries + List regions = getHiddenColumns(); + int spos = fpos, lastvispos = -1, rcount = 0, hideStart = seq + .getLength(), hideEnd = -1; + int visPrev = 0, visNext = 0, base = 0; + boolean foundStart = false; + for (int p = 0, pLen = seq.getLength(); spos <= seq.getEnd() + && p < pLen; p++) + { + if (!Comparison.isGap(seq.getCharAt(p))) + { + // update hidden region start/end + while (hideEnd < p && rcount < regions.size()) + { + int[] region = regions.get(rcount++); + visNext += region[1] + 1 - region[0]; + visPrev = visNext-1; + hideStart = region[0]; + hideEnd = region[1]; + } + if (hideEnd < p) + { + hideStart = seq.getLength(); + } + // update visible boundary for sequence + if (p < hideStart) + { + if (!foundStart) + { + fpos = spos; + start = p; + foundStart = true; + } + lastvispos = p; + lpos = spos; + } + // look for next sequence position + spos++; + } + } + if (foundStart) + { + return new int[] { findColumnPosition(start), + findColumnPosition(lastvispos), fpos, lpos }; + } + // otherwise, sequence was completely hidden + return new int[] { visPrev, visNext, 0, 0 }; + } + + /** * delete any columns in alignmentAnnotation that are hidden (including * sequence associated annotation). * @@ -1447,6 +1520,8 @@ public class ColumnSelection public boolean filterAnnotations(Annotation[] annotations, AnnotationFilterParameter filterParams) { + // JBPNote - this method needs to be refactored to become independent of + // viewmodel package this.revealAllHiddenColumns(); this.clear(); int count = 0; @@ -1528,4 +1603,5 @@ public class ColumnSelection } while (count < annotations.length); return false; } + }