X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignViewport.java;h=055584aa39422b4caccbab4e27424744bf701df7;hb=8aa94d348698138bb5c30715ef0aa15349f47fbb;hp=95aafab1c2056f1bc76a32d7f4aa84ae11169fd9;hpb=a822fc744dcc06e6a8d2399218da0d0dfd56cf2b;p=jalview.git diff --git a/src/jalview/appletgui/AlignViewport.java b/src/jalview/appletgui/AlignViewport.java index 95aafab..055584a 100644 --- a/src/jalview/appletgui/AlignViewport.java +++ b/src/jalview/appletgui/AlignViewport.java @@ -1,137 +1,70 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) - * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * 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. - * + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * * 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 . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.appletgui; -import java.util.*; - -import java.awt.*; - -import jalview.analysis.*; -import jalview.api.AlignCalcManagerI; import jalview.api.AlignViewportI; -import jalview.bin.*; -import jalview.datamodel.*; -import jalview.schemes.*; +import jalview.api.FeatureSettingsModelI; +import jalview.bin.JalviewLite; +import jalview.commands.CommandI; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; +import jalview.datamodel.SearchResults; +import jalview.datamodel.SearchResultsI; +import jalview.datamodel.SequenceGroup; +import jalview.renderer.ResidueShader; +import jalview.schemes.ColourSchemeProperty; +import jalview.schemes.UserColourScheme; import jalview.structure.SelectionSource; +import jalview.structure.StructureSelectionManager; import jalview.structure.VamsasSource; import jalview.viewmodel.AlignmentViewport; -import jalview.workers.ConservationThread; -import jalview.workers.ConsensusThread; - -public class AlignViewport extends AlignmentViewport implements AlignViewportI, SelectionSource, VamsasSource -{ - int startRes; - - int endRes; - int startSeq; - - int endSeq; +import java.awt.Font; +import java.awt.FontMetrics; +public class AlignViewport extends AlignmentViewport + implements SelectionSource +{ boolean cursorMode = false; - boolean showJVSuffix = true; - - boolean showText = true; - - boolean showColourText = false; - - boolean showBoxes = true; - - boolean wrapAlignment = false; - - boolean renderGaps = true; - - boolean showSequenceFeatures = false; - - boolean showAnnotation = true; - - boolean showConservation = true; - - boolean showQuality = true; - - boolean showConsensus = true; - - boolean upperCasebold = false; - - boolean colourAppliesToAllGroups = true; - - boolean conservationColourSelected = false; - - boolean abovePIDThreshold = false; - - int charHeight; - - int charWidth; - - int wrappedWidth; - Font font = new Font("SansSerif", Font.PLAIN, 10); boolean validCharWidth = true; - int threshold; - - int increment; - - NJTree currentTree = null; - - boolean scaleAboveWrapped = true; - - boolean scaleLeftWrapped = true; - - boolean scaleRightWrapped = true; - - // The following vector holds the features which are - // currently visible, in the correct order or rendering - public Hashtable featuresDisplayed; - - - boolean showHiddenMarkers = true; - public jalview.bin.JalviewLite applet; - Hashtable sequenceColours; - boolean MAC = false; - Stack historyList = new Stack(); - - Stack redoList = new Stack(); - - public void finalize() { - applet=null; - quality=null; - alignment=null; - colSel=null; - } + private AnnotationColumnChooser annotationColumnSelectionState; public AlignViewport(AlignmentI al, JalviewLite applet) { + super(al); calculator = new jalview.workers.AlignCalcManager(); this.applet = applet; - setAlignment(al); + // we always pad gaps this.setPadGaps(true); - this.startRes = 0; - this.endRes = al.getWidth() - 1; - this.startSeq = 0; - this.endSeq = al.getHeight() - 1; + if (applet != null) { // get the width and height scaling factors if they were specified @@ -146,15 +79,15 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI, } if (widthScale <= 1.0) { - System.err - .println("Invalid alignment character width scaling factor (" + System.err.println( + "Invalid alignment character width scaling factor (" + widthScale + "). Ignoring."); widthScale = 1; } - if (applet.debug) + if (JalviewLite.debug) { - System.err - .println("Alignment character width scaling factor is now " + System.err.println( + "Alignment character width scaling factor is now " + widthScale); } } @@ -169,66 +102,89 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI, } if (heightScale <= 1.0) { - System.err - .println("Invalid alignment character height scaling factor (" + System.err.println( + "Invalid alignment character height scaling factor (" + heightScale + "). Ignoring."); heightScale = 1; } - if (applet.debug) + if (JalviewLite.debug) { - System.err - .println("Alignment character height scaling factor is now " + System.err.println( + "Alignment character height scaling factor is now " + heightScale); } } } - setFont(font); + setFont(font, true); MAC = new jalview.util.Platform().isAMac(); if (applet != null) { - showJVSuffix = applet.getDefaultParameter("showFullId", showJVSuffix); + setShowJVSuffix( + applet.getDefaultParameter("showFullId", getShowJVSuffix())); + + setShowAnnotation(applet.getDefaultParameter("showAnnotation", + isShowAnnotation())); + + showConservation = applet.getDefaultParameter("showConservation", + showConservation); - showAnnotation = applet.getDefaultParameter("showAnnotation", showAnnotation); - - showConservation = applet.getDefaultParameter("showConservation", showConservation); - showQuality = applet.getDefaultParameter("showQuality", showQuality); - showConsensus = applet.getDefaultParameter("showConsensus", showConsensus); + showConsensus = applet.getDefaultParameter("showConsensus", + showConsensus); - showUnconserved = applet.getDefaultParameter("showUnconserved", showUnconserved); + showOccupancy = applet.getDefaultParameter("showOccupancy", + showOccupancy); + + setShowUnconserved(applet.getDefaultParameter("showUnconserved", + getShowUnconserved())); + + setScaleProteinAsCdna(applet.getDefaultParameter("scaleProteinAsCdna", + isScaleProteinAsCdna())); String param = applet.getParameter("upperCase"); if (param != null) { if (param.equalsIgnoreCase("bold")) { - upperCasebold = true; + setUpperCasebold(true); } } sortByTree = applet.getDefaultParameter("sortByTree", sortByTree); - followHighlight = applet.getDefaultParameter("automaticScrolling",followHighlight); - followSelection = followHighlight; + setFollowHighlight(applet.getDefaultParameter("automaticScrolling", + isFollowHighlight())); + followSelection = isFollowHighlight(); + + showSequenceLogo = applet.getDefaultParameter("showSequenceLogo", + showSequenceLogo); - showSequenceLogo = applet.getDefaultParameter("showSequenceLogo", showSequenceLogo); + normaliseSequenceLogo = applet.getDefaultParameter( + "normaliseSequenceLogo", applet.getDefaultParameter( + "normaliseLogo", normaliseSequenceLogo)); - normaliseSequenceLogo = applet.getDefaultParameter("normaliseSequenceLogo", normaliseSequenceLogo); + showGroupConsensus = applet.getDefaultParameter("showGroupConsensus", + showGroupConsensus); + + showGroupConservation = applet.getDefaultParameter( + "showGroupConservation", showGroupConservation); + + showConsensusHistogram = applet.getDefaultParameter( + "showConsensusHistogram", showConsensusHistogram); - showGroupConsensus = applet.getDefaultParameter("showGroupConsensus", showGroupConsensus); - - showGroupConservation = applet.getDefaultParameter("showGroupConservation", showGroupConservation); - - showConsensusHistogram = applet.getDefaultParameter("showConsensusHistogram", showConsensusHistogram); - } if (applet != null) { - String colour = applet.getParameter("defaultColour"); - + String colour = al.isNucleotide() + ? applet.getParameter("defaultColourNuc") + : applet.getParameter("defaultColourProt"); + if (colour == null) + { + colour = applet.getParameter("defaultColour"); + } if (colour == null) { colour = applet.getParameter("userDefinedColour"); @@ -240,206 +196,36 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI, if (colour != null) { - globalColourScheme = ColourSchemeProperty.getColour(alignment, - colour); - if (globalColourScheme != null) + residueShading = new ResidueShader( + ColourSchemeProperty.getColourScheme(this, alignment, + colour)); + if (residueShading != null) { - globalColourScheme.setConsensus(hconsensus); + residueShading.setConsensus(hconsensus); } } if (applet.getParameter("userDefinedColour") != null) { - ((UserColourScheme) globalColourScheme).parseAppletParameter(applet - .getParameter("userDefinedColour")); - } - } - if (hconsensus == null) - { - if (!alignment.isNucleotide()) - { - conservation = new AlignmentAnnotation("Conservation", - "Conservation of total alignment less than " + getConsPercGaps() - + "% gaps", new Annotation[1], 0f, 11f, - AlignmentAnnotation.BAR_GRAPH); - conservation.hasText = true; - conservation.autoCalculated = true; - - if (showConservation) - { - alignment.addAnnotation(conservation); - } - - if (showQuality) - { - quality = new AlignmentAnnotation("Quality", - "Alignment Quality based on Blosum62 scores", - new Annotation[1], 0f, 11f, AlignmentAnnotation.BAR_GRAPH); - quality.hasText = true; - quality.autoCalculated = true; - - alignment.addAnnotation(quality); - } - } else { - if (alignment.hasRNAStructure()) - { - strucConsensus = new AlignmentAnnotation("StrucConsensus", "PID", - new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); - strucConsensus.hasText = true; - strucConsensus.autoCalculated = true; - } - } - - consensus = new AlignmentAnnotation("Consensus", "PID", - new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); - consensus.hasText = true; - consensus.autoCalculated = true; - - if (showConsensus) - { - alignment.addAnnotation(consensus); - if (strucConsensus!=null) - { - alignment.addAnnotation(strucConsensus); - } + residueShading = new ResidueShader(new UserColourScheme( + applet.getParameter("userDefinedColour"))); } } + initAutoAnnotation(); } - public void showSequenceFeatures(boolean b) - { - showSequenceFeatures = b; - } - - public boolean getShowSequenceFeatures() - { - return showSequenceFeatures; - } - - - /** - * get the consensus sequence as displayed under the PID consensus annotation - * row. - * - * @return consensus sequence as a new sequence object - */ - public SequenceI getConsensusSeq() - { - if (consensus == null) - { - updateConsensus(null); - } - if (consensus == null) - { - return null; - } - StringBuffer seqs = new StringBuffer(); - for (int i = 0; i < consensus.annotations.length; i++) - { - if (consensus.annotations[i] != null) - { - if (consensus.annotations[i].description.charAt(0) == '[') - { - seqs.append(consensus.annotations[i].description.charAt(1)); - } - else - { - seqs.append(consensus.annotations[i].displayCharacter); - } - } - } - SequenceI sq = new Sequence("Consensus", seqs.toString()); - sq.setDescription("Percentage Identity Consensus " - + ((ignoreGapsInConsensusCalculation) ? " without gaps" : "")); - return sq; - } - - public boolean getConservationSelected() - { - return conservationColourSelected; - } - - public void setConservationSelected(boolean b) - { - conservationColourSelected = b; - } - - public boolean getAbovePIDThreshold() - { - return abovePIDThreshold; - } - - public void setAbovePIDThreshold(boolean b) - { - abovePIDThreshold = b; - } - - public int getStartRes() - { - return startRes; - } - - public int getEndRes() - { - return endRes; - } - - public int getStartSeq() - { - return startSeq; - } - - public void setStartRes(int res) - { - this.startRes = res; - } - - public void setStartSeq(int seq) - { - this.startSeq = seq; - } - - public void setEndRes(int res) - { - if (res > alignment.getWidth() - 1) - { - // log.System.out.println(" Corrected res from " + res + " to maximum " + - // (alignment.getWidth()-1)); - res = alignment.getWidth() - 1; - } - if (res < 0) - { - res = 0; - } - this.endRes = res; - } - - public void setEndSeq(int seq) - { - if (seq > alignment.getHeight()) - { - seq = alignment.getHeight(); - } - if (seq < 0) - { - seq = 0; - } - this.endSeq = seq; - } - - public int getEndSeq() - { - return endSeq; - } - java.awt.Frame nullFrame; protected FeatureSettings featureSettings = null; private float heightScale = 1, widthScale = 1; - public void setFont(Font f) + /** + * {@inheritDoc} + */ + @Override + public void setFont(Font f, boolean setGrid) { font = f; if (nullFrame == null) @@ -448,15 +234,19 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI, nullFrame.addNotify(); } - java.awt.FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font); - setCharHeight((int) (heightScale * fm.getHeight())); - charWidth = (int) (widthScale * fm.charWidth('M')); + if (setGrid) + { + FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font); + setCharHeight((int) (heightScale * fm.getHeight())); + setCharWidth((int) (widthScale * fm.charWidth('M'))); + } - if (upperCasebold) + if (isUpperCasebold()) { Font f2 = new Font(f.getName(), Font.BOLD, f.getSize()); - fm = nullFrame.getGraphics().getFontMetrics(f2); - charWidth = (int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10)); + FontMetrics fm = nullFrame.getGraphics().getFontMetrics(f2); + setCharWidth( + (int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10))); } } @@ -465,357 +255,158 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI, return font; } - public int getCharWidth() - { - return charWidth; - } - - public void setCharHeight(int h) - { - this.charHeight = h; - } - - public int getCharHeight() - { - return charHeight; - } - - public void setWrappedWidth(int w) - { - this.wrappedWidth = w; - } - - public int getwrappedWidth() - { - return wrappedWidth; - } - - public AlignmentI getAlignment() - { - return alignment; - } - - public void setAlignment(AlignmentI align) - { - this.alignment = align; - } - - public void setWrapAlignment(boolean state) - { - wrapAlignment = state; - } - - public void setShowText(boolean state) - { - showText = state; - } - - public void setRenderGaps(boolean state) - { - renderGaps = state; - } - - public boolean getColourText() - { - return showColourText; - } - - public void setColourText(boolean state) - { - showColourText = state; - } - - public void setShowBoxes(boolean state) - { - showBoxes = state; - } - - public boolean getWrapAlignment() - { - return wrapAlignment; - } - - public boolean getShowText() - { - return showText; - } - - public boolean getShowBoxes() - { - return showBoxes; - } - - public char getGapCharacter() - { - return getAlignment().getGapCharacter(); - } - - public void setGapCharacter(char gap) - { - if (getAlignment() != null) - { - getAlignment().setGapCharacter(gap); - } - } - - public void setThreshold(int thresh) - { - threshold = thresh; - } - - public int getThreshold() - { - return threshold; - } - - public void setIncrement(int inc) - { - increment = inc; - } - - public int getIncrement() - { - return increment; - } - public void resetSeqLimits(int height) { - setEndSeq(height / getCharHeight()); - } - - public void setCurrentTree(NJTree tree) - { - currentTree = tree; - } - - public NJTree getCurrentTree() - { - return currentTree; - } - - public void setColourAppliesToAllGroups(boolean b) - { - colourAppliesToAllGroups = b; + ranges.setEndSeq(height / getCharHeight()); } - public boolean getColourAppliesToAllGroups() - { - return colourAppliesToAllGroups; - } - - public boolean getShowJVSuffix() - { - return showJVSuffix; - } - - public void setShowJVSuffix(boolean b) - { - showJVSuffix = b; - } - - public boolean getShowAnnotation() - { - return showAnnotation; - } + boolean centreColumnLabels; - public void setShowAnnotation(boolean b) + public boolean getCentreColumnLabels() { - showAnnotation = b; + return centreColumnLabels; } - public boolean getScaleAboveWrapped() - { - return scaleAboveWrapped; - } + public boolean followSelection = true; - public boolean getScaleLeftWrapped() + /** + * @return true if view selection should always follow the selections + * broadcast by other selection sources + */ + public boolean getFollowSelection() { - return scaleLeftWrapped; + return followSelection; } - public boolean getScaleRightWrapped() + @Override + public void sendSelection() { - return scaleRightWrapped; + getStructureSelectionManager().sendSelection( + new SequenceGroup(getSelectionGroup()), + new ColumnSelection(getColumnSelection()), + new HiddenColumns(getAlignment().getHiddenColumns()), this); } - public void setScaleAboveWrapped(boolean b) + /** + * Returns an instance of the StructureSelectionManager scoped to this applet + * instance. + * + * @return + */ + @Override + public StructureSelectionManager getStructureSelectionManager() { - scaleAboveWrapped = b; + return jalview.structure.StructureSelectionManager + .getStructureSelectionManager(applet); } - public void setScaleLeftWrapped(boolean b) + @Override + public boolean isNormaliseSequenceLogo() { - scaleLeftWrapped = b; + return normaliseSequenceLogo; } - public void setScaleRightWrapped(boolean b) + public void setNormaliseSequenceLogo(boolean state) { - scaleRightWrapped = b; + normaliseSequenceLogo = state; } - public void setIgnoreGapsConsensus(boolean b) + /** + * + * @return true if alignment characters should be displayed + */ + @Override + public boolean isValidCharWidth() { - ignoreGapsInConsensusCalculation = b; - updateConsensus(null); - if (globalColourScheme != null) - { - globalColourScheme.setThreshold(globalColourScheme.getThreshold(), - ignoreGapsInConsensusCalculation); - - } + return validCharWidth; } - - - - - public boolean getShowHiddenMarkers() + public AnnotationColumnChooser getAnnotationColumnSelectionState() { - return showHiddenMarkers; + return annotationColumnSelectionState; } - public void setShowHiddenMarkers(boolean show) + public void setAnnotationColumnSelectionState( + AnnotationColumnChooser annotationColumnSelectionState) { - showHiddenMarkers = show; + this.annotationColumnSelectionState = annotationColumnSelectionState; } - public Color getSequenceColour(SequenceI seq) - { - if (sequenceColours == null || !sequenceColours.containsKey(seq)) + @Override + public void mirrorCommand(CommandI command, boolean undo, + StructureSelectionManager ssm, VamsasSource source) + { + // TODO refactor so this can be pulled up to superclass or controller + /* + * Do nothing unless we are a 'complement' of the source. May replace this + * with direct calls not via SSM. + */ + if (source instanceof AlignViewportI + && ((AlignViewportI) source).getCodingComplement() == this) { - return Color.white; + // ok to continue; } else { - return (Color) sequenceColours.get(seq); - } - } - - public void setSequenceColour(SequenceI seq, Color col) - { - if (sequenceColours == null) - { - sequenceColours = new Hashtable(); + return; } - if (col == null) - { - sequenceColours.remove(seq); - } - else + CommandI mappedCommand = ssm.mapCommand(command, undo, getAlignment(), + getGapCharacter()); + if (mappedCommand != null) { - sequenceColours.put(seq, col); - } - } + mappedCommand.doCommand(null); + firePropertyChange("alignment", null, getAlignment().getSequences()); - boolean centreColumnLabels; - - public boolean getCentreColumnLabels() - { - return centreColumnLabels; - } - - public void updateSequenceIdColours() - { - Vector groups = alignment.getGroups(); - for (int ig = 0, igSize = groups.size(); ig < igSize; ig++) - { - SequenceGroup sg = (SequenceGroup) groups.elementAt(ig); - if (sg.idColour != null) - { - Vector sqs = sg.getSequences(getHiddenRepSequences()); - for (int s = 0, sSize = sqs.size(); s < sSize; s++) - { - this.setSequenceColour((SequenceI) sqs.elementAt(s), sg.idColour); - } - } + // ap.scalePanelHolder.repaint(); + // ap.repaint(); } } - public boolean followHighlight = true; - - public boolean getFollowHighlight() - { - return followHighlight; - } - - public boolean followSelection = true; - - /** - * @return true if view selection should always follow the selections - * broadcast by other selection sources - */ - public boolean getFollowSelection() - { - return followSelection; - } - public void sendSelection() + @Override + public VamsasSource getVamsasSource() { - jalview.structure.StructureSelectionManager - .getStructureSelectionManager(applet).sendSelection( - new SequenceGroup(getSelectionGroup()), - new ColumnSelection(getColumnSelection()), this); + return this; } - - - /** - * synthesize a column selection if none exists so it covers the given - * selection group. if wholewidth is false, no column selection is made if the - * selection group covers the whole alignment width. - * - * @param sg - * @param wholewidth + * If this viewport has a (Protein/cDNA) complement, then scroll the + * complementary alignment to match this one. */ - public void expandColSelection(SequenceGroup sg, boolean wholewidth) + public void scrollComplementaryAlignment(AlignmentPanel complementPanel) { - int sgs, sge; - if (sg != null - && (sgs = sg.getStartRes()) >= 0 - && sg.getStartRes() <= (sge = sg.getEndRes()) - && (colSel == null || colSel.getSelected() == null || colSel - .getSelected().size() == 0)) + if (complementPanel == null) { - if (!wholewidth && alignment.getWidth() == (1 + sge - sgs)) - { - // do nothing - return; - } - if (colSel == null) - { - colSel = new ColumnSelection(); - } - for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++) - { - colSel.addElement(cspos); - } + return; } - } - - @Override - public boolean hasHiddenColumns() - { - return hasHiddenColumns; - } - - public boolean isNormaliseSequenceLogo() - { - return normaliseSequenceLogo; - } - public void setNormaliseSequenceLogo(boolean state) - { - normaliseSequenceLogo = state; + /* + * Populate a SearchResults object with the mapped location to scroll to. If + * there is no complement, or it is not following highlights, or no mapping + * is found, the result will be empty. + */ + SearchResultsI sr = new SearchResults(); + int seqOffset = findComplementScrollTarget(sr); + if (!sr.isEmpty()) + { + complementPanel.setToScrollComplementPanel(false); + complementPanel.scrollToCentre(sr, seqOffset); + complementPanel.setToScrollComplementPanel(true); + } } /** + * Applies the supplied feature settings descriptor to currently known + * features. This supports an 'initial configuration' of feature colouring + * based on a preset or user favourite. This may then be modified in the usual + * way using the Feature Settings dialogue. * - * @return true if alignment characters should be displayed + * @param featureSettings */ - public boolean isValidCharWidth() + @Override + public void applyFeaturesStyle(FeatureSettingsModelI featureSettings) { - return validCharWidth; + // TODO implement for applet } }