X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FAlignmentViewport.java;h=302b0eff2ff7491fdd74f7d9dc8e4fcfee249d00;hb=c777b335d0332979123446f431b7f0c160eb4880;hp=1270c153af4efaf9f397cfca4c8d9df80beac3c5;hpb=c640b1c17cbfbc41723b0441f049cd416267dcc3;p=jalview.git diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index 1270c15..302b0ef 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -46,6 +46,8 @@ import jalview.datamodel.AlignmentView; import jalview.datamodel.Annotation; import jalview.datamodel.CigarArray; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenSequences; +import jalview.datamodel.SearchResults; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceCollectionI; import jalview.datamodel.SequenceGroup; @@ -57,6 +59,8 @@ import jalview.schemes.ResidueProperties; import jalview.structure.CommandListener; import jalview.structure.StructureSelectionManager; import jalview.structure.VamsasSource; +import jalview.util.Comparison; +import jalview.util.MappingUtils; import jalview.viewmodel.styles.ViewStyle; import jalview.workers.AlignCalcManager; import jalview.workers.ComplementConsensusThread; @@ -71,7 +75,7 @@ import jalview.workers.StrucConsensusThread; * */ public abstract class AlignmentViewport implements AlignViewportI, - ViewStyleI, CommandListener, VamsasSource + CommandListener, VamsasSource { protected ViewStyleI viewStyle = new ViewStyle(); @@ -502,15 +506,6 @@ public abstract class AlignmentViewport implements AlignViewportI, } /** - * @param selected - * @see jalview.api.ViewStyleI#setShowSeqFeaturesHeight(boolean) - */ - public void setShowSeqFeaturesHeight(boolean selected) - { - viewStyle.setShowSeqFeaturesHeight(selected); - } - - /** * alignment displayed in the viewport. Please use get/setter */ protected AlignmentI alignment; @@ -1196,6 +1191,20 @@ public abstract class AlignmentViewport implements AlignViewportI, protected boolean showAutocalculatedAbove; /** + * when set, view will scroll to show the highlighted position + */ + private boolean followHighlight = true; + + // TODO private with getters and setters? + public int startRes; + + public int endRes; + + public int startSeq; + + public int endSeq; + + /** * Property change listener for changes in alignment * * @param listener @@ -2075,7 +2084,7 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public void setShowSequenceFeaturesHeight(boolean selected) { - viewStyle.setShowSeqFeaturesHeight(selected); + viewStyle.setShowSequenceFeaturesHeight(selected); } @Override @@ -2175,14 +2184,6 @@ public abstract class AlignmentViewport implements AlignViewportI, { return viewStyle.isShowColourText(); } - /** - * @return - * @see jalview.api.ViewStyleI#isShowSeqFeaturesHeight() - */ - public boolean isShowSeqFeaturesHeight() - { - return viewStyle.isShowSeqFeaturesHeight(); - } /** * @param conservationColourSelected @@ -2411,4 +2412,162 @@ public abstract class AlignmentViewport implements AlignViewportI, { this.showAutocalculatedAbove = showAutocalculatedAbove; } + + @Override + public boolean isScaleProteinAsCdna() + { + return viewStyle.isScaleProteinAsCdna(); + } + + @Override + public void setScaleProteinAsCdna(boolean b) + { + viewStyle.setScaleProteinAsCdna(b); + } + + /** + * @return true if view should scroll to show the highlighted region of a + * sequence + * @return + */ + @Override + public final boolean isFollowHighlight() + { + return followHighlight; + } + + @Override + public final void setFollowHighlight(boolean b) + { + this.followHighlight = b; + } + + public int getStartRes() + { + return startRes; + } + + public int getEndRes() + { + return endRes; + } + + public int getStartSeq() + { + return startSeq; + } + + public void setStartRes(int res) + { + this.startRes = res; + } + + public void setStartSeq(int seq) + { + this.startSeq = seq; + } + + public void setEndRes(int res) + { + if (res > alignment.getWidth() - 1) + { + // log.System.out.println(" Corrected res from " + res + " to maximum " + + // (alignment.getWidth()-1)); + res = alignment.getWidth() - 1; + } + if (res < 0) + { + res = 0; + } + this.endRes = res; + } + + public void setEndSeq(int seq) + { + if (seq > alignment.getHeight()) + { + seq = alignment.getHeight(); + } + if (seq < 0) + { + seq = 0; + } + this.endSeq = seq; + } + + public int getEndSeq() + { + return endSeq; + } + + /** + * Helper method to populate the SearchResults with the location in the + * complementary alignment to scroll to, in order to match this one. + * + * @param sr + * the SearchResults to add to + * @return the offset (below top of visible region) of the matched sequence + */ + protected int findComplementScrollTarget(SearchResults sr) + { + final AlignViewportI codingComplement = getCodingComplement(); + if (codingComplement == null || !codingComplement.isFollowHighlight()) + { + return 0; + } + boolean iAmProtein = !getAlignment().isNucleotide(); + AlignmentI proteinAlignment = iAmProtein ? getAlignment() + : codingComplement.getAlignment(); + if (proteinAlignment == null) + { + return 0; + } + final Set mappings = proteinAlignment + .getCodonFrames(); + + /* + * Heuristic: find the first mapped sequence (if any) with a non-gapped + * residue in the middle column of the visible region. Scroll the + * complementary alignment to line up the corresponding residue. + */ + int seqOffset = 0; + SequenceI sequence = null; + + /* + * locate 'middle' column (true middle if an odd number visible, left of + * middle if an even number visible) + */ + int middleColumn = getStartRes() + (getEndRes() - getStartRes()) / 2; + final HiddenSequences hiddenSequences = getAlignment() + .getHiddenSequences(); + for (int seqNo = getStartSeq(); seqNo < getEndSeq(); seqNo++, seqOffset++) + { + sequence = getAlignment().getSequenceAt(seqNo); + if (hiddenSequences != null && hiddenSequences.isHidden(sequence)) + { + continue; + } + if (Comparison.isGap(sequence.getCharAt(middleColumn))) + { + continue; + } + List seqMappings = MappingUtils + .findMappingsForSequence(sequence, mappings); + if (!seqMappings.isEmpty()) + { + break; + } + } + + if (sequence == null) + { + /* + * No ungapped mapped sequence in middle column - do nothing + */ + return 0; + } + MappingUtils.addSearchResults(sr, sequence, + sequence.findPosition(middleColumn), mappings); + return seqOffset; + } }