X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=235c81f068ed8eb17a226e1c780e95bc86b0383e;hb=134576f5b34894218bdc4c5ce5e27fa18ad973bd;hp=e29a0e2df84f47afb4b3e79f09f2d4caec54884f;hpb=e81459b192f4d635c1cd96befa7b14992d12ee5e;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index e29a0e2..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; @@ -76,6 +76,7 @@ public class AlignmentPanel extends GAlignmentPanel implements private IdPanel idPanel; private boolean headless; + IdwidthAdjuster idwidthAdjuster; /** DOCUMENT ME!! */ @@ -98,7 +99,9 @@ public class AlignmentPanel extends GAlignmentPanel implements * Flag set while scrolling to follow complementary cDNA/protein scroll. When * true, suppresses invoking the same method recursively. */ - private boolean followingComplementScroll; + private boolean dontScrollComplement; + + private PropertyChangeListener propertyChangeListener; /** * Creates a new AlignmentPanel object. @@ -134,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")) @@ -144,7 +148,8 @@ public class AlignmentPanel extends GAlignmentPanel implements alignmentChanged(); } } - }); + }; + av.addPropertyChangeListener(propertyChangeListener); fontChanged(); adjustAnnotationHeight(); updateLayout(); @@ -155,6 +160,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { return av; } + public void alignmentChanged() { av.alignmentChanged(this); @@ -177,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; @@ -292,7 +297,7 @@ 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); @@ -304,7 +309,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * * @param results */ - public boolean scrollToPosition(SearchResults results) + public boolean scrollToPosition(SearchResultsI results) { return scrollToPosition(results, 0, true, false); } @@ -317,7 +322,8 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param redrawOverview * @return */ - public boolean scrollToPosition(SearchResults searchResults, boolean redrawOverview) + public boolean scrollToPosition(SearchResultsI searchResults, + boolean redrawOverview) { return scrollToPosition(searchResults, 0, redrawOverview, false); } @@ -336,9 +342,8 @@ public class AlignmentPanel extends GAlignmentPanel implements * if true, try to centre the search results horizontally in the view * @return false if results were not found */ - public boolean scrollToPosition(SearchResults results, - int verticalOffset, - boolean redrawOverview, boolean centre) + public boolean scrollToPosition(SearchResultsI results, + int verticalOffset, boolean redrawOverview, boolean centre) { int startv, endv, starts, ends; // TODO: properly locate search results in view when large numbers of hidden @@ -363,8 +368,8 @@ public class AlignmentPanel extends GAlignmentPanel implements int start = r[0]; int end = r[1]; // DEBUG -// System.err.println(this.av.viewName + " Seq : " + seqIndex -// + " Scroll to " + start + "," + end); + // System.err.println(this.av.viewName + " Seq : " + seqIndex + // + " Scroll to " + start + "," + end); /* * To centre results, scroll to positions half the visible width @@ -508,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 @@ -565,6 +571,9 @@ public class AlignmentPanel extends GAlignmentPanel implements annotationScroller.setPreferredSize(new Dimension(annotationScroller .getWidth(), annotationHeight)); + Dimension e = idPanel.getSize(); + alabels.setSize(new Dimension(e.width, annotationHeight)); + annotationSpaceFillerHolder.setPreferredSize(new Dimension( annotationSpaceFillerHolder.getWidth(), annotationHeight)); annotationScroller.validate(); @@ -728,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); } @@ -738,6 +754,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param evt * DOCUMENT ME! */ + @Override public void adjustmentValueChanged(AdjustmentEvent evt) { int oldX = av.getStartRes(); @@ -747,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) @@ -770,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()); @@ -826,9 +845,9 @@ 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 (isFollowingComplementScroll()) + if (isDontScrollComplement()) { - setFollowingComplementScroll(false); + setDontScrollComplement(false); } else { @@ -840,17 +859,18 @@ public class AlignmentPanel extends GAlignmentPanel implements * 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) @@ -866,6 +886,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param g * DOCUMENT ME! */ + @Override public void paintComponent(Graphics g) { invalidate(); @@ -875,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(); @@ -918,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 { @@ -928,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); } } @@ -953,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? @@ -1019,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++) @@ -1047,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; @@ -1109,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; @@ -1175,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())); } @@ -1190,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) { @@ -1243,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 { @@ -1276,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(); } } @@ -1291,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. @@ -1309,10 +1396,7 @@ public class AlignmentPanel extends GAlignmentPanel implements } } finally { - if (alignFrame != null && !headless) - { - alignFrame.setProgressBar(MessageManager.getString("status.export_complete"), progress); - } + } } @@ -1376,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 @@ -1413,8 +1498,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getAlignment().isNucleotide()) { triplet = ResidueProperties.nucleotideName.get(seq - .getCharAt(res) - + ""); + .getCharAt(res) + ""); } else { @@ -1436,8 +1520,7 @@ public class AlignmentPanel extends GAlignmentPanel implements text.append(" seqs = av.getAlignment().getSequences(); /* @@ -1781,17 +1875,17 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * Set a flag to say we are scrolling to follow a (cDNA/protein) complement. + * Set a flag to say do not scroll any (cDNA/protein) complement. * * @param b */ - protected void setFollowingComplementScroll(boolean b) + protected void setDontScrollComplement(boolean b) { - this.followingComplementScroll = b; + this.dontScrollComplement = b; } - protected boolean isFollowingComplementScroll() + protected boolean isDontScrollComplement() { - return this.followingComplementScroll; + return this.dontScrollComplement; } }