X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=e3a8472059d3dabb7525ce8667f1c3a381695130;hb=d645ed1944459b6271dea2a8511a1e0f4f997530;hp=c23b77285db81afb5540345ce8d503acfbe59bf9;hpb=964c6de914dd7b2ef51feeb0d374cca23742f3ef;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index c23b772..e3a8472 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,84 @@ 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, and the corresponding alignment column indices for the + * extent of the sequence + * + * @param seq + * @return int[] { visible start, visible end, first seqpos, last seqpos, + * alignment index for seq start, alignment index for seq end } + */ + public int[] locateVisibleBoundsOfSequence(SequenceI seq) + { + int fpos=seq.getStart(),lpos= seq.getEnd(); + int start = 0; + + if (hiddenColumns == null || hiddenColumns.size() == 0) + { + int ifpos = seq.findIndex(fpos) - 1, ilpos = seq.findIndex(lpos) - 1; + return new int[] { ifpos, ilpos, fpos, lpos, ifpos, ilpos }; + } + + // 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, firstP = -1, lastP = -1; + boolean foundStart = false; + for (int p = 0, pLen = seq.getLength(); spos <= seq.getEnd() + && p < pLen; p++) + { + if (!Comparison.isGap(seq.getCharAt(p))) + { + // keep track of first/last column + // containing sequence data regardless of visibility + if (firstP == -1) + { + firstP = p; + } + lastP = p; + // update hidden region start/end + while (hideEnd < p && rcount < regions.size()) + { + int[] region = regions.get(rcount++); + visPrev = visNext; + visNext += region[0] - visPrev; + 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, firstP, lastP }; + } + // otherwise, sequence was completely hidden + return new int[] { visPrev, visNext, 0, 0, firstP, lastP }; + } + + /** * delete any columns in alignmentAnnotation that are hidden (including * sequence associated annotation). * @@ -1447,6 +1528,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 +1611,5 @@ public class ColumnSelection } while (count < annotations.length); return false; } + }