X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=baac692748cb0b3eef9358216d17056386d66238;hb=refs%2Fheads%2FJAL-2739_2.10.2b1;hp=437e6783f864514a2993cfcefb6bda5bfefb9385;hpb=204ab8e31a8230cb1fdf328a86f675e55c6aa990;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index 437e678..baac692 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -70,8 +70,7 @@ import javax.swing.SwingUtilities; * @version $Revision: 1.161 $ */ public class AlignmentPanel extends GAlignmentPanel implements - AdjustmentListener, Printable, AlignmentViewPanel, - ViewportListenerI + AdjustmentListener, Printable, AlignmentViewPanel, ViewportListenerI { public AlignViewport av; @@ -157,8 +156,8 @@ public class AlignmentPanel extends GAlignmentPanel implements // is initialised if (av.getWrapAlignment()) { - int widthInRes = getSeqPanel().seqCanvas - .getWrappedCanvasWidth(getSeqPanel().seqCanvas.getWidth()); + int widthInRes = getSeqPanel().seqCanvas.getWrappedCanvasWidth( + getSeqPanel().seqCanvas.getWidth()); vpRanges.setViewportWidth(widthInRes); } else @@ -167,7 +166,7 @@ public class AlignmentPanel extends GAlignmentPanel implements / av.getCharWidth(); int heightInSeq = getSeqPanel().seqCanvas.getHeight() / av.getCharHeight(); - + vpRanges.setViewportWidth(widthInRes); vpRanges.setViewportHeight(heightInSeq); } @@ -226,11 +225,12 @@ public class AlignmentPanel extends GAlignmentPanel implements // to prevent drawing old image FontMetrics fm = getFontMetrics(av.getFont()); - scalePanelHolder.setPreferredSize(new Dimension(10, av.getCharHeight() - + fm.getDescent())); - idSpaceFillerPanel1.setPreferredSize(new Dimension(10, av - .getCharHeight() + fm.getDescent())); - + scalePanelHolder.setPreferredSize( + new Dimension(10, av.getCharHeight() + fm.getDescent())); + idSpaceFillerPanel1.setPreferredSize( + new Dimension(10, av.getCharHeight() + fm.getDescent())); + idwidthAdjuster.invalidate(); + scalePanelHolder.invalidate(); getIdPanel().getIdCanvas().gg = null; getSeqPanel().seqCanvas.img = null; getAnnotationPanel().adjustPanelHeight(); @@ -289,8 +289,8 @@ public class AlignmentPanel extends GAlignmentPanel implements { Container c = new Container(); - FontMetrics fm = c.getFontMetrics(new Font(av.font.getName(), - Font.ITALIC, av.font.getSize())); + FontMetrics fm = c.getFontMetrics( + new Font(av.font.getName(), Font.ITALIC, av.font.getSize())); AlignmentI al = av.getAlignment(); int i = 0; @@ -331,8 +331,8 @@ public class AlignmentPanel extends GAlignmentPanel implements } } - return new Dimension(maxwidth < 0 ? idWidth : Math.min(maxwidth, - idWidth), 12); + return new Dimension( + maxwidth < 0 ? idWidth : Math.min(maxwidth, idWidth), 12); } /** @@ -477,8 +477,8 @@ public class AlignmentPanel extends GAlignmentPanel implements /* * Scroll down to make end of search results visible */ - setScrollValues(vpRanges.getStartRes(), starts + seqIndex - ends - + 1); + setScrollValues(vpRanges.getStartRes(), + starts + seqIndex - ends + 1); } /* * Else results are already visible - no need to scroll @@ -579,8 +579,8 @@ public class AlignmentPanel extends GAlignmentPanel implements */ if (annotationHeight + alignmentHeight > availableHeight) { - annotationHeight = Math.min(annotationHeight, availableHeight - 2 - * rowHeight); + annotationHeight = Math.min(annotationHeight, + availableHeight - 2 * rowHeight); } } else @@ -590,8 +590,8 @@ public class AlignmentPanel extends GAlignmentPanel implements } hscroll.addNotify(); - annotationScroller.setPreferredSize(new Dimension(annotationScroller - .getWidth(), annotationHeight)); + annotationScroller.setPreferredSize( + new Dimension(annotationScroller.getWidth(), annotationHeight)); Dimension e = idPanel.getSize(); alabels.setSize(new Dimension(e.width, annotationHeight)); @@ -629,21 +629,24 @@ public class AlignmentPanel extends GAlignmentPanel implements annotationSpaceFillerHolder.setVisible(true); } - if (wrap) - { - int widthInRes = getSeqPanel().seqCanvas - .getWrappedCanvasWidth(getSeqPanel().seqCanvas.getWidth()); - vpRanges.setViewportWidth(widthInRes); - } - else - { - int widthInRes = (getSeqPanel().seqCanvas.getWidth() / av - .getCharWidth()) - 1; - int heightInSeq = (getSeqPanel().seqCanvas.getHeight() / av - .getCharHeight()) - 1; + int canvasWidth = getSeqPanel().seqCanvas.getWidth(); + if (canvasWidth > 0) + { // may not yet be laid out + if (wrap) + { + int widthInRes = getSeqPanel().seqCanvas + .getWrappedCanvasWidth(canvasWidth); + vpRanges.setViewportWidth(widthInRes); + } + else + { + int widthInRes = (canvasWidth / av.getCharWidth()); + int heightInSeq = (getSeqPanel().seqCanvas.getHeight() + / av.getCharHeight()); - vpRanges.setViewportWidth(widthInRes); - vpRanges.setViewportHeight(heightInSeq); + vpRanges.setViewportWidth(widthInRes); + vpRanges.setViewportHeight(heightInSeq); + } } idSpaceFillerPanel1.setVisible(!wrap); @@ -651,7 +654,6 @@ public class AlignmentPanel extends GAlignmentPanel implements repaint(); } - /** * Adjust row/column scrollers to show a visible position in the alignment. * @@ -683,7 +685,8 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.hasHiddenColumns()) { // reset the width to exclude hidden columns - width = av.getAlignment().getHiddenColumns().findColumnPosition(width); + width = av.getAlignment().getHiddenColumns() + .findColumnPosition(width); } hextent = getSeqPanel().seqCanvas.getWidth() / av.getCharWidth(); @@ -735,101 +738,111 @@ public class AlignmentPanel extends GAlignmentPanel implements @Override public void adjustmentValueChanged(AdjustmentEvent evt) { - int oldX = vpRanges.getStartRes(); - int oldwidth = vpRanges.getViewportWidth(); - int oldY = vpRanges.getStartSeq(); - int oldheight = vpRanges.getViewportHeight(); - if (av.getWrapAlignment()) { - if (evt.getSource() == hscroll) - { - return; // no horizontal scroll when wrapped - } - else if (evt.getSource() == vscroll) + adjustScrollingWrapped(evt); + return; + } + + if (evt.getSource() == hscroll) + { + int oldX = vpRanges.getStartRes(); + int oldwidth = vpRanges.getViewportWidth(); + int x = hscroll.getValue(); + int width = getSeqPanel().seqCanvas.getWidth() / av.getCharWidth(); + + // if we're scrolling to the position we're already at, stop + // this prevents infinite recursion of events when the scroll/viewport + // ranges values are the same + if ((x == oldX) && (width == oldwidth)) { - int offy = vscroll.getValue(); - int rowSize = getSeqPanel().seqCanvas - .getWrappedCanvasWidth(getSeqPanel().seqCanvas.getWidth()); - - // if we're scrolling to the position we're already at, stop - // this prevents infinite recursion of events when the scroll/viewport - // ranges values are the same - int newX = offy * rowSize; - newX += oldX % rowSize; // horizontal scroll offset if any - if ((newX == oldX) && (oldwidth == rowSize)) - { - return; - } - else if (offy > -1) - { - // limit page up/down to one width's worth of positions - newX = newX > oldX ? oldX + rowSize : oldX - rowSize; - vpRanges.setViewportStartAndWidth(newX, rowSize); - } + return; } - else + vpRanges.setViewportStartAndWidth(x, width); + } + else if (evt.getSource() == vscroll) + { + int oldY = vpRanges.getStartSeq(); + int oldheight = vpRanges.getViewportHeight(); + int y = vscroll.getValue(); + int height = getSeqPanel().seqCanvas.getHeight() / av.getCharHeight(); + + // if we're scrolling to the position we're already at, stop + // this prevents infinite recursion of events when the scroll/viewport + // ranges values are the same + if ((y == oldY) && (height == oldheight)) { - // This is only called if file loaded is a jar file that - // was wrapped when saved and user has wrap alignment true - // as preference setting - SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - // When updating scrolling to use ViewportChange events, this code - // could not be validated and it is not clear if it is now being - // called. Log warning here in case it is called and unforeseen - // problems occur - Cache.log - .warn("Unexpected path through code: Wrapped jar file opened with wrap alignment set in preferences"); - - // scroll to start of panel - vpRanges.setStartRes(0); - vpRanges.setStartSeq(0); - } - }); + return; } + vpRanges.setViewportStartAndHeight(y, height); + } + if (!fastPaint) + { repaint(); } - else + } + + /** + * Responds to a scroll change by setting the start position of the viewport. + * Does + * + * @param evt + */ + protected void adjustScrollingWrapped(AdjustmentEvent evt) + { + if (evt.getSource() == hscroll) { - // horizontal scroll - if (evt.getSource() == hscroll) - { - int x = hscroll.getValue(); - int width = getSeqPanel().seqCanvas.getWidth() / av.getCharWidth(); + return; // no horizontal scroll when wrapped + } + if (evt.getSource() == vscroll) + { + int newY = vscroll.getValue(); - // if we're scrolling to the position we're already at, stop - // this prevents infinite recursion of events when the scroll/viewport - // ranges values are the same - if ((x == oldX) && (width == oldwidth)) - { - return; - } - vpRanges.setViewportStartAndWidth(x, width); - } - else if (evt.getSource() == vscroll) + /* + * if we're scrolling to the position we're already at, stop + * this prevents infinite recursion of events when the scroll/viewport + * ranges values are the same + */ + int oldX = vpRanges.getStartRes(); + int oldY = vpRanges.getWrappedScrollPosition(oldX); + if (oldY == newY) { - int y = vscroll.getValue(); - int height = getSeqPanel().seqCanvas.getHeight() - / av.getCharHeight(); - - // if we're scrolling to the position we're already at, stop - // this prevents infinite recursion of events when the scroll/viewport - // ranges values are the same - if ((y == oldY) && (height == oldheight)) - { - return; - } - vpRanges.setViewportStartAndHeight(y, height); + return; } - if (!fastPaint) + if (newY > -1) { - repaint(); + /* + * limit page up/down to one width's worth of positions + */ + int rowSize = vpRanges.getViewportWidth(); + int newX = newY > oldY ? oldX + rowSize : oldX - rowSize; + vpRanges.setViewportStartAndWidth(Math.max(0, newX), rowSize); } } + else + { + // This is only called if file loaded is a jar file that + // was wrapped when saved and user has wrap alignment true + // as preference setting + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + // When updating scrolling to use ViewportChange events, this code + // could not be validated and it is not clear if it is now being + // called. Log warning here in case it is called and unforeseen + // problems occur + Cache.log.warn( + "Unexpected path through code: Wrapped jar file opened with wrap alignment set in preferences"); + + // scroll to start of panel + vpRanges.setStartRes(0); + vpRanges.setStartSeq(0); + } + }); + } + repaint(); } /** @@ -879,35 +892,24 @@ public class AlignmentPanel extends GAlignmentPanel implements setScrollValues(vpRanges.getStartRes(), vpRanges.getStartSeq()); } - /* - * Set vertical scroll bar parameters for wrapped panel - * @param res - * the residue to scroll to + /** + * Set vertical scroll bar position, and number of increments, for wrapped + * panel + * + * @param topLeftColumn + * the column position at top left (0..) */ - private void setScrollingForWrappedPanel(int res) + private void setScrollingForWrappedPanel(int topLeftColumn) { - // get the width of the alignment in residues - int maxwidth = av.getAlignment().getWidth(); - if (av.hasHiddenColumns()) - { - maxwidth = av.getAlignment().getHiddenColumns() - .findColumnPosition(maxwidth) - 1; - } + int scrollPosition = vpRanges.getWrappedScrollPosition(topLeftColumn); + int maxScroll = vpRanges.getWrappedMaxScroll(topLeftColumn); - // get the width of the canvas in residues - int canvasWidth = getSeqPanel().seqCanvas - .getWrappedCanvasWidth(getSeqPanel().seqCanvas.getWidth()); - if (canvasWidth > 0) - { - // position we want to scroll to is number of canvasWidth's to get there - int current = res / canvasWidth; - - // max scroll position: add one because extent is 1 and scrollbar value - // can only be set to at most max - extent - int max = maxwidth / canvasWidth + 1; - vscroll.setUnitIncrement(1); - vscroll.setValues(current, 1, 0, max); - } + /* + * a scrollbar's value can be set to at most (maximum-extent) + * so we add extent (1) to the maxScroll value + */ + vscroll.setUnitIncrement(1); + vscroll.setValues(scrollPosition, 1, 0, maxScroll + 1); } /** @@ -987,7 +989,8 @@ public class AlignmentPanel extends GAlignmentPanel implements * Get the horizontal offset to where we draw the sequences. * This is idWidth if using a single Graphics context, else zero. */ - final int alignmentGraphicsOffset = idGraphics != alignmentGraphics ? 0 : idWidth; + final int alignmentGraphicsOffset = idGraphics != alignmentGraphics ? 0 + : idWidth; FontMetrics fm = getFontMetrics(av.getFont()); int charHeight = av.getCharHeight(); @@ -1024,8 +1027,7 @@ public class AlignmentPanel extends GAlignmentPanel implements endSeq = alignmentHeight; } - int pagesHigh = ((alignmentHeight / totalSeq) + 1) - * pageHeight; + int pagesHigh = ((alignmentHeight / totalSeq) + 1) * pageHeight; if (av.isShowAnnotation()) { @@ -1038,8 +1040,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { return Printable.NO_SUCH_PAGE; } - final int alignmentDrawnHeight = (endSeq - startSeq) * charHeight - + 3; + final int alignmentDrawnHeight = (endSeq - startSeq) * charHeight + 3; /* * draw the Scale at horizontal offset, then reset to top left (0, 0) @@ -1088,9 +1089,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.isRightAlignIds()) { fm = idGraphics.getFontMetrics(); - xPos = idWidth - - fm.stringWidth(displayId) - - 4; + xPos = idWidth - fm.stringWidth(displayId) - 4; } idGraphics.drawString(displayId, xPos, @@ -1105,8 +1104,8 @@ public class AlignmentPanel extends GAlignmentPanel implements * single graphics context), then reset to (0, scale height) */ alignmentGraphics.translate(alignmentGraphicsOffset, scaleHeight); - getSeqPanel().seqCanvas.drawPanel(alignmentGraphics, startRes, endRes, - startSeq, endSeq, 0); + getSeqPanel().seqCanvas.drawPanelForPrinting(alignmentGraphics, startRes, + endRes, startSeq, endSeq); alignmentGraphics.translate(-alignmentGraphicsOffset, 0); if (av.isShowAnnotation() && (endSeq == alignmentHeight)) @@ -1126,7 +1125,8 @@ public class AlignmentPanel extends GAlignmentPanel implements * draw the annotations starting at * (idOffset, alignmentHeight) from (0, scaleHeight) */ - alignmentGraphics.translate(alignmentGraphicsOffset, alignmentDrawnHeight); + alignmentGraphics.translate(alignmentGraphicsOffset, + alignmentDrawnHeight); getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), av, alignmentGraphics, -1, startRes, endRes + 1); } @@ -1180,8 +1180,8 @@ public class AlignmentPanel extends GAlignmentPanel implements .findColumnPosition(maxwidth) - 1; } - int resWidth = getSeqPanel().seqCanvas.getWrappedCanvasWidth(pwidth - - idWidth); + int resWidth = getSeqPanel().seqCanvas + .getWrappedCanvasWidth(pwidth - idWidth); int totalHeight = cHeight * (maxwidth / resWidth + 1); @@ -1218,16 +1218,13 @@ 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 - - (av.getAlignment().getHeight() * av - .getCharHeight())); + pg.translate(+3, -ypos + - (av.getAlignment().getHeight() * av.getCharHeight())); } ypos += cHeight; @@ -1235,7 +1232,7 @@ public class AlignmentPanel extends GAlignmentPanel implements pg.translate(idWidth, 0); - getSeqPanel().seqCanvas.drawWrappedPanel(pg, pwidth - idWidth, + getSeqPanel().seqCanvas.drawWrappedPanelForPrinting(pg, pwidth - idWidth, totalHeight, 0); if ((pi * pheight) < totalHeight) @@ -1277,8 +1274,8 @@ public class AlignmentPanel extends GAlignmentPanel implements return calculateIdWidth(-1).width + 4; } Integer idwidth = null; - if (onscreen - || (idwidth = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH")) == null) + if (onscreen || (idwidth = Cache + .getIntegerProperty("FIGURE_FIXEDIDWIDTH")) == null) { int w = getIdPanel().getWidth(); return (w > 0 ? w : calculateIdWidth().width + 4); @@ -1290,15 +1287,15 @@ public class AlignmentPanel extends GAlignmentPanel implements { int boarderBottomOffset = 5; long pSessionId = System.currentTimeMillis(); - headless = (System.getProperty("java.awt.headless") != null && System - .getProperty("java.awt.headless").equals("true")); + headless = (System.getProperty("java.awt.headless") != null + && System.getProperty("java.awt.headless").equals("true")); if (alignFrame != null && !headless) { if (file != null) { - alignFrame.setProgressBar(MessageManager.formatMessage( - "status.saving_file", new Object[] { type.getLabel() }), - pSessionId); + alignFrame.setProgressBar(MessageManager + .formatMessage("status.saving_file", new Object[] + { type.getLabel() }), pSessionId); } } try @@ -1325,9 +1322,9 @@ public class AlignmentPanel extends GAlignmentPanel implements } im = new jalview.util.ImageMaker(this, type, imageAction, - aDimension.getWidth(), aDimension.getHeight() - + boarderBottomOffset, file, imageTitle, - alignFrame, pSessionId, headless); + aDimension.getWidth(), + aDimension.getHeight() + boarderBottomOffset, file, + imageTitle, alignFrame, pSessionId, headless); Graphics graphics = im.getGraphics(); if (av.getWrapAlignment()) { @@ -1343,8 +1340,8 @@ public class AlignmentPanel extends GAlignmentPanel implements { if (graphics != null) { - printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), - 0, graphics, graphics); + printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0, + graphics, graphics); im.writeImage(); } } @@ -1389,9 +1386,8 @@ public class AlignmentPanel extends GAlignmentPanel implements // this duplicates the calculation in getWrappedHeight but adjusts for // offscreen idWith width = alignFrame.getWidth() - vscroll.getPreferredSize().width - - alignFrame.getInsets().left - - alignFrame.getInsets().right - getVisibleIdWidth() - + getVisibleIdWidth(false); + - alignFrame.getInsets().left - alignFrame.getInsets().right + - getVisibleIdWidth() + getVisibleIdWidth(false); } else { @@ -1442,8 +1438,9 @@ public class AlignmentPanel extends GAlignmentPanel implements { try { - int s, sSize = av.getAlignment().getHeight(), res, alwidth = av - .getAlignment().getWidth(), g, gSize, f, fSize, sy; + int s, sSize = av.getAlignment().getHeight(), res, + alwidth = av.getAlignment().getWidth(), g, gSize, f, fSize, + sy; PrintWriter out = new PrintWriter(new FileWriter(imgMapFile)); out.println(jalview.io.HTMLOutput.getImageMapHTML()); out.println(""); text.append(features[f].getType()); - if (features[f].getDescription() != null - && !features[f].getType().equals( - features[f].getDescription())) + if (features[f].getDescription() != null && !features[f] + .getType().equals(features[f].getDescription())) { text.append(" ").append(features[f].getDescription()); } if (features[f].getValue("status") != null) { - text.append(" (").append(features[f].getValue("status")) + text.append(" (") + .append(features[f].getValue("status")) .append(")"); } } @@ -1901,7 +1898,7 @@ public class AlignmentPanel extends GAlignmentPanel implements @Override /** - * Property change event fired when a change is made to the viewport ranges + * Property change event fired when a change is made to the viewport ranges * object associated with this alignment panel's viewport */ public void propertyChange(PropertyChangeEvent evt)