X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignmentPanel.java;h=813ab84753593307045e62171ed08c9fc542f080;hb=73fd64da56448bcb2a7771cc174d9d9c62da87ad;hp=0516533063f4a4e8a4958e5cdca6ebf91cbab13f;hpb=8c6722b27ff92e3610376295e2b4363f942d9969;p=jalview.git diff --git a/src/jalview/appletgui/AlignmentPanel.java b/src/jalview/appletgui/AlignmentPanel.java index 0516533..813ab84 100644 --- a/src/jalview/appletgui/AlignmentPanel.java +++ b/src/jalview/appletgui/AlignmentPanel.java @@ -20,6 +20,15 @@ */ package jalview.appletgui; +import jalview.analysis.AnnotationSorter; +import jalview.api.AlignViewportI; +import jalview.api.AlignmentViewPanel; +import jalview.bin.JalviewLite; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.SearchResults; +import jalview.datamodel.SequenceI; +import jalview.structure.StructureSelectionManager; + import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; @@ -34,15 +43,6 @@ import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.List; -import jalview.analysis.AnnotationSorter; -import jalview.api.AlignViewportI; -import jalview.api.AlignmentViewPanel; -import jalview.bin.JalviewLite; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.SearchResults; -import jalview.datamodel.SequenceI; -import jalview.structure.StructureSelectionManager; - public class AlignmentPanel extends Panel implements AdjustmentListener, AlignmentViewPanel { @@ -68,7 +68,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, // this value is set false when selection area being dragged boolean fastPaint = true; - public void finalize() + @Override + public void finalize() throws Throwable { alignFrame = null; av = null; @@ -80,6 +81,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, annotationPanel = null; annotationPanelHolder = null; annotationSpaceFillerHolder = null; + super.finalize(); } public AlignmentPanel(AlignFrame af, final AlignViewport av) @@ -121,6 +123,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, addComponentListener(new ComponentAdapter() { + @Override public void componentResized(ComponentEvent evt) { setScrollValues(av.getStartRes(), av.getStartSeq()); @@ -146,6 +149,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, final AlignmentPanel ap = this; av.addPropertyChangeListener(new java.beans.PropertyChangeListener() { + @Override public void propertyChange(java.beans.PropertyChangeEvent evt) { if (evt.getPropertyName().equals("alignment")) @@ -162,15 +166,18 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, { return av; } + public SequenceRenderer getSequenceRenderer() { return seqPanel.seqCanvas.sr; } + @Override public jalview.api.FeatureRenderer getFeatureRenderer() { return seqPanel.seqCanvas.fr; } + @Override public jalview.api.FeatureRenderer cloneFeatureRenderer() { @@ -178,6 +185,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, nfr.transferSettings(seqPanel.seqCanvas.fr); return nfr; } + public void alignmentChanged() { av.alignmentChanged(this); @@ -449,37 +457,37 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, // setScrollValues(start, seqIndex); // } // logic copied from jalview.gui.AlignmentPanel: - if ((startv = av.getStartRes()) >= start) - { - /* - * Scroll left to make start of search results visible - */ - setScrollValues(start - 1, seqIndex); - } - else if ((endv = av.getEndRes()) <= end) - { - /* - * Scroll right to make end of search results visible - */ - setScrollValues(startv + 1 + 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); - } + if ((startv = av.getStartRes()) >= start) + { + /* + * Scroll left to make start of search results visible + */ + setScrollValues(start - 1, seqIndex); + } + else if ((endv = av.getEndRes()) <= end) + { /* - * Else results are already visible - no need to scroll + * Scroll right to make end of search results visible */ + setScrollValues(startv + 1 + 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 { @@ -534,6 +542,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, * 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 @@ -552,70 +561,60 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, } /** - * calculate the annotation dimensions and refresh slider values accordingly. - * need to do repaints/notifys afterwards. + * Calculate the annotation dimensions and refresh slider values accordingly. + * Need to do repaints/notifys afterwards. */ protected void validateAnnotationDimensions(boolean adjustPanelHeight) { - boolean modified = false; - int height = av.calcPanelHeight(); - int minsize = 0; - if (hscroll.isVisible()) - { - height += (minsize = hscroll.getPreferredSize().height); - } - if (apvscroll.isVisible()) - { - minsize += apvscroll.getPreferredSize().height; - } - int mheight = height; - Dimension d = sequenceHolderPanel.getSize(), e = idPanel.getSize(); - int seqandannot = d.height - scalePanelHolder.getSize().height; + int rowHeight = av.getCharHeight(); + int alignmentHeight = rowHeight * av.getAlignment().getHeight(); + int annotationHeight = av.calcPanelHeight(); + + int mheight = annotationHeight; + Dimension d = sequenceHolderPanel.getSize(); + + int availableHeight = d.height - scalePanelHolder.getHeight(); if (adjustPanelHeight) { - // NOTE: this logic is different in the application. Need a better - // algorithm to define behaviour - // sets initial preferred height - // try and set height according to alignment - float sscaling = (float) ((av.getCharHeight() * av.getAlignment() - .getHeight()) / (1.0 * mheight)); - if (sscaling > 0.5) - { - // if the alignment is too big then - // default is 0.5 split - height = seqandannot / 2; - } - else + /* + * If not enough vertical space, maximize annotation height while keeping + * at least two rows of alignment visible + */ + if (annotationHeight + alignmentHeight > availableHeight) { - // otherwise just set the panel so that one row of sequence is visible - height = -av.getCharHeight() * 1 - + (int) (seqandannot * (1 - sscaling)); + annotationHeight = Math.min(annotationHeight, availableHeight - 2 + * rowHeight); } } else { // maintain same window layout whilst updating sliders - height = annotationPanelHolder.getSize().height; + annotationHeight = annotationPanelHolder.getSize().height; } - if (seqandannot - height < 5) + if (availableHeight - annotationHeight < 5) { - height = seqandannot; + annotationHeight = availableHeight; } - annotationPanel.setSize(new Dimension(d.width, height)); - alabels.setSize(new Dimension(e.width, height)); - annotationSpaceFillerHolder.setSize(new Dimension(e.width, height)); - annotationPanelHolder.setSize(new Dimension(d.width, height)); + + 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); + + Dimension e = idPanel.getSize(); + alabels.setSize(new Dimension(e.width, annotationHeight)); + annotationSpaceFillerHolder.setSize(new Dimension(e.width, + annotationHeight)); + int s = apvscroll.getValue(); - if (s > mheight - height) + if (s > mheight - annotationHeight) { s = 0; } - apvscroll.setValues(s, height, 0, mheight); + apvscroll.setValues(s, annotationHeight, 0, mheight); annotationPanel.setScrollOffset(apvscroll.getValue(), false); alabels.setScrollOffset(apvscroll.getValue(), false); } @@ -776,6 +775,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, } + @Override public void adjustmentValueChanged(AdjustmentEvent evt) { int oldX = av.getStartRes(); @@ -953,6 +953,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, /** * Repaint the alignment and annotations, and, optionally, any overview window */ + @Override public void paintAlignment(boolean updateOverview) { final AnnotationSorter sorter = new AnnotationSorter(getAlignment(), @@ -963,6 +964,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, if (updateOverview) { + // TODO: determine if this paintAlignment changed structure colours jalview.structure.StructureSelectionManager .getStructureSelectionManager(av.applet) .sequenceColoursChanged(this); @@ -974,11 +976,13 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, } } + @Override public void update(Graphics g) { paint(g); } + @Override public void paint(Graphics g) { invalidate();