X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=190682941a129aca2ff76b5377fa7860c4c803a1;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=5bc46f4c998323fc1b589f0994429eff3a496072;hpb=8c6722b27ff92e3610376295e2b4363f942d9969;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index 5bc46f4..1906829 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) + * Copyright (C) 2015 The Jalview Authors * * This file is part of Jalview. * @@ -20,6 +20,22 @@ */ package jalview.gui; +import jalview.analysis.AnnotationSorter; +import jalview.api.AlignViewportI; +import jalview.api.AlignmentViewPanel; +import jalview.bin.Cache; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.SearchResults; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.jbgui.GAlignmentPanel; +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; import java.awt.Container; @@ -27,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; @@ -41,21 +58,6 @@ import java.util.List; import javax.swing.SwingUtilities; -import jalview.analysis.AnnotationSorter; -import jalview.api.AlignViewportI; -import jalview.api.AlignmentViewPanel; -import jalview.bin.Cache; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.SearchResults; -import jalview.datamodel.SequenceFeature; -import jalview.datamodel.SequenceGroup; -import jalview.datamodel.SequenceI; -import jalview.jbgui.GAlignmentPanel; -import jalview.math.AlignmentDimension; -import jalview.schemes.ResidueProperties; -import jalview.structure.StructureSelectionManager; -import jalview.util.MessageManager; - /** * DOCUMENT ME! * @@ -74,6 +76,7 @@ public class AlignmentPanel extends GAlignmentPanel implements private IdPanel idPanel; private boolean headless; + IdwidthAdjuster idwidthAdjuster; /** DOCUMENT ME!! */ @@ -153,6 +156,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { return av; } + public void alignmentChanged() { av.alignmentChanged(this); @@ -175,8 +179,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; @@ -304,7 +307,7 @@ public class AlignmentPanel extends GAlignmentPanel implements */ public boolean scrollToPosition(SearchResults results) { - return scrollToPosition(results, true, false); + return scrollToPosition(results, 0, true, false); } /** @@ -315,9 +318,10 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param redrawOverview * @return */ - public boolean scrollToPosition(SearchResults searchResults, boolean redrawOverview) + public boolean scrollToPosition(SearchResults searchResults, + boolean redrawOverview) { - return scrollToPosition(searchResults, redrawOverview, false); + return scrollToPosition(searchResults, 0, redrawOverview, false); } /** @@ -325,6 +329,9 @@ public class AlignmentPanel extends GAlignmentPanel implements * (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 @@ -332,7 +339,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @return false if results were not found */ public boolean scrollToPosition(SearchResults results, - boolean redrawOverview, boolean centre) + int verticalOffset, boolean redrawOverview, boolean centre) { int startv, endv, starts, ends; // TODO: properly locate search results in view when large numbers of hidden @@ -356,8 +363,9 @@ 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 @@ -367,7 +375,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { int offset = (av.getEndRes() - av.getStartRes() + 1) / 2 - 1; start = Math.max(start - offset, 0); - end = Math.min(end + offset, seq.getEnd() - 1); + end = end + offset - 1; } if (start < 0) { @@ -390,6 +398,15 @@ 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) @@ -511,47 +528,47 @@ 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)); annotationSpaceFillerHolder.setPreferredSize(new Dimension( - annotationSpaceFillerHolder.getWidth(), height)); - annotationScroller.validate();// repaint(); + annotationSpaceFillerHolder.getWidth(), annotationHeight)); + annotationScroller.validate(); annotationScroller.addNotify(); } @@ -656,14 +673,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; @@ -731,7 +748,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) @@ -828,13 +846,13 @@ public class AlignmentPanel extends GAlignmentPanel implements { 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) @@ -1046,9 +1064,7 @@ public class AlignmentPanel extends GAlignmentPanel implements - 4; } - pg.drawString( - seq.getDisplayId(av.getShowJVSuffix()), - xPos, + pg.drawString(seq.getDisplayId(av.getShowJVSuffix()), xPos, (((i - startSeq) * av.getCharHeight()) + av.getCharHeight()) - (av.getCharHeight() / 5)); } @@ -1057,7 +1073,8 @@ public class AlignmentPanel extends GAlignmentPanel implements // draw main sequence panel pg.translate(idWidth, 0); - getSeqPanel().seqCanvas.drawPanel(pg, startRes, endRes, startSeq, endSeq, 0); + getSeqPanel().seqCanvas.drawPanel(pg, startRes, endRes, startSeq, + endSeq, 0); if (av.isShowAnnotation() && (endSeq == av.getAlignment().getHeight())) { @@ -1159,12 +1176,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())); } @@ -1174,8 +1193,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) { @@ -1233,8 +1252,8 @@ public class AlignmentPanel extends GAlignmentPanel implements if (alignFrame != null && !headless) { alignFrame.setProgressBar(MessageManager.formatMessage( - "status.saving_file", new Object[] - { type.getLabel() }), progress); + "status.saving_file", new Object[] { type.getLabel() }), + progress); } try { @@ -1295,7 +1314,9 @@ public class AlignmentPanel extends GAlignmentPanel implements { if (alignFrame != null && !headless) { - alignFrame.setProgressBar(MessageManager.getString("status.export_complete"), progress); + alignFrame.setProgressBar( + MessageManager.getString("status.export_complete"), + progress); } } } @@ -1360,6 +1381,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 @@ -1397,8 +1419,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getAlignment().isNucleotide()) { triplet = ResidueProperties.nucleotideName.get(seq - .getCharAt(res) - + ""); + .getCharAt(res) + ""); } else { @@ -1420,8 +1441,7 @@ public class AlignmentPanel extends GAlignmentPanel implements text.append("