X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=b7028ac1db9b1a30f4de3beda4e6451b11f2490e;hb=a45774ee31d9f35d4eff46d54d7deab719afb092;hp=17a24f6784db057381f7fb9a317c74d6ad9e289b;hpb=5ec1087f3f500339cbcba33e604164cb828a9cd8;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java old mode 100755 new mode 100644 index 17a24f6..b7028ac --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -1,45 +1,48 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) - * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.gui; import java.beans.*; import java.io.*; +import java.util.Hashtable; +import java.util.Vector; import java.awt.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; +import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; import jalview.datamodel.*; import jalview.jbgui.*; import jalview.schemes.*; import jalview.structure.SelectionSource; +import jalview.structure.StructureSelectionManager; /** * DOCUMENT ME! * * @author $author$ - * @version $Revision$ + * @version $Revision: 1.161 $ */ public class AlignmentPanel extends GAlignmentPanel implements - AdjustmentListener, Printable + AdjustmentListener, Printable, AlignmentViewPanel { public AlignViewport av; @@ -71,9 +74,9 @@ public class AlignmentPanel extends GAlignmentPanel implements * Creates a new AlignmentPanel object. * * @param af - * DOCUMENT ME! + * DOCUMENT ME! * @param av - * DOCUMENT ME! + * DOCUMENT ME! */ public AlignmentPanel(AlignFrame af, final AlignViewport av) { @@ -178,8 +181,8 @@ public class AlignmentPanel extends GAlignmentPanel implements AlignmentI al = av.getAlignment(); int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300); - int maxwidth = Math.max(20, Math.min(afwidth - 200, (int) 2 * afwidth - / 3)); + int maxwidth = Math.max(20, + Math.min(afwidth - 200, (int) 2 * afwidth / 3)); int i = 0; int idWidth = 0; String id; @@ -222,75 +225,100 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * DOCUMENT ME! + * Highlight the given results on the alignment. * - * @param results - * DOCUMENT ME! */ public void highlightSearchResults(SearchResults results) { scrollToPosition(results); seqPanel.seqCanvas.highlightSearchResults(results); } + /** - * scroll the view to show the position of the highlighted - * region in results (if any) and redraw the overview + * scroll the view to show the position of the highlighted region in results + * (if any) and redraw the overview + * * @param results */ - public boolean scrollToPosition(SearchResults results) { + public boolean scrollToPosition(SearchResults results) + { return scrollToPosition(results, true); } + /** - * scroll the view to show the position of the highlighted - * region in results (if any) + * scroll the view to show the position of the highlighted region in results + * (if any) + * * @param results - * @param redrawOverview - when set, the overview will be recalculated (takes longer) + * @param redrawOverview + * - when set, the overview will be recalculated (takes longer) * @return false if results were not found */ - public boolean scrollToPosition(SearchResults results, boolean redrawOverview) { - int startv,endv,starts,ends,width; - // TODO: properly locate search results in view when large numbers of hidden columns exist before highlighted region + public boolean scrollToPosition(SearchResults results, + boolean redrawOverview) + { + int startv, endv, starts, ends, width; + // TODO: properly locate search results in view when large numbers of hidden + // columns exist before highlighted region // do we need to scroll the panel? // TODO: tons of nullpointereexceptions raised here. - if (results != null && results.getSize()>0 && av!=null && av.alignment!=null) + if (results != null && results.getSize() > 0 && av != null + && av.alignment != null) { int seqIndex = av.alignment.findIndex(results); - if (seqIndex==-1) + if (seqIndex == -1) { return false; } SequenceI seq = av.alignment.getSequenceAt(seqIndex); - int [] r = results.getResults(seq, 0, av.alignment.getWidth()); // results.getResults(seq, seq.getStart(), seq.getEnd()); - // TODO: VAMSAS: fix hidden column issue where scroll to left from C terminus is not visible - if (r==null) + int[] r=results.getResults(seq, 0, av.alignment.getWidth()); + if (r == null) { return false; } int start = r[0]; int end = r[1]; - if (start<0) + // System.err.println("Seq : "+seqIndex+" Scroll to "+start+","+end); // + // DEBUG + if (start < 0) { return false; } - if (end==seq.getEnd()) + if (end == seq.getEnd()) { return false; } + if (av.hasHiddenColumns) + { + start = av.getColumnSelection().findColumnPosition(start); + end = av.getColumnSelection().findColumnPosition(end); + if (start==end) + { + if (!av.colSel.isVisible(r[0])) + { + // don't scroll - position isn't visible + return false; + } + } + } if (!av.wrapAlignment) { - if ((startv=av.getStartRes()) >= start) + if ((startv = av.getStartRes()) >= start) + { + setScrollValues(start - 1, seqIndex); + } + else if ((endv = av.getEndRes()) <= end) { - setScrollValues(start-1, seqIndex); - } else if - ((endv=av.getEndRes()) <= end) + setScrollValues(startv + 1 + end - endv, seqIndex); + } + else if ((starts = av.getStartSeq()) > seqIndex) { - setScrollValues(startv+1+end-endv, seqIndex); - } else if ((starts=av.getStartSeq()) > seqIndex) { setScrollValues(av.getStartRes(), seqIndex); - } else if ((ends=av.getEndSeq()) <= seqIndex) + } + else if ((ends = av.getEndSeq()) <= seqIndex) { - setScrollValues(av.getStartRes(), starts+seqIndex-ends+1); + setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); } } else @@ -298,11 +326,11 @@ public class AlignmentPanel extends GAlignmentPanel implements scrollToWrappedVisible(start); } } - if (!redrawOverview && overviewPanel!=null) + if (redrawOverview && overviewPanel != null) { overviewPanel.setBoxPosition(); - } - paintAlignment(!redrawOverview); + } + paintAlignment(redrawOverview); return true; } @@ -310,7 +338,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { int cwidth = seqPanel.seqCanvas .getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth()); - if (res < av.getStartRes() || res >= (av.getStartRes()+cwidth)) + if (res < av.getStartRes() || res >= (av.getStartRes() + cwidth)) { vscroll.setValue((res / cwidth)); av.startRes = vscroll.getValue() * cwidth; @@ -332,7 +360,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param op - * DOCUMENT ME! + * DOCUMENT ME! */ public void setOverviewPanel(OverviewPanel op) { @@ -340,10 +368,9 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * DOCUMENT ME! * - * @param b - * DOCUMENT ME! + * @param b Hide or show annotation panel + * */ public void setAnnotationVisible(boolean b) { @@ -355,6 +382,10 @@ public class AlignmentPanel extends GAlignmentPanel implements repaint(); } + /** + * automatically adjust annotation panel height for new annotation + * whilst ensuring the alignment is still visible. + */ public void adjustAnnotationHeight() { // TODO: display vertical annotation scrollbar if necessary @@ -363,9 +394,17 @@ public class AlignmentPanel extends GAlignmentPanel implements { System.out.println("NEEDS FIXING"); } - + validateAnnotationDimensions(true); + addNotify(); + paintAlignment(true); + } + /** + * calculate the annotation dimensions and refresh slider values accordingly. + * need to do repaints/notifys afterwards. + */ + protected void validateAnnotationDimensions(boolean adjustPanelHeight) { int height = annotationPanel.adjustPanelHeight(); - + if (hscroll.isVisible()) { height += hscroll.getPreferredSize().height; @@ -374,23 +413,27 @@ public class AlignmentPanel extends GAlignmentPanel implements { height = alignFrame.getHeight() / 2; } - + if (!adjustPanelHeight) + { + // maintain same window layout whilst updating sliders + height=annotationScroller.getSize().height; + } hscroll.addNotify(); - + annotationScroller.setPreferredSize(new Dimension(annotationScroller .getWidth(), height)); annotationSpaceFillerHolder.setPreferredSize(new Dimension( annotationSpaceFillerHolder.getWidth(), height)); annotationScroller.validate();// repaint(); - repaint(); + annotationScroller.addNotify(); } /** * DOCUMENT ME! * * @param wrap - * DOCUMENT ME! + * DOCUMENT ME! */ public void setWrapAlignment(boolean wrap) { @@ -448,7 +491,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param right - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! */ @@ -481,17 +524,17 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * DOCUMENT ME! + * Adjust row/column scrollers to show a visible position in the alignment. * - * @param x - * DOCUMENT ME! - * @param y - * DOCUMENT ME! + * @param x visible column to scroll to + * DOCUMENT ME! + * @param y visible row to scroll to + * */ public void setScrollValues(int x, int y) { -// System.err.println("Scroll to "+x+","+y); - if (av==null || av.alignment==null) + // System.err.println("Scroll to "+x+","+y); + if (av == null || av.alignment == null) { return; } @@ -546,7 +589,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void adjustmentValueChanged(AdjustmentEvent evt) { @@ -558,9 +601,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { int x = hscroll.getValue(); av.setStartRes(x); - av - .setEndRes((x + (seqPanel.seqCanvas.getWidth() / av - .getCharWidth())) - 1); + av.setEndRes((x + (seqPanel.seqCanvas.getWidth() / av.getCharWidth())) - 1); } if (evt.getSource() == vscroll) @@ -643,8 +684,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (updateOverview) { - jalview.structure.StructureSelectionManager - .getStructureSelectionManager().sequenceColoursChanged(this); + av.getStructureSelectionManager().sequenceColoursChanged(this); if (overviewPanel != null) { @@ -657,7 +697,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param g - * DOCUMENT ME! + * DOCUMENT ME! */ public void paintComponent(Graphics g) { @@ -700,16 +740,16 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param pg - * DOCUMENT ME! + * DOCUMENT ME! * @param pf - * DOCUMENT ME! + * DOCUMENT ME! * @param pi - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws PrinterException - * DOCUMENT ME! + * DOCUMENT ME! */ public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException @@ -733,18 +773,18 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param pg - * DOCUMENT ME! + * DOCUMENT ME! * @param pwidth - * DOCUMENT ME! + * DOCUMENT ME! * @param pheight - * DOCUMENT ME! + * DOCUMENT ME! * @param pi - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws PrinterException - * DOCUMENT ME! + * DOCUMENT ME! */ public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi) throws PrinterException @@ -840,8 +880,8 @@ public class AlignmentPanel extends GAlignmentPanel implements } pg.setColor(currentColor); - pg.fillRect(0, (i - startSeq) * av.charHeight, idWidth, av - .getCharHeight()); + pg.fillRect(0, (i - startSeq) * av.charHeight, idWidth, + av.getCharHeight()); pg.setColor(currentTextColor); @@ -854,7 +894,9 @@ public class AlignmentPanel extends GAlignmentPanel implements - 4; } - pg.drawString(seq.getDisplayId(av.getShowJVSuffix()), xPos, + pg.drawString( + seq.getDisplayId(av.getShowJVSuffix()), + xPos, (((i - startSeq) * av.charHeight) + av.getCharHeight()) - (av.getCharHeight() / 5)); } @@ -880,18 +922,18 @@ public class AlignmentPanel extends GAlignmentPanel implements * DOCUMENT ME! * * @param pg - * DOCUMENT ME! + * DOCUMENT ME! * @param pwidth - * DOCUMENT ME! + * DOCUMENT ME! * @param pheight - * DOCUMENT ME! + * DOCUMENT ME! * @param pi - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws PrinterException - * DOCUMENT ME! + * DOCUMENT ME! */ public int printWrappedAlignment(Graphics pg, int pwidth, int pheight, int pi) throws PrinterException @@ -1012,6 +1054,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (System.getProperty("java.awt.headless") != null && System.getProperty("java.awt.headless").equals("true")) { + // TODO: JAL-244 width = alignFrame.getWidth() - vscroll.getPreferredSize().width - alignFrame.getInsets().left - alignFrame.getInsets().right; @@ -1272,25 +1315,139 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * close the panel - deregisters all listeners and nulls any references to alignment data. + * close the panel - deregisters all listeners and nulls any references to + * alignment data. */ public void closePanel() { - jalview.structure.StructureSelectionManager ssm = - jalview.structure.StructureSelectionManager - .getStructureSelectionManager(); - ssm.removeStructureViewerListener(seqPanel, null); - ssm.removeSelectionListener(seqPanel); PaintRefresher.RemoveComponent(seqPanel.seqCanvas); PaintRefresher.RemoveComponent(idPanel.idCanvas); PaintRefresher.RemoveComponent(this); - if (av!=null) { + if (av != null) + { + jalview.structure.StructureSelectionManager ssm = av.getStructureSelectionManager(); + ssm.removeStructureViewerListener(seqPanel, null); + ssm.removeSelectionListener(seqPanel); av.alignment = null; av = null; - } else { - if (Cache.log.isDebugEnabled()) { + } + else + { + if (Cache.log.isDebugEnabled()) + { Cache.log.warn("Closing alignment panel which is already closed."); } } } + + /** + * hides or shows dynamic annotation rows based on groups and av state flags + */ + public void updateAnnotation() + { + updateAnnotation(false); + } + + public void updateAnnotation(boolean applyGlobalSettings) + { + // TODO: this should be merged with other annotation update stuff - that + // sits on AlignViewport + boolean updateCalcs = false; + boolean conv = av.isShowGroupConservation(); + boolean cons = av.isShowGroupConsensus(); + boolean showprf = av.isShowSequenceLogo(); + boolean showConsHist = av.isShowConsensusHistogram(); + + boolean sortg = true; + + // remove old automatic annotation + // add any new annotation + + Vector gr = av.alignment.getGroups(); // OrderedBy(av.alignment.getSequencesArray()); + // intersect alignment annotation with alignment groups + + AlignmentAnnotation[] aan = av.alignment.getAlignmentAnnotation(); + Hashtable oldrfs = new Hashtable(); + if (aan != null) + { + for (int an = 0; an < aan.length; an++) + { + if (aan[an].autoCalculated && aan[an].groupRef != null) + { + oldrfs.put(aan[an].groupRef, aan[an].groupRef); + av.alignment.deleteAnnotation(aan[an]); + aan[an] = null; + } + } + } + SequenceGroup sg; + if (gr != null) + { + for (int g = 0; g < gr.size(); g++) + { + updateCalcs = false; + sg = (SequenceGroup) gr.elementAt(g); + if (applyGlobalSettings || !oldrfs.containsKey(sg)) + { + // set defaults for this group's conservation/consensus + sg.setshowSequenceLogo(showprf); + sg.setShowConsensusHistogram(showConsHist); + } + if (conv) + { + updateCalcs = true; + av.alignment.addAnnotation(sg.getConservationRow(), 0); + } + if (cons) + { + updateCalcs = true; + av.alignment.addAnnotation(sg.getConsensus(), 0); + } + // refresh the annotation rows + if (updateCalcs) + { + sg.recalcConservation(); + } + } + } + oldrfs.clear(); + adjustAnnotationHeight(); + } + + @Override + public AlignmentI getAlignment() + { + return av.alignment; + } + + /** + * get the name for this view + * @return + */ + public String getViewName() + { + return av.viewName; + } + + /** + * Make/Unmake this alignment panel the current input focus + * @param b + */ + public void setSelected(boolean b) + { + try { + alignFrame.setSelected(b); + } catch (Exception ex) {}; + + if (b) + { + alignFrame.setDisplayedView(this); + } + } + + @Override + public StructureSelectionManager getStructureSelectionManager() + { + return av.getStructureSelectionManager(); + } }