X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignViewport.java;h=997b379b9380ae403fea9fb6169027c9206cdc73;hb=4f094851cd2247ea2d982e7829a6f5b663042573;hp=a00b3180ce1863a540097227437845a785ada6e9;hpb=f8b4d2fefc3181039269589939c7ce37d2effdc9;p=jalview.git diff --git a/src/jalview/appletgui/AlignViewport.java b/src/jalview/appletgui/AlignViewport.java old mode 100755 new mode 100644 index a00b318..fc087c6 --- a/src/jalview/appletgui/AlignViewport.java +++ b/src/jalview/appletgui/AlignViewport.java @@ -1,506 +1,462 @@ -package jalview.appletgui; - -import java.awt.*; -import jalview.bin.*; -import jalview.analysis.*; -import jalview.datamodel.*; -import jalview.schemes.*; -import java.util.*; - -public class AlignViewport -{ - int startRes; - int endRes; - - int startSeq; - int endSeq; - - boolean showFullId = 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 colourAppliesToAllGroups = true; - ColourSchemeI globalColourScheme = null; - boolean conservationColourSelected = false; - boolean abovePIDThreshold = false; - - SequenceGroup selectionGroup = new SequenceGroup(); - - int charHeight; - int charWidth; - int chunkWidth; - int chunkHeight; - - Font font = new Font("SansSerif",Font.PLAIN,10); - AlignmentI alignment; - - ColumnSelection colSel = new ColumnSelection(); - - int threshold; - int increment; - - NJTree currentTree = null; - - boolean scaleAboveWrapped = true; - boolean scaleLeftWrapped = true; - boolean scaleRightWrapped = true; - - public AlignViewport(AlignmentI al, JalviewLite applet) - { - setAlignment(al); - this.startRes = 0; - this.endRes = al.getWidth()-1; - this.startSeq = 0; - this.endSeq = al.getHeight()-1; - setFont(font); - - - if(applet!=null) - { - String param = applet.getParameter("showFullId"); - if (param != null) - showFullId = Boolean.valueOf(param).booleanValue(); - - param = applet.getParameter("showAnnotation"); - if (param != null) - showAnnotation = Boolean.valueOf(param).booleanValue(); - - param = applet.getParameter("showConservation"); - if (param != null) - showConservation = Boolean.valueOf(param).booleanValue(); - - param = applet.getParameter("showQuality"); - if (param != null) - showQuality = Boolean.valueOf(param).booleanValue(); - - param = applet.getParameter("showConsensus"); - if (param != null) - showConsensus = Boolean.valueOf(param).booleanValue(); - } - // We must set conservation and consensus before setting colour, - // as Blosum and Clustal require this to be done - updateConservation(); - updateConsensus(); - - if(applet!=null && applet.getParameter("defaultColour")!=null) - { - globalColourScheme = ColourSchemeProperty.getColour(alignment, - applet.getParameter("defaultColour")); - if(globalColourScheme!=null) - globalColourScheme.setConsensus( vconsensus ); - } - } - - - public void showSequenceFeatures(boolean b) - { - showSequenceFeatures = b; - } - - public Vector vconsensus; - AlignmentAnnotation consensus; - AlignmentAnnotation conservation; - AlignmentAnnotation quality; - - public int ConsPercGaps = 25; // JBPNote : This should be a scalable property! - - public void updateConservation() - { - Conservation cons = new jalview.analysis.Conservation("All", - jalview.schemes.ResidueProperties.propHash, 3, - alignment.getSequences(), 0, - alignment.getWidth()-1); - cons.calculate(); - cons.verdict(false, ConsPercGaps); - cons.findQuality(); - int alWidth = alignment.getWidth(); - Annotation [] annotations = new Annotation[alWidth]; - Annotation [] qannotations = new Annotation[alWidth]; - String sequence = cons.getConsSequence().getSequence(); - float minR,minG,minB, maxR,maxG,maxB; - minR = 0.3f; - minG = 0.0f; - minB = 0f; - maxR = 1.0f-minR; maxG=0.9f-minG; maxB=0f-minB; // scalable range for colouring both Conservation and Quality - float min = 0f; - float max = 11f; - float qmin = cons.qualityRange[0].floatValue(); - float qmax = cons.qualityRange[1].floatValue(); - - for (int i = 0; i < alWidth; i++) - { - float value = 0; - try - { - value = Integer.parseInt(sequence.charAt(i) + ""); - } - catch (Exception ex) - { - if (sequence.charAt(i) == '*') value = 11; - if (sequence.charAt(i) == '+') value = 10; - } - float vprop = value-min; - vprop/=max; - - annotations[i] = new Annotation(sequence.charAt(i) + "", - "", ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop)); - // Quality calc - value = ((Double) cons.quality.elementAt(i)).floatValue(); - vprop = value - qmin; - vprop/=qmax; - qannotations[i] = new Annotation(" ", - String.valueOf(value), ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop)); - } - - if(conservation==null) - { - conservation = new AlignmentAnnotation("Conservation", - "Conservation of total alignment less than "+ConsPercGaps+"% gaps", - annotations, - 0f, // cons.qualityRange[0].floatValue(), - 11f, // cons.qualityRange[1].floatValue() - 1); - if(showConservation) - alignment.addAnnotation(conservation); - quality = new AlignmentAnnotation("Quality", - "Alignment Quality based on Blosum62 scores", - qannotations, - cons.qualityRange[0].floatValue(), - cons.qualityRange[1].floatValue(), - 1); - if(showQuality) - alignment.addAnnotation(quality); - } - else { - conservation.annotations = annotations; - quality.annotations = qannotations; - quality.graphMax = cons.qualityRange[1].floatValue(); - } - - - } - - public void updateConsensus() - { - Annotation [] annotations = new Annotation[alignment.getWidth()]; - - // this routine prevents vconsensus becoming a new object each time - // consenus is calculated. Important for speed of Blosum62 - // and PID colouring of alignment - if(vconsensus == null) - vconsensus = alignment.getAAFrequency(); - else - { - Vector temp = alignment.getAAFrequency(); - vconsensus.removeAllElements(); - Enumeration e = temp.elements(); - while(e.hasMoreElements()) - { - vconsensus.addElement(e.nextElement()); - } - } - Hashtable hash = null; - for (int i = 0; i2) - { - mouseOver = "["+maxRes+"] "; - maxRes = "+ "; - } - - mouseOver += (int)value+"%"; - annotations[i] = new Annotation(maxRes, mouseOver, ' ', value); - - } - - if(consensus==null) - { - consensus = new AlignmentAnnotation("Consensus", - "PID", annotations, 0f, 100f, 1); - if(showConsensus) - alignment.addAnnotation(consensus); - } - else - consensus.annotations = annotations; - - } - - - public SequenceGroup getSelectionGroup() - { - return selectionGroup; - } - - public void setSelectionGroup(SequenceGroup sg) - { - selectionGroup = sg; - } - - - 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 setGlobalColourScheme(ColourSchemeI cs) - { - globalColourScheme = cs; - } - - public ColourSchemeI getGlobalColourScheme() - { - return globalColourScheme; - } - - - 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; - } - - public void setFont(Font f) { - font = f; - java.awt.Frame temp = new java.awt.Frame(); - temp.addNotify(); - java.awt.FontMetrics fm = temp.getGraphics().getFontMetrics(font); - setCharHeight(fm.getHeight()); - setCharWidth(fm.charWidth('M')); - } - - public Font getFont() { - return font; - } - public void setCharWidth(int w) { - this.charWidth = w; - } - public int getCharWidth() { - return charWidth; - } - public void setCharHeight(int h) { - this.charHeight = h; - } - public int getCharHeight() { - return charHeight; - } - public void setChunkWidth(int w) { - this.chunkWidth = w; - } - public int getChunkWidth() { - return chunkWidth; - } - public void setChunkHeight(int h) { - this.chunkHeight = h; - } - public int getChunkHeight() { - return chunkHeight; - } - 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 int getIndex(int y) { - int y1 = 0; - int starty = getStartSeq(); - int endy = getEndSeq(); - - for (int i = starty; i <= endy; i++) { - if (i < alignment.getHeight() && alignment.getSequenceAt(i) != null) { - int y2 = y1 + getCharHeight(); - - if (y>=y1 && y <=y2) { - return i; - } - y1 = y2; - } else { - return -1; - } - } - return -1; - } - - public ColumnSelection getColumnSelection() { - return colSel; - } - - 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; } - - public boolean getColourAppliesToAllGroups() - {return colourAppliesToAllGroups; } - - public boolean getShowFullId() - { - return showFullId; - } - - public void setShowFullId(boolean b) - { - showFullId = b; - } - - public boolean getShowAnnotation() - { - return showAnnotation; - } - - public void setShowAnnotation(boolean b) - { - showAnnotation = b; - } - - public boolean getScaleAboveWrapped() - { return scaleAboveWrapped;} - - public boolean getScaleLeftWrapped() - { return scaleLeftWrapped; } - - public boolean getScaleRightWrapped() - { return scaleRightWrapped; } - - public void setScaleAboveWrapped(boolean b) - { scaleAboveWrapped = b; } - - public void setScaleLeftWrapped(boolean b) - { scaleLeftWrapped = b; } - - public void setScaleRightWrapped(boolean b) - { scaleRightWrapped = b; } - - -} +/* + * 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. + * + * 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 . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.appletgui; + +import jalview.analysis.NJTree; +import jalview.api.AlignViewportI; +import jalview.api.FeatureSettingsModelI; +import jalview.bin.JalviewLite; +import jalview.commands.CommandI; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.SearchResults; +import jalview.datamodel.SearchResultsI; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.renderer.ResidueShader; +import jalview.schemes.ColourSchemeProperty; +import jalview.schemes.UserColourScheme; +import jalview.structure.CommandListener; +import jalview.structure.SelectionSource; +import jalview.structure.StructureSelectionManager; +import jalview.structure.VamsasSource; +import jalview.viewmodel.AlignmentViewport; + +import java.awt.Font; + +public class AlignViewport extends AlignmentViewport implements + SelectionSource, VamsasSource, CommandListener +{ + boolean cursorMode = false; + + Font font = new Font("SansSerif", Font.PLAIN, 10); + + boolean validCharWidth = true; + + NJTree currentTree = null; + + public jalview.bin.JalviewLite applet; + + boolean MAC = false; + + private AnnotationColumnChooser annotationColumnSelectionState; + + @Override + public void finalize() + { + applet = null; + quality = null; + alignment = null; + colSel = null; + } + + public AlignViewport(AlignmentI al, JalviewLite applet) + { + super(); + calculator = new jalview.workers.AlignCalcManager(); + this.applet = applet; + alignment = 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 + String param = applet.getParameter("widthScale"); + if (param != null) + { + try + { + widthScale = new Float(param).floatValue(); + } catch (Exception e) + { + } + if (widthScale <= 1.0) + { + System.err + .println("Invalid alignment character width scaling factor (" + + widthScale + "). Ignoring."); + widthScale = 1; + } + if (JalviewLite.debug) + { + System.err + .println("Alignment character width scaling factor is now " + + widthScale); + } + } + param = applet.getParameter("heightScale"); + if (param != null) + { + try + { + heightScale = new Float(param).floatValue(); + } catch (Exception e) + { + } + if (heightScale <= 1.0) + { + System.err + .println("Invalid alignment character height scaling factor (" + + heightScale + "). Ignoring."); + heightScale = 1; + } + if (JalviewLite.debug) + { + System.err + .println("Alignment character height scaling factor is now " + + heightScale); + } + } + } + setFont(font); + + MAC = new jalview.util.Platform().isAMac(); + + if (applet != null) + { + setShowJVSuffix(applet.getDefaultParameter("showFullId", + getShowJVSuffix())); + + setShowAnnotation(applet.getDefaultParameter("showAnnotation", + isShowAnnotation())); + + showConservation = applet.getDefaultParameter("showConservation", + showConservation); + + showQuality = applet.getDefaultParameter("showQuality", showQuality); + + showConsensus = applet.getDefaultParameter("showConsensus", + showConsensus); + + setShowUnconserved(applet.getDefaultParameter("showUnconserved", + getShowUnconserved())); + + setScaleProteinAsCdna(applet.getDefaultParameter( + "scaleProteinAsCdna", isScaleProteinAsCdna())); + + String param = applet.getParameter("upperCase"); + if (param != null) + { + if (param.equalsIgnoreCase("bold")) + { + setUpperCasebold(true); + } + } + sortByTree = applet.getDefaultParameter("sortByTree", sortByTree); + + setFollowHighlight(applet.getDefaultParameter("automaticScrolling", + isFollowHighlight())); + followSelection = isFollowHighlight(); + + showSequenceLogo = applet.getDefaultParameter("showSequenceLogo", + showSequenceLogo); + + normaliseSequenceLogo = applet.getDefaultParameter( + "normaliseSequenceLogo", applet.getDefaultParameter( + "normaliseLogo", normaliseSequenceLogo)); + + showGroupConsensus = applet.getDefaultParameter("showGroupConsensus", + showGroupConsensus); + + showGroupConservation = applet.getDefaultParameter( + "showGroupConservation", showGroupConservation); + + showConsensusHistogram = applet.getDefaultParameter( + "showConsensusHistogram", showConsensusHistogram); + + } + + if (applet != null) + { + String colour = al.isNucleotide() ? applet + .getParameter("defaultColourNuc") : applet + .getParameter("defaultColourProt"); + if (colour == null) + { + colour = applet.getParameter("defaultColour"); + } + if (colour == null) + { + colour = applet.getParameter("userDefinedColour"); + if (colour != null) + { + colour = "User Defined"; + } + } + + if (colour != null) + { + residueShading = new ResidueShader( + ColourSchemeProperty.getColourScheme(alignment, colour)); + if (residueShading != null) + { + residueShading.setConsensus(hconsensus); + } + } + + if (applet.getParameter("userDefinedColour") != null) + { + residueShading = new ResidueShader( + new UserColourScheme( + applet.getParameter("userDefinedColour"))); + } + } + initAutoAnnotation(); + + } + + /** + * 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; + } + StringBuilder seqs = new StringBuilder(consensus.annotations.length); + 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; + } + + java.awt.Frame nullFrame; + + protected FeatureSettings featureSettings = null; + + private float heightScale = 1, widthScale = 1; + + public void setFont(Font f) + { + font = f; + if (nullFrame == null) + { + nullFrame = new java.awt.Frame(); + nullFrame.addNotify(); + } + + java.awt.FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font); + setCharHeight((int) (heightScale * fm.getHeight())); + setCharWidth((int) (widthScale * fm.charWidth('M'))); + + if (isUpperCasebold()) + { + Font f2 = new Font(f.getName(), Font.BOLD, f.getSize()); + fm = nullFrame.getGraphics().getFontMetrics(f2); + setCharWidth((int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10))); + } + } + + public Font getFont() + { + return font; + } + + public void resetSeqLimits(int height) + { + setEndSeq(height / getCharHeight()); + } + + public void setCurrentTree(NJTree tree) + { + currentTree = tree; + } + + public NJTree getCurrentTree() + { + return currentTree; + } + + boolean centreColumnLabels; + + public boolean getCentreColumnLabels() + { + return centreColumnLabels; + } + + public boolean followSelection = true; + + /** + * @return true if view selection should always follow the selections + * broadcast by other selection sources + */ + public boolean getFollowSelection() + { + return followSelection; + } + + @Override + public void sendSelection() + { + getStructureSelectionManager().sendSelection( + new SequenceGroup(getSelectionGroup()), + new ColumnSelection(getColumnSelection()), this); + } + + /** + * Returns an instance of the StructureSelectionManager scoped to this applet + * instance. + * + * @return + */ + @Override + public StructureSelectionManager getStructureSelectionManager() + { + return jalview.structure.StructureSelectionManager + .getStructureSelectionManager(applet); + } + + @Override + public boolean isNormaliseSequenceLogo() + { + return normaliseSequenceLogo; + } + + public void setNormaliseSequenceLogo(boolean state) + { + normaliseSequenceLogo = state; + } + + /** + * + * @return true if alignment characters should be displayed + */ + @Override + public boolean isValidCharWidth() + { + return validCharWidth; + } + + public AnnotationColumnChooser getAnnotationColumnSelectionState() + { + return annotationColumnSelectionState; + } + + public void setAnnotationColumnSelectionState( + AnnotationColumnChooser annotationColumnSelectionState) + { + this.annotationColumnSelectionState = annotationColumnSelectionState; + } + + @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) + { + // ok to continue; + } + else + { + return; + } + + CommandI mappedCommand = ssm.mapCommand(command, undo, getAlignment(), + getGapCharacter()); + if (mappedCommand != null) + { + mappedCommand.doCommand(null); + firePropertyChange("alignment", null, getAlignment().getSequences()); + + // ap.scalePanelHolder.repaint(); + // ap.repaint(); + } + } + + @Override + public VamsasSource getVamsasSource() + { + return this; + } + + /** + * If this viewport has a (Protein/cDNA) complement, then scroll the + * complementary alignment to match this one. + */ + public void scrollComplementaryAlignment(AlignmentPanel complementPanel) + { + if (complementPanel == null) + { + return; + } + + /* + * 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.setFollowingComplementScroll(true); + complementPanel.scrollToCentre(sr, seqOffset); + } + } + + /** + * 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. + * + * @param featureSettings + */ + @Override + public void applyFeaturesStyle(FeatureSettingsModelI featureSettings) + { + // TODO implement for applet + } + +}