X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fcontroller%2FAlignViewController.java;h=329267ee4678603f86b384f10858366e5a50a2c7;hb=5146792501661f7d07d4357651cb1b04fd4d9a46;hp=45ab9c466cc40f0924fe0c09c71491b02d1d2e07;hpb=60504d4176b00ae80fb98a738d33429865ff137b;p=jalview.git diff --git a/src/jalview/controller/AlignViewController.java b/src/jalview/controller/AlignViewController.java index 45ab9c4..329267e 100644 --- a/src/jalview/controller/AlignViewController.java +++ b/src/jalview/controller/AlignViewController.java @@ -1,10 +1,18 @@ package jalview.controller; import java.awt.Color; +import java.util.BitSet; +import java.util.List; +import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.AnnotatedCollectionI; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.SequenceCollectionI; +import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; @@ -102,5 +110,148 @@ public class AlignViewController implements AlignViewControllerI } return false; } - + + @Override + public boolean markColumnsContainingFeatures(boolean invert, boolean extendCurrent, boolean toggle, String featureType) + { + // JBPNote this routine could also mark rows, not just columns. + // need a decent query structure to allow all types of feature searches + BitSet bs = new BitSet(); + int alw,alStart; + SequenceCollectionI sqcol = (viewport.getSelectionGroup() == null ? viewport.getAlignment() : viewport.getSelectionGroup()); + alStart = sqcol.getStartRes(); + alw = sqcol.getEndRes()+1; + List seqs = sqcol.getSequences(); + int nseq = 0; + for (SequenceI sq : seqs) + { + int tfeat = 0; + if (sq != null) + { + SequenceI dsq = sq.getDatasetSequence(); + while (dsq.getDatasetSequence() != null) + { + dsq = dsq.getDatasetSequence(); + } + ; + SequenceFeature[] sf = dsq.getSequenceFeatures(); + if (sf != null) + { + int ist = sq.findIndex(sq.getStart()); + int iend = sq.findIndex(sq.getEnd()); + if (iend < alStart || ist> alw) + { + // sequence not in region + continue; + } + for (SequenceFeature sfpos : sf) + { + // future functionalty - featureType == null means mark columns + // containing all displayed features + if (sfpos != null && (featureType.equals(sfpos.getType()))) + { + tfeat++; + // optimisation - could consider 'spos,apos' like cursor argument + // - findIndex wastes time by starting from first character and + // counting + + int i = sq.findIndex(sfpos.getBegin()); + int j = sq.findIndex(sfpos.getEnd()); + if (jalw) + { + // feature is outside selected region + continue; + } + if (i < alStart) + { + i = alStart; + } + if (i< ist) { + i = ist; + } + if (j > alw) + { + j = alw; + } + for (; i <= j; i++) + { + bs.set(i - 1); + } + } + } + } + + if (tfeat > 0) + { + nseq++; + } + } + } + ColumnSelection cs = viewport.getColumnSelection(); + if (bs.cardinality() > 0 || invert) + { + if (cs == null) + { + cs = new ColumnSelection(); + } else { + if (!extendCurrent) + { + cs.clear(); + } + } + if (invert) + { + // invert only in the currently selected sequence region + for (int i = bs.nextClearBit(alStart), ibs = bs.nextSetBit(alStart); i >= alStart + && i < (alw);) + { + if (ibs < 0 || i < ibs) + { + if (toggle && cs.contains(i)) + { + cs.removeElement(i++); + } else + { + cs.addElement(i++); + } + } + else + { + i = bs.nextClearBit(ibs); + ibs = bs.nextSetBit(i); + } + } + } + else + { + for (int i = bs.nextSetBit(alStart); i >= alStart; i = bs.nextSetBit(i + 1)) + { + if (toggle && cs.contains(i)) + { + cs.removeElement(i); + } else + { + cs.addElement(i); + } + } + } + viewport.setColumnSelection(cs); + alignPanel.paintAlignment(true); + avcg.setStatus((toggle ? "Toggled ": "Marked ") + + (invert ? (alw-alStart) - bs.cardinality() : bs.cardinality()) + + " columns "+(invert ? "not " : "") + "containing features of type " + featureType + + " across " + nseq + " sequence(s)"); + return true; + } + else + { + avcg.setStatus("No features of type " + featureType + " found."); + if (!extendCurrent && cs!=null) + { + cs.clear(); + alignPanel.paintAlignment(true); + } + return false; + } } +}