X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=235c81f068ed8eb17a226e1c780e95bc86b0383e;hb=134576f5b34894218bdc4c5ce5e27fa18ad973bd;hp=beafa8cb36ed9b916ef9fc2e185f519ef475be46;hpb=be32c14cd8e48fe0a207cd7030cb9cd46f894678;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index beafa8c..235c81f 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -25,7 +25,7 @@ import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; -import jalview.datamodel.SearchResults; +import jalview.datamodel.SearchResultsI; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; @@ -34,6 +34,7 @@ import jalview.math.AlignmentDimension; import jalview.schemes.ResidueProperties; import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; +import jalview.util.Platform; import java.awt.BorderLayout; import java.awt.Color; @@ -42,6 +43,7 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; +import java.awt.Insets; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.print.PageFormat; @@ -52,6 +54,7 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; +import java.util.List; import javax.swing.SwingUtilities; @@ -73,6 +76,7 @@ public class AlignmentPanel extends GAlignmentPanel implements private IdPanel idPanel; private boolean headless; + IdwidthAdjuster idwidthAdjuster; /** DOCUMENT ME!! */ @@ -91,6 +95,14 @@ public class AlignmentPanel extends GAlignmentPanel implements int vextent = 0; + /* + * Flag set while scrolling to follow complementary cDNA/protein scroll. When + * true, suppresses invoking the same method recursively. + */ + private boolean dontScrollComplement; + + private PropertyChangeListener propertyChangeListener; + /** * Creates a new AlignmentPanel object. * @@ -125,8 +137,9 @@ public class AlignmentPanel extends GAlignmentPanel implements vscroll.addAdjustmentListener(this); final AlignmentPanel ap = this; - av.addPropertyChangeListener(new PropertyChangeListener() + propertyChangeListener = new PropertyChangeListener() { + @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("alignment")) @@ -135,7 +148,8 @@ public class AlignmentPanel extends GAlignmentPanel implements alignmentChanged(); } } - }); + }; + av.addPropertyChangeListener(propertyChangeListener); fontChanged(); adjustAnnotationHeight(); updateLayout(); @@ -146,6 +160,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { return av; } + public void alignmentChanged() { av.alignmentChanged(this); @@ -168,8 +183,7 @@ public class AlignmentPanel extends GAlignmentPanel implements scalePanelHolder.setPreferredSize(new Dimension(10, av.getCharHeight() + fm.getDescent())); idSpaceFillerPanel1.setPreferredSize(new Dimension(10, av - .getCharHeight() - + fm.getDescent())); + .getCharHeight() + fm.getDescent())); getIdPanel().getIdCanvas().gg = null; getSeqPanel().seqCanvas.img = null; @@ -283,40 +297,59 @@ public class AlignmentPanel extends GAlignmentPanel implements * Highlight the given results on the alignment. * */ - public void highlightSearchResults(SearchResults results) + public void highlightSearchResults(SearchResultsI results) { scrollToPosition(results); getSeqPanel().seqCanvas.highlightSearchResults(results); } /** - * scroll the view to show the position of the highlighted region in results + * Scroll the view to show the position of the highlighted region in results * (if any) and redraw the overview * * @param results */ - public boolean scrollToPosition(SearchResults results) + public boolean scrollToPosition(SearchResultsI results) + { + return scrollToPosition(results, 0, true, false); + } + + /** + * Scroll the view to show the position of the highlighted region in results + * (if any) + * + * @param searchResults + * @param redrawOverview + * @return + */ + public boolean scrollToPosition(SearchResultsI searchResults, + boolean redrawOverview) { - return scrollToPosition(results, true); + return scrollToPosition(searchResults, 0, redrawOverview, false); } /** - * scroll the view to show the position of the highlighted region in results + * Scroll the view to show the position of the highlighted region in results * (if any) * * @param results + * @param verticalOffset + * if greater than zero, allows scrolling to a position below the + * first displayed sequence * @param redrawOverview * - when set, the overview will be recalculated (takes longer) + * @param centre + * if true, try to centre the search results horizontally in the view * @return false if results were not found */ - public boolean scrollToPosition(SearchResults results, - boolean redrawOverview) + public boolean scrollToPosition(SearchResultsI results, + int verticalOffset, boolean redrawOverview, boolean centre) { - int startv, endv, starts, ends, width; + int startv, endv, starts, ends; // TODO: properly locate search results in view when large numbers of hidden // columns exist before highlighted region // do we need to scroll the panel? - // TODO: tons of nullpointereexceptions raised here. + // TODO: tons of nullpointerexceptions raised here. if (results != null && results.getSize() > 0 && av != null && av.getAlignment() != null) { @@ -334,8 +367,20 @@ public class AlignmentPanel extends GAlignmentPanel implements } int start = r[0]; int end = r[1]; - // System.err.println("Seq : "+seqIndex+" Scroll to "+start+","+end); // // DEBUG + // System.err.println(this.av.viewName + " Seq : " + seqIndex + // + " Scroll to " + start + "," + end); + + /* + * To centre results, scroll to positions half the visible width + * left/right of the start/end positions + */ + if (centre) + { + int offset = (av.getEndRes() - av.getStartRes() + 1) / 2 - 1; + start = Math.max(start - offset, 0); + end = end + offset - 1; + } if (start < 0) { return false; @@ -357,24 +402,50 @@ public class AlignmentPanel extends GAlignmentPanel implements } } } + + /* + * allow for offset of target sequence (actually scroll to one above it) + */ + seqIndex = Math.max(0, seqIndex - verticalOffset); + + // System.out.println("start=" + start + ", end=" + end + ", startv=" + // + av.getStartRes() + ", endv=" + av.getEndRes() + ", starts=" + // + av.getStartSeq() + ", ends=" + av.getEndSeq()); if (!av.getWrapAlignment()) { if ((startv = av.getStartRes()) >= start) { - setScrollValues(start - 1, seqIndex); + /* + * Scroll left to make start of search results visible + */ + // setScrollValues(start - 1, seqIndex); // plus one residue + setScrollValues(start, seqIndex); } else if ((endv = av.getEndRes()) <= end) { - setScrollValues(startv + 1 + end - endv, seqIndex); + /* + * Scroll right to make end of search results visible + */ + // setScrollValues(startv + 1 + end - endv, seqIndex); // plus one + setScrollValues(startv + end - endv, seqIndex); } else if ((starts = av.getStartSeq()) > seqIndex) { + /* + * Scroll up to make start of search results visible + */ setScrollValues(av.getStartRes(), seqIndex); } else if ((ends = av.getEndSeq()) <= seqIndex) { + /* + * Scroll down to make end of search results visible + */ setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); } + /* + * Else results are already visible - no need to scroll + */ } else { @@ -442,6 +513,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * automatically adjust annotation panel height for new annotation whilst * ensuring the alignment is still visible. */ + @Override public void adjustAnnotationHeight() { // TODO: display vertical annotation scrollbar if necessary @@ -461,47 +533,50 @@ public class AlignmentPanel extends GAlignmentPanel implements */ protected void validateAnnotationDimensions(boolean adjustPanelHeight) { - int height = getAnnotationPanel().adjustPanelHeight(); - - int theight = av.getCharHeight() - * (av.getAlignment().getHeight() + (!av.hasHiddenRows() ? 0 - : av.getAlignment().getHiddenSequences().getSize())); - float sscaling = (float) (theight / (1.0 * theight + height)); - float ascaling = (float) (height * 1.0 / alignFrame.getHeight()); - int rheight = alignFrame.getHeight() - height - av.getCharHeight(); + int annotationHeight = getAnnotationPanel().adjustPanelHeight(); + if (adjustPanelHeight) { - // NOTE: this logic is different in the applet. Need a better algorithm to - // define behaviour - // try and set height according to alignment - if (ascaling > 0 && sscaling < 0.5) - { - // if the alignment is too big then - // default is 0.5 split - height = alignFrame.getHeight() / 2; - } - else + int rowHeight = av.getCharHeight(); + int alignmentHeight = rowHeight * av.getAlignment().getHeight(); + + /* + * Estimate available height in the AlignFrame for alignment + + * annotations. Deduct an estimate for title bar, menu bar, scale panel, + * hscroll, status bar (as these are not laid out we can't inspect their + * actual heights). Insets gives frame borders. + */ + int stuff = Platform.isAMac() ? 80 : 100; + Insets insets = alignFrame.getInsets(); + int availableHeight = alignFrame.getHeight() - stuff - insets.top + - insets.bottom; + + /* + * If not enough vertical space, maximize annotation height while keeping + * at least two rows of alignment visible + */ + if (annotationHeight + alignmentHeight > availableHeight) { - // if space for more than one sequence row left when annotation is fully - // displayed then set height to annotation height - // otherwise, leave at least two lines of sequence shown. - height = (rheight > av.getCharHeight()) ? height - : (-av.getCharHeight() * 3 + (int) (alignFrame.getHeight() * (1 - sscaling))); + annotationHeight = Math.min(annotationHeight, availableHeight - 2 + * rowHeight); } } else { // maintain same window layout whilst updating sliders - height = annotationScroller.getSize().height; + annotationHeight = annotationScroller.getSize().height; } hscroll.addNotify(); annotationScroller.setPreferredSize(new Dimension(annotationScroller - .getWidth(), height)); + .getWidth(), annotationHeight)); + + Dimension e = idPanel.getSize(); + alabels.setSize(new Dimension(e.width, annotationHeight)); annotationSpaceFillerHolder.setPreferredSize(new Dimension( - annotationSpaceFillerHolder.getWidth(), height)); - annotationScroller.validate();// repaint(); + annotationSpaceFillerHolder.getWidth(), annotationHeight)); + annotationScroller.validate(); annotationScroller.addNotify(); } @@ -606,14 +681,14 @@ public class AlignmentPanel extends GAlignmentPanel implements * Adjust row/column scrollers to show a visible position in the alignment. * * @param x - * visible column to scroll to DOCUMENT ME! + * visible column to scroll to * @param y * visible row to scroll to * */ public void setScrollValues(int x, int y) { - // System.err.println("Scroll to "+x+","+y); + // System.err.println("Scroll " + this.av.viewName + " to " + x + "," + y); if (av == null || av.getAlignment() == null) { return; @@ -662,7 +737,14 @@ public class AlignmentPanel extends GAlignmentPanel implements x = 0; } + /* + * each scroll adjustment triggers adjustmentValueChanged, which resets the + * 'do not scroll complement' flag; ensure it is the same for both + * operations + */ + boolean flag = isDontScrollComplement(); hscroll.setValues(x, hextent, 0, width); + setDontScrollComplement(flag); vscroll.setValues(y, vextent, 0, height); } @@ -672,6 +754,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param evt * DOCUMENT ME! */ + @Override public void adjustmentValueChanged(AdjustmentEvent evt) { int oldX = av.getStartRes(); @@ -681,7 +764,8 @@ public class AlignmentPanel extends GAlignmentPanel implements { int x = hscroll.getValue(); av.setStartRes(x); - av.setEndRes((x + (getSeqPanel().seqCanvas.getWidth() / av.getCharWidth())) - 1); + av.setEndRes((x + (getSeqPanel().seqCanvas.getWidth() / av + .getCharWidth())) - 1); } if (evt.getSource() == vscroll) @@ -704,6 +788,7 @@ public class AlignmentPanel extends GAlignmentPanel implements // as preference setting SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { setScrollValues(av.getStartRes(), av.getStartSeq()); @@ -756,23 +841,36 @@ public class AlignmentPanel extends GAlignmentPanel implements } } } + /* + * If there is one, scroll the (Protein/cDNA) complementary alignment to + * match, unless we are ourselves doing that. + */ + if (isDontScrollComplement()) + { + setDontScrollComplement(false); + } + else + { + av.scrollComplementaryAlignment(); + } } /** * Repaint the alignment including the annotations and overview panels (if * shown). */ + @Override public void paintAlignment(boolean updateOverview) { final AnnotationSorter sorter = new AnnotationSorter(getAlignment(), av.isShowAutocalculatedAbove()); - sorter.sort(getAlignment() - .getAlignmentAnnotation(), + sorter.sort(getAlignment().getAlignmentAnnotation(), av.getSortAnnotationsBy()); repaint(); if (updateOverview) { + // TODO: determine if this paintAlignment changed structure colours av.getStructureSelectionManager().sequenceColoursChanged(this); if (overviewPanel != null) @@ -788,6 +886,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param g * DOCUMENT ME! */ + @Override public void paintComponent(Graphics g) { invalidate(); @@ -797,6 +896,12 @@ public class AlignmentPanel extends GAlignmentPanel implements hscrollFillerPanel.setPreferredSize(new Dimension(d.width, 12)); validate(); + /* + * set scroll bar positions; first suppress this being 'followed' in any + * complementary split pane + */ + setDontScrollComplement(true); + if (av.getWrapAlignment()) { int maxwidth = av.getAlignment().getWidth(); @@ -840,6 +945,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @throws PrinterException * DOCUMENT ME! */ + @Override public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException { @@ -850,11 +956,11 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getWrapAlignment()) { - return printWrappedAlignment(pg, pwidth, pheight, pi); + return printWrappedAlignment(pwidth, pheight, pi, pg); } else { - return printUnwrapped(pg, pwidth, pheight, pi); + return printUnwrapped(pwidth, pheight, pi, pg); } } @@ -875,16 +981,28 @@ public class AlignmentPanel extends GAlignmentPanel implements * @throws PrinterException * DOCUMENT ME! */ - public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi) + public int printUnwrapped(int pwidth, int pheight, int pi, + Graphics... pg) throws PrinterException { + boolean isMultiGraphics = pg.length > 1; + int G0 = 0; // Graphic index of idPanel graphics in multi-graphics mode or + // entire graphics for non mulit-graphics mode + int G1 = 0; // Graphic index of alignmentPanel graphics for multi-graphics + // mode + if (isMultiGraphics) + { + G0 = 0; + G1 = 1; + } + int idWidth = getVisibleIdWidth(false); FontMetrics fm = getFontMetrics(av.getFont()); int scaleHeight = av.getCharHeight() + fm.getDescent(); - pg.setColor(Color.white); - pg.fillRect(0, 0, pwidth, pheight); - pg.setFont(av.getFont()); + pg[G0].setColor(Color.white); + pg[G0].fillRect(0, 0, pwidth, pheight); + pg[G0].setFont(av.getFont()); // ////////////////////////////////// // / How many sequences and residues can we fit on a printable page? @@ -941,17 +1059,31 @@ public class AlignmentPanel extends GAlignmentPanel implements } // draw Scale - pg.translate(idWidth, 0); - getScalePanel().drawScale(pg, startRes, endRes, pwidth - idWidth, - scaleHeight); - pg.translate(-idWidth, scaleHeight); + if (isMultiGraphics) + { + pg[G1].translate(0, 0); + getScalePanel().drawScale(pg[G1], startRes, endRes, + pwidth - idWidth, scaleHeight); + pg[G1].translate(-idWidth, scaleHeight); + } + else + { + pg[G0].translate(idWidth, 0); + getScalePanel().drawScale(pg[G0], startRes, endRes, pwidth - idWidth, + scaleHeight); + pg[G0].translate(-idWidth, scaleHeight); + } // ////////////// // Draw the ids Color currentColor = null; Color currentTextColor = null; - pg.setFont(getIdPanel().getIdCanvas().getIdfont()); + if (isMultiGraphics) + { + pg[G0].translate(0, scaleHeight); + } + pg[G0].setFont(getIdPanel().getIdCanvas().getIdfont()); SequenceI seq; for (int i = startSeq; i < endSeq; i++) @@ -969,46 +1101,70 @@ public class AlignmentPanel extends GAlignmentPanel implements currentTextColor = Color.black; } - pg.setColor(currentColor); - pg.fillRect(0, (i - startSeq) * av.getCharHeight(), idWidth, + pg[G0].setColor(currentColor); + pg[G0].fillRect(0, (i - startSeq) * av.getCharHeight(), idWidth, av.getCharHeight()); - pg.setColor(currentTextColor); + pg[G0].setColor(currentTextColor); int xPos = 0; if (av.isRightAlignIds()) { - fm = pg.getFontMetrics(); + fm = pg[G0].getFontMetrics(); xPos = idWidth - fm.stringWidth(seq.getDisplayId(av.getShowJVSuffix())) - 4; } - pg.drawString( - seq.getDisplayId(av.getShowJVSuffix()), - xPos, + pg[G0].drawString(seq.getDisplayId(av.getShowJVSuffix()), xPos, (((i - startSeq) * av.getCharHeight()) + av.getCharHeight()) - (av.getCharHeight() / 5)); } - pg.setFont(av.getFont()); + pg[G0].setFont(av.getFont()); + // draw main sequence panel - pg.translate(idWidth, 0); - getSeqPanel().seqCanvas.drawPanel(pg, startRes, endRes, startSeq, endSeq, 0); + pg[G0].translate(idWidth, 0); + if (isMultiGraphics) + { + pg[G1].translate(idWidth, 0); + getSeqPanel().seqCanvas.drawPanel(pg[G1], startRes, endRes, + startSeq, endSeq, 0); + } + else + { + getSeqPanel().seqCanvas.drawPanel(pg[G0], startRes, endRes, startSeq, + endSeq, 0); + } if (av.isShowAnnotation() && (endSeq == av.getAlignment().getHeight())) { - // draw annotation - need to offset for current scroll position + // draw annotation label - need to offset for current scroll position int offset = -getAlabels().getScrollOffset(); - pg.translate(0, offset); - pg.translate(-idWidth - 3, (endSeq - startSeq) * av.getCharHeight() - + 3); - getAlabels().drawComponent(pg, idWidth); - pg.translate(idWidth + 3, 0); - getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), av, - pg, -1, startRes, endRes + 1); - pg.translate(0, -offset); + pg[G0].translate(0, offset); + pg[G0].translate(-idWidth - 3, + (endSeq - startSeq) * av.getCharHeight() + 3); + getAlabels().drawComponent(pg[G0], idWidth); + pg[G0].translate(idWidth + 3, 0); + pg[G0].translate(0, -offset); + if (isMultiGraphics) + { + // draw annotation - need to offset for current scroll position + // pg[G1].translate(0, offset); + pg[G1].translate(-idWidth - 3, + (endSeq - startSeq) * av.getCharHeight() + 3); + pg[G1].translate(idWidth + 3, 0); + getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), + av, pg[G1], -1, startRes, endRes + 1); + pg[G1].translate(0, -offset); + } + else + { + getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), + av, pg[G0], -1, startRes, endRes + 1); + pg[G0].translate(0, -offset); + } } return Printable.PAGE_EXISTS; @@ -1031,8 +1187,8 @@ public class AlignmentPanel extends GAlignmentPanel implements * @throws PrinterException * DOCUMENT ME! */ - public int printWrappedAlignment(Graphics pg, int pwidth, int pheight, - int pi) throws PrinterException + public int printWrappedAlignment(int pwidth, int pheight, int pi, + Graphics pg) throws PrinterException { int annotationHeight = 0; AnnotationLabels labels = null; @@ -1097,12 +1253,14 @@ public class AlignmentPanel extends GAlignmentPanel implements } if (labels != null) { - pg.translate(-3, ypos - + (av.getAlignment().getHeight() * av.getCharHeight())); + pg.translate(-3, + ypos + (av.getAlignment().getHeight() * av.getCharHeight())); pg.setFont(av.getFont()); labels.drawComponent(pg, idWidth); - pg.translate(+3, -ypos + pg.translate( + +3, + -ypos - (av.getAlignment().getHeight() * av .getCharHeight())); } @@ -1112,8 +1270,8 @@ public class AlignmentPanel extends GAlignmentPanel implements pg.translate(idWidth, 0); - getSeqPanel().seqCanvas.drawWrappedPanel(pg, pwidth - idWidth, totalHeight, - 0); + getSeqPanel().seqCanvas.drawWrappedPanel(pg, pwidth - idWidth, + totalHeight, 0); if ((pi * pheight) < totalHeight) { @@ -1165,14 +1323,18 @@ public class AlignmentPanel extends GAlignmentPanel implements void makeAlignmentImage(jalview.util.ImageMaker.TYPE type, File file) { - long progress = System.currentTimeMillis(); + int boarderBottomOffset = 5; + long pSessionId = System.currentTimeMillis(); headless = (System.getProperty("java.awt.headless") != null && System .getProperty("java.awt.headless").equals("true")); if (alignFrame != null && !headless) { - alignFrame.setProgressBar(MessageManager.formatMessage( - "status.saving_file", new Object[] - { type.getLabel() }), progress); + if (file != null) + { + alignFrame.setProgressBar(MessageManager.formatMessage( + "status.saving_file", new Object[] { type.getLabel() }), + pSessionId); + } } try { @@ -1198,14 +1360,16 @@ public class AlignmentPanel extends GAlignmentPanel implements } im = new jalview.util.ImageMaker(this, type, imageAction, - aDimension.getWidth(), aDimension.getHeight(), file, - imageTitle); + aDimension.getWidth(), aDimension.getHeight() + + boarderBottomOffset, file, imageTitle, + alignFrame, pSessionId, headless); if (av.getWrapAlignment()) { if (im.getGraphics() != null) { - printWrappedAlignment(im.getGraphics(), aDimension.getWidth(), - aDimension.getHeight(), 0); + printWrappedAlignment(aDimension.getWidth(), + aDimension.getHeight() + boarderBottomOffset, 0, + im.getGraphics()); im.writeImage(); } } @@ -1213,11 +1377,12 @@ public class AlignmentPanel extends GAlignmentPanel implements { if (im.getGraphics() != null) { - printUnwrapped(im.getGraphics(), aDimension.getWidth(), - aDimension.getHeight(), 0); + printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), + 0, im.getGraphics()); im.writeImage(); } } + } catch (OutOfMemoryError err) { // Be noisy here. @@ -1231,10 +1396,7 @@ public class AlignmentPanel extends GAlignmentPanel implements } } finally { - if (alignFrame != null && !headless) - { - alignFrame.setProgressBar(MessageManager.getString("status.export_complete"), progress); - } + } } @@ -1298,6 +1460,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { makeAlignmentImage(jalview.util.ImageMaker.TYPE.SVG, svgFile); } + public void makePNGImageMap(File imgMapFile, String imageName) { // /////ONLY WORKS WITH NONE WRAPPED ALIGNMENTS @@ -1335,8 +1498,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getAlignment().isNucleotide()) { triplet = ResidueProperties.nucleotideName.get(seq - .getCharAt(res) - + ""); + .getCharAt(res) + ""); } else { @@ -1358,8 +1520,7 @@ public class AlignmentPanel extends GAlignmentPanel implements text.append(" seqs = av.getAlignment().getSequences(); + + /* + * This is like AlignmentI.findIndex(seq) but here we are matching the + * dataset sequence not the aligned sequence + */ + boolean matched = false; + for (SequenceI seq : seqs) + { + if (mappedTo == seq.getDatasetSequence()) + { + matched = true; + break; + } + } + if (!matched) + { + return; // failsafe, shouldn't happen + } + + /* + * Scroll to position but centring the target residue. + */ + scrollToPosition(sr, verticalOffset, true, true); + } + + /** + * Set a flag to say do not scroll any (cDNA/protein) complement. + * + * @param b + */ + protected void setDontScrollComplement(boolean b) + { + this.dontScrollComplement = b; + } + + protected boolean isDontScrollComplement() + { + return this.dontScrollComplement; + } }