X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignmentPanel.java;h=365f8865390807ed2be027df0d42b42dfb197f0d;hb=3d2750d886f1b6015b2fc3f8671a6cf3e32bb07a;hp=d7f2d5ed9790fd89df70203c4855e4244ccf656e;hpb=ad66d7d56acd4063655df6a845e217683b88523e;p=jalview.git diff --git a/src/jalview/appletgui/AlignmentPanel.java b/src/jalview/appletgui/AlignmentPanel.java index d7f2d5e..365f886 100644 --- a/src/jalview/appletgui/AlignmentPanel.java +++ b/src/jalview/appletgui/AlignmentPanel.java @@ -46,8 +46,8 @@ import java.awt.event.ComponentEvent; import java.beans.PropertyChangeEvent; import java.util.List; -public class AlignmentPanel extends Panel implements AdjustmentListener, - AlignmentViewPanel, ViewportListenerI +public class AlignmentPanel extends Panel + implements AdjustmentListener, AlignmentViewPanel, ViewportListenerI { public AlignViewport av; @@ -73,23 +73,6 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, // this value is set false when selection area being dragged boolean fastPaint = true; - @Override - public void finalize() throws Throwable - { - alignFrame = null; - av = null; - vpRanges = null; - seqPanel = null; - seqPanelHolder = null; - sequenceHolderPanel = null; - scalePanel = null; - scalePanelHolder = null; - annotationPanel = null; - annotationPanelHolder = null; - annotationSpaceFillerHolder = null; - super.finalize(); - } - public AlignmentPanel(AlignFrame af, final AlignViewport av) { try @@ -234,10 +217,10 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, idPanel.idCanvas.image = null; FontMetrics fm = getFontMetrics(av.getFont()); - scalePanel.setSize(new Dimension(10, av.getCharHeight() - + fm.getDescent())); - idwidthAdjuster.setSize(new Dimension(10, av.getCharHeight() - + fm.getDescent())); + scalePanel.setSize( + new Dimension(10, av.getCharHeight() + fm.getDescent())); + idwidthAdjuster.setSize( + new Dimension(10, av.getCharHeight() + fm.getDescent())); av.updateSequenceIdColours(); annotationPanel.image = null; int ap = annotationPanel.adjustPanelHeight(false); @@ -358,11 +341,10 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, * @return false if results were not found */ public boolean scrollToPosition(SearchResultsI results, - int verticalOffset, - boolean redrawOverview, boolean centre) + int verticalOffset, boolean redrawOverview, boolean centre) { // do we need to scroll the panel? - if (results != null && results.getSize() > 0) + if (results != null && results.getCount() > 0) { AlignmentI alignment = av.getAlignment(); int seqIndex = alignment.findIndex(results); @@ -380,8 +362,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, { if (JalviewLite.debug) {// DEBUG - System.out - .println("DEBUG: scroll didn't happen - results not within alignment : " + System.out.println( + "DEBUG: scroll didn't happen - results not within alignment : " + seq.getStart() + "," + seq.getEnd()); } return false; @@ -405,9 +387,11 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, */ if (centre) { - int offset = (vpRanges.getEndRes() - vpRanges.getStartRes() + 1) / 2 - 1; + int offset = (vpRanges.getEndRes() - vpRanges.getStartRes() + 1) / 2 + - 1; start = Math.max(start - offset, 0); - end = Math.min(end + offset, seq.getEnd() - 1); + end = end + offset - 1; + // end = Math.min(end + offset, seq.getEnd() - 1); } if (start < 0) @@ -436,11 +420,12 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, int start = -1; if (av.hasHiddenColumns()) { - start = av.getColumnSelection().findColumnPosition(ostart); - end = av.getColumnSelection().findColumnPosition(end); + AlignmentI al = av.getAlignment(); + start = al.getHiddenColumns().absoluteToVisibleColumn(ostart); + end = al.getHiddenColumns().absoluteToVisibleColumn(end); if (start == end) { - if (!scrollToNearest && !av.getColumnSelection().isVisible(ostart)) + if (!scrollToNearest && !al.getHiddenColumns().isVisible(ostart)) { // don't scroll - position isn't visible return false; @@ -516,8 +501,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, /* * 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 @@ -528,7 +513,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, vpRanges.scrollToWrappedVisible(start); } - paintAlignment(redrawOverview); + paintAlignment(redrawOverview, false); return true; } @@ -569,15 +554,15 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, // this is called after loading new annotation onto alignment if (alignFrame.getSize().height == 0) { - System.out - .println("adjustAnnotationHeight frame size zero NEEDS FIXING"); + System.out.println( + "adjustAnnotationHeight frame size zero NEEDS FIXING"); } fontChanged(); validateAnnotationDimensions(true); apvscroll.addNotify(); hscroll.addNotify(); validate(); - paintAlignment(true); + paintAlignment(true, false); } /** @@ -603,8 +588,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, */ if (annotationHeight + alignmentHeight > availableHeight) { - annotationHeight = Math.min(annotationHeight, availableHeight - 2 - * rowHeight); + annotationHeight = Math.min(annotationHeight, + availableHeight - 2 * rowHeight); } } else @@ -621,13 +606,13 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, annotationPanel.setSize(new Dimension(d.width, annotationHeight)); annotationPanelHolder.setSize(new Dimension(d.width, annotationHeight)); // seqPanelHolder.setSize(d.width, seqandannot - height); - seqPanel.seqCanvas - .setSize(d.width, seqPanel.seqCanvas.getSize().height); + seqPanel.seqCanvas.setSize(d.width, + seqPanel.seqCanvas.getSize().height); Dimension e = idPanel.getSize(); alabels.setSize(new Dimension(e.width, annotationHeight)); - annotationSpaceFillerHolder.setSize(new Dimension(e.width, - annotationHeight)); + annotationSpaceFillerHolder + .setSize(new Dimension(e.width, annotationHeight)); int s = apvscroll.getValue(); if (s > mheight - annotationHeight) @@ -641,7 +626,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, public void setWrapAlignment(boolean wrap) { - vpRanges.setStartSeq(0); + vpRanges.setStartEndSeq(0, vpRanges.getVisibleAlignmentHeight()); vpRanges.setStartRes(0); scalePanelHolder.setVisible(!wrap); @@ -673,22 +658,20 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, int vextent = 0; - public void setScrollValues(int x, int y) + public void setScrollValues(int xpos, int ypos) { + int x = xpos; + int y = ypos; + if (av.getWrapAlignment()) { setScrollingForWrappedPanel(x); } else { - - int width = av.getAlignment().getWidth(); + int width = av.getAlignment().getVisibleWidth(); int height = av.getAlignment().getHeight(); - if (av.hasHiddenColumns()) - { - width = av.getColumnSelection().findColumnPosition(width); - } if (x < 0) { x = 0; @@ -733,127 +716,115 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, hscroll.setValues(x, hextent, 0, width); vscroll.setValues(y, vextent, 0, height); + // AWT scrollbar does not fire adjustmentValueChanged for setValues + // so also call adjustment code! + adjustHorizontal(x); + adjustVertical(y); + sendViewPosition(); } } + /** + * Respond to adjustment event when horizontal or vertical scrollbar is + * changed + * + * @param evt + * adjustment event encoding whether apvscroll, hscroll or vscroll + * changed + */ @Override public void adjustmentValueChanged(AdjustmentEvent evt) { - int oldX = vpRanges.getStartRes(); - int oldwidth = vpRanges.getViewportWidth(); - int oldY = vpRanges.getStartSeq(); - int oldheight = vpRanges.getViewportHeight(); - + // Note that this event is NOT fired by the AWT scrollbar when setValues is + // called. Instead manually call adjustHorizontal and adjustVertical + // directly. if (evt == null || evt.getSource() == apvscroll) { annotationPanel.setScrollOffset(apvscroll.getValue(), false); alabels.setScrollOffset(apvscroll.getValue(), false); - // annotationPanel.image=null; - // alabels.image=null; - // alabels.repaint(); - // annotationPanel.repaint(); } if (evt == null || evt.getSource() == hscroll) { int x = hscroll.getValue(); - int width = seqPanel.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)) - { - return; - } - vpRanges.setViewportStartAndWidth(x, width); + adjustHorizontal(x); } if (evt == null || evt.getSource() == vscroll) { int offy = vscroll.getValue(); - if (av.getWrapAlignment()) - { - int rowSize = seqPanel.seqCanvas - .getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth()); + adjustVertical(offy); + } - // 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 ((offy * rowSize == oldX) && (oldwidth == rowSize)) - { - return; - } - else if (offy > -1) - { - vpRanges.setViewportStartAndWidth(offy * rowSize, rowSize); - } - } - else - { - int height = seqPanel.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 ((offy == oldY) && (height == oldheight)) - { - return; - } - vpRanges.setViewportStartAndHeight(offy, height); - } - } + private void adjustHorizontal(int x) + { + int oldX = vpRanges.getStartRes(); + int oldwidth = vpRanges.getViewportWidth(); + int width = seqPanel.seqCanvas.getWidth() / av.getCharWidth(); - /* if (overviewPanel != null) - { - overviewPanel.setBoxPosition(); - } + // 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); - int scrollX = vpRanges.getStartRes() - oldX; - int scrollY = vpRanges.getStartSeq() - oldY; - */ - if (av.getWrapAlignment() || !fastPaint || av.MAC) + if (av.getWrapAlignment() || !fastPaint) { repaint(); } - /* else - { - // Make sure we're not trying to draw a panel - // larger than the visible window - if (scrollX > vpRanges.getEndRes() - vpRanges.getStartRes()) - { - scrollX = vpRanges.getEndRes() - vpRanges.getStartRes(); - } - else if (scrollX < vpRanges.getStartRes() - vpRanges.getEndRes()) - { - scrollX = vpRanges.getStartRes() - vpRanges.getEndRes(); - } - - idPanel.idCanvas.fastPaint(scrollY); - seqPanel.seqCanvas.fastPaint(scrollX, scrollY); - - scalePanel.repaint(); - if (av.isShowAnnotation()) - { - annotationPanel.fastPaint(vpRanges.getStartRes() - oldX); - } - }*/ sendViewPosition(); + } - /* - * If there is one, scroll the (Protein/cDNA) complementary alignment to - * match, unless we are ourselves doing that. - */ - /* if (isFollowingComplementScroll()) - { - setFollowingComplementScroll(false); - } - else - { - AlignmentPanel ap = getComplementPanel(); - av.scrollComplementaryAlignment(ap); - }*/ + private void adjustVertical(int newY) + { + if (av.getWrapAlignment()) + { + /* + * 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) + { + return; + } + if (newY > -1) + { + /* + * 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 + { + int height = seqPanel.seqCanvas.getHeight() / av.getCharHeight(); + int oldY = vpRanges.getStartSeq(); + int oldheight = vpRanges.getViewportHeight(); + // 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 ((newY == oldY) && (height == oldheight)) + { + return; + } + vpRanges.setViewportStartAndHeight(newY, height); + } + if (av.getWrapAlignment() || !fastPaint) + { + repaint(); + } + sendViewPosition(); } /** @@ -922,8 +893,6 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, * Scroll to position but centring the target residue. Also set a state flag * to prevent adjustmentValueChanged performing this recursively. */ - setFollowingComplementScroll(true); - // this should be scrollToPosition(sr,verticalOffset, scrollToPosition(sr, seqOffset, true, true); } @@ -939,7 +908,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, * Repaint the alignment and annotations, and, optionally, any overview window */ @Override - public void paintAlignment(boolean updateOverview) + public void paintAlignment(boolean updateOverview, + boolean updateStructures) { final AnnotationSorter sorter = new AnnotationSorter(getAlignment(), av.isShowAutocalculatedAbove()); @@ -947,13 +917,14 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, av.getSortAnnotationsBy()); repaint(); - if (updateOverview) + if (updateStructures) { - // TODO: determine if this paintAlignment changed structure colours jalview.structure.StructureSelectionManager .getStructureSelectionManager(av.applet) .sequenceColoursChanged(this); - + } + if (updateOverview) + { if (overviewPanel != null) { overviewPanel.updateOverviewImage(); @@ -994,34 +965,23 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, } - /* + /** * Set vertical scroll bar parameters for wrapped panel - * @param res - * the residue to scroll to + * + * @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.getColumnSelection().findColumnPosition(maxwidth) - 1; - } + int scrollPosition = vpRanges.getWrappedScrollPosition(topLeftColumn); + int maxScroll = vpRanges.getWrappedMaxScroll(topLeftColumn); - // get the width of the canvas in residues - int canvasWidth = seqPanel.seqCanvas - .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width); - 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); } protected Panel sequenceHolderPanel = new Panel(); @@ -1048,9 +1008,9 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, /* * Flag set while scrolling to follow complementary cDNA/protein scroll. When - * true, suppresses invoking the same method recursively. + * false, suppresses invoking the same method recursively. */ - private boolean followingComplementScroll; + private boolean scrollComplementaryPanel = true; private void jbInit() throws Exception { @@ -1159,19 +1119,24 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, * * @param b */ - protected void setFollowingComplementScroll(boolean b) + protected void setToScrollComplementPanel(boolean b) { - this.followingComplementScroll = b; + this.scrollComplementaryPanel = b; } - protected boolean isFollowingComplementScroll() + /** + * Get whether to scroll complement panel + * + * @return true if cDNA/protein complement panels should be scrolled + */ + protected boolean isSetToScrollComplementPanel() { - return this.followingComplementScroll; + return this.scrollComplementaryPanel; } @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) @@ -1183,11 +1148,11 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, // now update any complementary alignment (its viewport ranges object // is different so does not get automatically updated) - if (isFollowingComplementScroll()) + if (isSetToScrollComplementPanel()) { - setFollowingComplementScroll(false); + setToScrollComplementPanel(false); av.scrollComplementaryAlignment(getComplementPanel()); - setFollowingComplementScroll(true); + setToScrollComplementPanel(true); } }