X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FAlignmentViewport.java;h=3f1946e70e32be93c01a4ed75c879c09c2608b5b;hb=ecdc8f7020e2fe1b510e03635801528a08480ec8;hp=8e661889b32bac1d0c0b2ab301fc129f28e91faa;hpb=b4877bc99e12cf4465e43e090e19277c3139ce77;p=jalview.git
diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java
index 8e66188..3f1946e 100644
--- a/src/jalview/viewmodel/AlignmentViewport.java
+++ b/src/jalview/viewmodel/AlignmentViewport.java
@@ -1,1079 +1,2560 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
- * 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.viewmodel;
+import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
import jalview.analysis.Conservation;
import jalview.api.AlignCalcManagerI;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.FeaturesDisplayedI;
+import jalview.api.ViewStyleI;
+import jalview.commands.CommandI;
+import jalview.datamodel.AlignedCodonFrame;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AlignmentView;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.CigarArray;
import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenSequences;
+import jalview.datamodel.SearchResults;
import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceCollectionI;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
-import jalview.schemes.ClustalxColourScheme;
+import jalview.schemes.Blosum62ColourScheme;
import jalview.schemes.ColourSchemeI;
+import jalview.schemes.PIDColourScheme;
import jalview.schemes.ResidueProperties;
+import jalview.structure.CommandListener;
+import jalview.structure.StructureSelectionManager;
+import jalview.structure.VamsasSource;
+import jalview.util.Comparison;
+import jalview.util.MappingUtils;
+import jalview.viewmodel.styles.ViewStyle;
import jalview.workers.AlignCalcManager;
+import jalview.workers.ComplementConsensusThread;
import jalview.workers.ConsensusThread;
-import jalview.workers.ConservationThread;
import jalview.workers.StrucConsensusThread;
+import java.awt.Color;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Deque;
+import java.util.HashMap;
import java.util.Hashtable;
-import java.util.Vector;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
- * base class holding visualization and analysis attributes and common logic for an active alignment view displayed in the GUI
+ * base class holding visualization and analysis attributes and common logic for
+ * an active alignment view displayed in the GUI
+ *
* @author jimp
- *
+ *
*/
-public abstract class AlignmentViewport implements AlignViewportI
+public abstract class AlignmentViewport implements AlignViewportI,
+ CommandListener, VamsasSource
{
+ protected ViewStyleI viewStyle = new ViewStyle();
+
/**
- * alignment displayed in the viewport. Please use get/setter
+ * A viewport that hosts the cDna view of this (protein), or vice versa (if
+ * set).
*/
- protected AlignmentI alignment;
-
- protected String sequenceSetID;
-
- private Hashtable hiddenRepSequences;
-
- protected ColumnSelection colSel = new ColumnSelection();
-
-
- public boolean autoCalculateConsensus = true;
-
- protected boolean autoCalculateStrucConsensus = true;
+ AlignViewportI codingComplement = null;
- protected boolean ignoreGapsInConsensusCalculation = false;
-
+ FeaturesDisplayedI featuresDisplayed = null;
- protected ColourSchemeI globalColourScheme = null;
+ protected Deque historyList = new ArrayDeque();
+ protected Deque redoList = new ArrayDeque();
- public void setGlobalColourScheme(ColourSchemeI cs)
+ /**
+ * @param name
+ * @see jalview.api.ViewStyleI#setFontName(java.lang.String)
+ */
+ public void setFontName(String name)
{
- globalColourScheme = cs;
+ viewStyle.setFontName(name);
}
- public ColourSchemeI getGlobalColourScheme()
+ /**
+ * @param style
+ * @see jalview.api.ViewStyleI#setFontStyle(int)
+ */
+ public void setFontStyle(int style)
{
- return globalColourScheme;
+ viewStyle.setFontStyle(style);
}
-
- protected AlignmentAnnotation consensus;
-
- protected AlignmentAnnotation strucConsensus;
-
- protected AlignmentAnnotation conservation;
-
- protected AlignmentAnnotation quality;
-
- protected AlignmentAnnotation[] groupConsensus;
-
- protected AlignmentAnnotation[] groupConservation;
-
- /**
- * results of alignment consensus analysis for visible portion of view
- */
- protected Hashtable[] hconsensus=null;
-
/**
- * results of secondary structure base pair consensus for visible portion of view
+ * @param size
+ * @see jalview.api.ViewStyleI#setFontSize(int)
*/
- protected Hashtable[] hStrucConsensus=null;
+ public void setFontSize(int size)
+ {
+ viewStyle.setFontSize(size);
+ }
/**
- * percentage gaps allowed in a column before all amino acid properties should be considered unconserved
+ * @return
+ * @see jalview.api.ViewStyleI#getFontStyle()
*/
- int ConsPercGaps = 25; // JBPNote : This should be a scalable property!
-
-
- public int getConsPercGaps()
+ public int getFontStyle()
{
- return ConsPercGaps;
+ return viewStyle.getFontStyle();
}
- @Override
- public void setSequenceConsensusHash(Hashtable[] hconsensus)
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getFontName()
+ */
+ public String getFontName()
{
- this.hconsensus=hconsensus;
-
+ return viewStyle.getFontName();
}
- @Override
- public Hashtable[] getSequenceConsensusHash()
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getFontSize()
+ */
+ public int getFontSize()
{
- return hconsensus;
+ return viewStyle.getFontSize();
}
- @Override
- public Hashtable[] getRnaStructureConsensusHash()
+ /**
+ * @param upperCasebold
+ * @see jalview.api.ViewStyleI#setUpperCasebold(boolean)
+ */
+ public void setUpperCasebold(boolean upperCasebold)
{
- return hStrucConsensus;
+ viewStyle.setUpperCasebold(upperCasebold);
}
- @Override
- public void setRnaStructureConsensusHash(Hashtable[] hStrucConsensus)
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#isUpperCasebold()
+ */
+ public boolean isUpperCasebold()
{
- this.hStrucConsensus=hStrucConsensus;
-
+ return viewStyle.isUpperCasebold();
}
- @Override
- public AlignmentAnnotation getAlignmentQualityAnnot()
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#isSeqNameItalics()
+ */
+ public boolean isSeqNameItalics()
{
- return quality;
+ return viewStyle.isSeqNameItalics();
}
- @Override
- public AlignmentAnnotation getAlignmentConservationAnnotation()
+ /**
+ * @param colourByReferenceSeq
+ * @see jalview.api.ViewStyleI#setColourByReferenceSeq(boolean)
+ */
+ public void setColourByReferenceSeq(boolean colourByReferenceSeq)
{
- return conservation;
+ viewStyle.setColourByReferenceSeq(colourByReferenceSeq);
}
- @Override
- public AlignmentAnnotation getAlignmentConsensusAnnotation()
+
+ /**
+ * @param b
+ * @see jalview.api.ViewStyleI#setColourAppliesToAllGroups(boolean)
+ */
+ public void setColourAppliesToAllGroups(boolean b)
{
- return consensus;
+ viewStyle.setColourAppliesToAllGroups(b);
}
- @Override
- public AlignmentAnnotation getAlignmentStrucConsensusAnnotation()
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getColourAppliesToAllGroups()
+ */
+ public boolean getColourAppliesToAllGroups()
{
- return strucConsensus;
+ return viewStyle.getColourAppliesToAllGroups();
}
-
- protected AlignCalcManagerI calculator=new AlignCalcManager();
-
- jalview.workers.ConsensusThread consensusThread;
-
- StrucConsensusThread strucConsensusThread;
-
-
- private ConservationThread conservationThread;
/**
- * trigger update of conservation annotation
+ * @return
+ * @see jalview.api.ViewStyleI#getAbovePIDThreshold()
*/
- public void updateConservation(final AlignmentViewPanel ap)
+ public boolean getAbovePIDThreshold()
{
- // see note in mantis : issue number 8585
- if (alignment.isNucleotide() || conservation == null
- || !autoCalculateConsensus)
- {
- return;
- }
-
- calculator.startWorker(conservationThread=new jalview.workers.ConservationThread(this, ap));
+ return viewStyle.getAbovePIDThreshold();
}
/**
- * trigger update of consensus annotation
+ * @param inc
+ * @see jalview.api.ViewStyleI#setIncrement(int)
*/
- public void updateConsensus(final AlignmentViewPanel ap)
+ public void setIncrement(int inc)
{
- // see note in mantis : issue number 8585
- if (consensus == null || !autoCalculateConsensus)
- {
- return;
- }
- calculator.startWorker(consensusThread = new ConsensusThread(this, ap));
+ viewStyle.setIncrement(inc);
}
- // --------START Structure Conservation
- public void updateStrucConsensus(final AlignmentViewPanel ap)
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getIncrement()
+ */
+ public int getIncrement()
{
- // see note in mantis : issue number 8585
- if (strucConsensus == null || !autoCalculateStrucConsensus)
- {
- return;
- }
- calculator.startWorker(strucConsensusThread = new StrucConsensusThread(this,ap));
+ return viewStyle.getIncrement();
}
- public boolean isCalcInProgress()
+ /**
+ * @param b
+ * @see jalview.api.ViewStyleI#setConservationSelected(boolean)
+ */
+ public void setConservationSelected(boolean b)
{
- return calculator.isWorking();
+ viewStyle.setConservationSelected(b);
}
- public boolean isCalculationInProgress(
- AlignmentAnnotation alignmentAnnotation)
+ /**
+ * @param show
+ * @see jalview.api.ViewStyleI#setShowHiddenMarkers(boolean)
+ */
+ public void setShowHiddenMarkers(boolean show)
{
- if (!alignmentAnnotation.autoCalculated)
- return false;
- if ((calculator.isWorking(consensusThread) && consensus==alignmentAnnotation)
- || (calculator.isWorking(conservationThread) && (conservation==alignmentAnnotation || quality==alignmentAnnotation))
- || (calculator.isWorking(strucConsensusThread) && strucConsensus==alignmentAnnotation)
- )
- {
- return true;
- }
- return false;
+ viewStyle.setShowHiddenMarkers(show);
}
- @Override
- public boolean isClosed()
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getShowHiddenMarkers()
+ */
+ public boolean getShowHiddenMarkers()
{
- // TODO: check that this isClosed is only true after panel is closed, not before it is fully constructed.
- return alignment==null;
+ return viewStyle.getShowHiddenMarkers();
}
- @Override
- public AlignCalcManagerI getCalcManager()
+ /**
+ * @param b
+ * @see jalview.api.ViewStyleI#setScaleRightWrapped(boolean)
+ */
+ public void setScaleRightWrapped(boolean b)
{
- return calculator;
+ viewStyle.setScaleRightWrapped(b);
}
/**
- * should conservation rows be shown for groups
+ * @param b
+ * @see jalview.api.ViewStyleI#setScaleLeftWrapped(boolean)
*/
- protected boolean showGroupConservation = false;
+ public void setScaleLeftWrapped(boolean b)
+ {
+ viewStyle.setScaleLeftWrapped(b);
+ }
/**
- * should consensus rows be shown for groups
+ * @param b
+ * @see jalview.api.ViewStyleI#setScaleAboveWrapped(boolean)
*/
- protected boolean showGroupConsensus = false;
+ public void setScaleAboveWrapped(boolean b)
+ {
+ viewStyle.setScaleAboveWrapped(b);
+ }
/**
- * should consensus profile be rendered by default
+ * @return
+ * @see jalview.api.ViewStyleI#getScaleLeftWrapped()
*/
- protected boolean showSequenceLogo = false;
+ public boolean getScaleLeftWrapped()
+ {
+ return viewStyle.getScaleLeftWrapped();
+ }
+
/**
- * should consensus profile be rendered normalised to row height
+ * @return
+ * @see jalview.api.ViewStyleI#getScaleAboveWrapped()
*/
- protected boolean normaliseSequenceLogo = false;
+ public boolean getScaleAboveWrapped()
+ {
+ return viewStyle.getScaleAboveWrapped();
+ }
+
/**
- * should consensus histograms be rendered by default
+ * @return
+ * @see jalview.api.ViewStyleI#getScaleRightWrapped()
*/
- protected boolean showConsensusHistogram = true;
+ public boolean getScaleRightWrapped()
+ {
+ return viewStyle.getScaleRightWrapped();
+ }
/**
- * @return the showConsensusProfile
+ * @param b
+ * @see jalview.api.ViewStyleI#setAbovePIDThreshold(boolean)
*/
- public boolean isShowSequenceLogo()
+ public void setAbovePIDThreshold(boolean b)
{
- return showSequenceLogo;
+ viewStyle.setAbovePIDThreshold(b);
}
/**
- * @param showSequenceLogo
- * the new value
+ * @param thresh
+ * @see jalview.api.ViewStyleI#setThreshold(int)
*/
- public void setShowSequenceLogo(boolean showSequenceLogo)
+ public void setThreshold(int thresh)
{
- if (showSequenceLogo != this.showSequenceLogo)
- {
- // TODO: decouple settings setting from calculation when refactoring
- // annotation update method from alignframe to viewport
- this.showSequenceLogo = showSequenceLogo;
- if (consensusThread != null)
- {
- consensusThread.updateAnnotation();
- }
- if (strucConsensusThread != null)
- {
- strucConsensusThread.updateAnnotation();
- }
- }
- this.showSequenceLogo = showSequenceLogo;
+ viewStyle.setThreshold(thresh);
}
/**
- * @param showConsensusHistogram
- * the showConsensusHistogram to set
+ * @return
+ * @see jalview.api.ViewStyleI#getThreshold()
*/
- public void setShowConsensusHistogram(boolean showConsensusHistogram)
+ public int getThreshold()
{
- this.showConsensusHistogram = showConsensusHistogram;
+ return viewStyle.getThreshold();
}
/**
- * @return the showGroupConservation
+ * @return
+ * @see jalview.api.ViewStyleI#getShowJVSuffix()
*/
- public boolean isShowGroupConservation()
+ public boolean getShowJVSuffix()
{
- return showGroupConservation;
+ return viewStyle.getShowJVSuffix();
}
/**
- * @param showGroupConservation
- * the showGroupConservation to set
+ * @param b
+ * @see jalview.api.ViewStyleI#setShowJVSuffix(boolean)
*/
- public void setShowGroupConservation(boolean showGroupConservation)
+ public void setShowJVSuffix(boolean b)
{
- this.showGroupConservation = showGroupConservation;
+ viewStyle.setShowJVSuffix(b);
}
/**
- * @return the showGroupConsensus
+ * @param state
+ * @see jalview.api.ViewStyleI#setWrapAlignment(boolean)
*/
- public boolean isShowGroupConsensus()
+ public void setWrapAlignment(boolean state)
{
- return showGroupConsensus;
+ viewStyle.setWrapAlignment(state);
}
/**
- * @param showGroupConsensus
- * the showGroupConsensus to set
+ * @param state
+ * @see jalview.api.ViewStyleI#setShowText(boolean)
*/
- public void setShowGroupConsensus(boolean showGroupConsensus)
+ public void setShowText(boolean state)
{
- this.showGroupConsensus = showGroupConsensus;
+ viewStyle.setShowText(state);
}
/**
- *
- * @return flag to indicate if the consensus histogram should be rendered by
- * default
+ * @param state
+ * @see jalview.api.ViewStyleI#setRenderGaps(boolean)
*/
- public boolean isShowConsensusHistogram()
+ public void setRenderGaps(boolean state)
{
- return this.showConsensusHistogram;
+ viewStyle.setRenderGaps(state);
}
/**
- * show non-conserved residues only
+ * @return
+ * @see jalview.api.ViewStyleI#getColourText()
*/
- protected boolean showUnconserved = false;
-
+ public boolean getColourText()
+ {
+ return viewStyle.getColourText();
+ }
/**
- * when set, updateAlignment will always ensure sequences are of equal length
+ * @param state
+ * @see jalview.api.ViewStyleI#setColourText(boolean)
*/
- private boolean padGaps = false;
+ public void setColourText(boolean state)
+ {
+ viewStyle.setColourText(state);
+ }
/**
- * when set, alignment should be reordered according to a newly opened tree
+ * @return
+ * @see jalview.api.ViewStyleI#getWrapAlignment()
*/
- public boolean sortByTree = false;
-
- public boolean getShowUnconserved()
+ public boolean getWrapAlignment()
{
- return showUnconserved;
+ return viewStyle.getWrapAlignment();
}
- public void setShowUnconserved(boolean showunconserved)
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getShowText()
+ */
+ public boolean getShowText()
{
- showUnconserved = showunconserved;
+ return viewStyle.getShowText();
}
/**
- * @param showNonconserved
- * the showUnconserved to set
+ * @return
+ * @see jalview.api.ViewStyleI#getWrappedWidth()
*/
- public void setShowunconserved(boolean displayNonconserved)
+ public int getWrappedWidth()
{
- this.showUnconserved = displayNonconserved;
+ return viewStyle.getWrappedWidth();
}
/**
- *
- *
- * @return null or the currently selected sequence region
+ * @param w
+ * @see jalview.api.ViewStyleI#setWrappedWidth(int)
*/
- public SequenceGroup getSelectionGroup()
+ public void setWrappedWidth(int w)
{
- return selectionGroup;
+ viewStyle.setWrappedWidth(w);
}
/**
- * Set the selection group for this window.
- *
- * @param sg
- * - group holding references to sequences in this alignment view
- *
+ * @return
+ * @see jalview.api.ViewStyleI#getCharHeight()
*/
- public void setSelectionGroup(SequenceGroup sg)
+ public int getCharHeight()
{
- selectionGroup = sg;
+ return viewStyle.getCharHeight();
}
- public void setHiddenColumns(ColumnSelection colsel)
+ /**
+ * @param h
+ * @see jalview.api.ViewStyleI#setCharHeight(int)
+ */
+ public void setCharHeight(int h)
{
- this.colSel = colsel;
- if (colSel.getHiddenColumns() != null)
- {
- hasHiddenColumns = true;
- }
+ viewStyle.setCharHeight(h);
}
- public ColumnSelection getColumnSelection()
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getCharWidth()
+ */
+ public int getCharWidth()
{
- return colSel;
+ return viewStyle.getCharWidth();
}
- public void setColumnSelection(ColumnSelection colSel)
+
+ /**
+ * @param w
+ * @see jalview.api.ViewStyleI#setCharWidth(int)
+ */
+ public void setCharWidth(int w)
{
- this.colSel=colSel;
+ viewStyle.setCharWidth(w);
}
- public Hashtable getHiddenRepSequences()
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getShowBoxes()
+ */
+ public boolean getShowBoxes()
{
- return hiddenRepSequences;
+ return viewStyle.getShowBoxes();
}
- public void setHiddenRepSequences(Hashtable hiddenRepSequences)
+
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getShowUnconserved()
+ */
+ public boolean getShowUnconserved()
+ {
+ return viewStyle.getShowUnconserved();
+ }
+
+ /**
+ * @param showunconserved
+ * @see jalview.api.ViewStyleI#setShowUnconserved(boolean)
+ */
+ public void setShowUnconserved(boolean showunconserved)
+ {
+ viewStyle.setShowUnconserved(showunconserved);
+ }
+
+ /**
+ * @param default1
+ * @see jalview.api.ViewStyleI#setSeqNameItalics(boolean)
+ */
+ public void setSeqNameItalics(boolean default1)
+ {
+ viewStyle.setSeqNameItalics(default1);
+ }
+
+ /**
+ * alignment displayed in the viewport. Please use get/setter
+ */
+ protected AlignmentI alignment;
+
+ @Override
+ public AlignmentI getAlignment()
+ {
+ return alignment;
+ }
+
+ @Override
+ public char getGapCharacter()
+ {
+ return alignment.getGapCharacter();
+ }
+
+ protected String sequenceSetID;
+
+ /**
+ * probably unused indicator that view is of a dataset rather than an
+ * alignment
+ */
+ protected boolean isDataset = false;
+
+ public void setDataset(boolean b)
+ {
+ isDataset = b;
+ }
+
+ public boolean isDataset()
+ {
+ return isDataset;
+ }
+
+ private Map hiddenRepSequences;
+
+ protected ColumnSelection colSel = new ColumnSelection();
+
+ public boolean autoCalculateConsensus = true;
+
+ protected boolean autoCalculateStrucConsensus = true;
+
+ protected boolean ignoreGapsInConsensusCalculation = false;
+
+ protected ColourSchemeI globalColourScheme = null;
+
+ @Override
+ public void setGlobalColourScheme(ColourSchemeI cs)
+ {
+ // TODO: logic refactored from AlignFrame changeColour -
+ // TODO: autorecalc stuff should be changed to rely on the worker system
+ // check to see if we should implement a changeColour(cs) method rather than
+ // put th logic in here
+ // - means that caller decides if they want to just modify state and defer
+ // calculation till later or to do all calculations in thread.
+ // via changecolour
+ globalColourScheme = cs;
+ boolean recalc = false;
+ if (cs != null)
+ {
+ cs.setConservationApplied(recalc = getConservationSelected());
+ if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
+ || cs instanceof Blosum62ColourScheme)
+ {
+ recalc = true;
+ cs.setThreshold(viewStyle.getThreshold(),
+ ignoreGapsInConsensusCalculation);
+ }
+ else
+ {
+ cs.setThreshold(0, ignoreGapsInConsensusCalculation);
+ }
+ if (recalc)
+ {
+ cs.setConsensus(hconsensus);
+ cs.setConservation(hconservation);
+ }
+ cs.alignmentChanged(alignment, hiddenRepSequences);
+ }
+ if (getColourAppliesToAllGroups())
+ {
+ for (SequenceGroup sg : getAlignment().getGroups())
+ {
+ if (cs == null)
+ {
+ sg.cs = null;
+ continue;
+ }
+ sg.cs = cs.applyTo(sg, getHiddenRepSequences());
+ sg.setConsPercGaps(ConsPercGaps);
+ if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
+ || cs instanceof Blosum62ColourScheme)
+ {
+ sg.cs.setThreshold(viewStyle.getThreshold(),
+ isIgnoreGapsConsensus());
+ recalc = true;
+ }
+ else
+ {
+ sg.cs.setThreshold(0, isIgnoreGapsConsensus());
+ }
+
+ if (getConservationSelected())
+ {
+ sg.cs.setConservationApplied(true);
+ recalc = true;
+ }
+ else
+ {
+ sg.cs.setConservation(null);
+ // sg.cs.setThreshold(0, getIgnoreGapsConsensus());
+ }
+ if (recalc)
+ {
+ sg.recalcConservation();
+ }
+ else
+ {
+ sg.cs.alignmentChanged(sg, hiddenRepSequences);
+ }
+ }
+ }
+ }
+
+ @Override
+ public ColourSchemeI getGlobalColourScheme()
+ {
+ return globalColourScheme;
+ }
+
+ protected AlignmentAnnotation consensus;
+
+ protected AlignmentAnnotation complementConsensus;
+
+ protected AlignmentAnnotation strucConsensus;
+
+ protected AlignmentAnnotation conservation;
+
+ protected AlignmentAnnotation quality;
+
+ protected AlignmentAnnotation[] groupConsensus;
+
+ protected AlignmentAnnotation[] groupConservation;
+
+ /**
+ * results of alignment consensus analysis for visible portion of view
+ */
+ protected Hashtable[] hconsensus = null;
+
+ /**
+ * results of cDNA complement consensus visible portion of view
+ */
+ protected Hashtable[] hcomplementConsensus = null;
+
+ /**
+ * results of secondary structure base pair consensus for visible portion of
+ * view
+ */
+ protected Hashtable[] hStrucConsensus = null;
+
+ protected Conservation hconservation = null;
+
+ @Override
+ public void setConservation(Conservation cons)
+ {
+ hconservation = cons;
+ }
+
+ /**
+ * percentage gaps allowed in a column before all amino acid properties should
+ * be considered unconserved
+ */
+ int ConsPercGaps = 25; // JBPNote : This should be a scalable property!
+
+ @Override
+ public int getConsPercGaps()
+ {
+ return ConsPercGaps;
+ }
+
+ @Override
+ public void setSequenceConsensusHash(Hashtable[] hconsensus)
+ {
+ this.hconsensus = hconsensus;
+ }
+
+ @Override
+ public void setComplementConsensusHash(Hashtable[] hconsensus)
+ {
+ this.hcomplementConsensus = hconsensus;
+ }
+
+ @Override
+ public Hashtable[] getSequenceConsensusHash()
+ {
+ return hconsensus;
+ }
+
+ @Override
+ public Hashtable[] getComplementConsensusHash()
+ {
+ return hcomplementConsensus;
+ }
+
+ @Override
+ public Hashtable[] getRnaStructureConsensusHash()
+ {
+ return hStrucConsensus;
+ }
+
+ @Override
+ public void setRnaStructureConsensusHash(Hashtable[] hStrucConsensus)
+ {
+ this.hStrucConsensus = hStrucConsensus;
+
+ }
+
+ @Override
+ public AlignmentAnnotation getAlignmentQualityAnnot()
+ {
+ return quality;
+ }
+
+ @Override
+ public AlignmentAnnotation getAlignmentConservationAnnotation()
+ {
+ return conservation;
+ }
+
+ @Override
+ public AlignmentAnnotation getAlignmentConsensusAnnotation()
+ {
+ return consensus;
+ }
+
+ @Override
+ public AlignmentAnnotation getComplementConsensusAnnotation()
+ {
+ return complementConsensus;
+ }
+
+ @Override
+ public AlignmentAnnotation getAlignmentStrucConsensusAnnotation()
+ {
+ return strucConsensus;
+ }
+
+ protected AlignCalcManagerI calculator = new AlignCalcManager();
+
+ /**
+ * trigger update of conservation annotation
+ */
+ public void updateConservation(final AlignmentViewPanel ap)
+ {
+ // see note in mantis : issue number 8585
+ if (alignment.isNucleotide() || conservation == null
+ || !autoCalculateConsensus)
+ {
+ return;
+ }
+ if (calculator
+ .getRegisteredWorkersOfClass(jalview.workers.ConservationThread.class) == null)
+ {
+ calculator.registerWorker(new jalview.workers.ConservationThread(
+ this, ap));
+ }
+ }
+
+ /**
+ * trigger update of consensus annotation
+ */
+ public void updateConsensus(final AlignmentViewPanel ap)
+ {
+ // see note in mantis : issue number 8585
+ if (consensus == null || !autoCalculateConsensus)
+ {
+ return;
+ }
+ if (calculator.getRegisteredWorkersOfClass(ConsensusThread.class) == null)
+ {
+ calculator.registerWorker(new ConsensusThread(this, ap));
+ }
+
+ /*
+ * A separate thread to compute cDNA consensus for a protein alignment
+ */
+ final AlignmentI al = this.getAlignment();
+ if (!al.isNucleotide() && al.getCodonFrames() != null
+ && !al.getCodonFrames().isEmpty())
+ {
+ if (calculator
+ .getRegisteredWorkersOfClass(ComplementConsensusThread.class) == null)
+ {
+ calculator.registerWorker(new ComplementConsensusThread(this, ap));
+ }
+ }
+ }
+
+ // --------START Structure Conservation
+ public void updateStrucConsensus(final AlignmentViewPanel ap)
+ {
+ if (autoCalculateStrucConsensus && strucConsensus == null
+ && alignment.isNucleotide() && alignment.hasRNAStructure())
+ {
+ // secondary structure has been added - so init the consensus line
+ initRNAStructure();
+ }
+
+ // see note in mantis : issue number 8585
+ if (strucConsensus == null || !autoCalculateStrucConsensus)
+ {
+ return;
+ }
+ if (calculator.getRegisteredWorkersOfClass(StrucConsensusThread.class) == null)
+ {
+ calculator.registerWorker(new StrucConsensusThread(this, ap));
+ }
+ }
+
+ public boolean isCalcInProgress()
+ {
+ return calculator.isWorking();
+ }
+
+ @Override
+ public boolean isCalculationInProgress(
+ AlignmentAnnotation alignmentAnnotation)
+ {
+ if (!alignmentAnnotation.autoCalculated)
+ {
+ return false;
+ }
+ if (calculator.workingInvolvedWith(alignmentAnnotation))
+ {
+ // System.err.println("grey out ("+alignmentAnnotation.label+")");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isClosed()
+ {
+ // TODO: check that this isClosed is only true after panel is closed, not
+ // before it is fully constructed.
+ return alignment == null;
+ }
+
+ @Override
+ public AlignCalcManagerI getCalcManager()
+ {
+ return calculator;
+ }
+
+ /**
+ * should conservation rows be shown for groups
+ */
+ protected boolean showGroupConservation = false;
+
+ /**
+ * should consensus rows be shown for groups
+ */
+ protected boolean showGroupConsensus = false;
+
+ /**
+ * should consensus profile be rendered by default
+ */
+ protected boolean showSequenceLogo = false;
+
+ /**
+ * should consensus profile be rendered normalised to row height
+ */
+ protected boolean normaliseSequenceLogo = false;
+
+ /**
+ * should consensus histograms be rendered by default
+ */
+ protected boolean showConsensusHistogram = true;
+
+ /**
+ * @return the showConsensusProfile
+ */
+ @Override
+ public boolean isShowSequenceLogo()
+ {
+ return showSequenceLogo;
+ }
+
+ /**
+ * @param showSequenceLogo
+ * the new value
+ */
+ public void setShowSequenceLogo(boolean showSequenceLogo)
+ {
+ if (showSequenceLogo != this.showSequenceLogo)
+ {
+ // TODO: decouple settings setting from calculation when refactoring
+ // annotation update method from alignframe to viewport
+ this.showSequenceLogo = showSequenceLogo;
+ calculator.updateAnnotationFor(ConsensusThread.class);
+ calculator.updateAnnotationFor(ComplementConsensusThread.class);
+ calculator.updateAnnotationFor(StrucConsensusThread.class);
+ }
+ this.showSequenceLogo = showSequenceLogo;
+ }
+
+ /**
+ * @param showConsensusHistogram
+ * the showConsensusHistogram to set
+ */
+ public void setShowConsensusHistogram(boolean showConsensusHistogram)
+ {
+ this.showConsensusHistogram = showConsensusHistogram;
+ }
+
+ /**
+ * @return the showGroupConservation
+ */
+ public boolean isShowGroupConservation()
+ {
+ return showGroupConservation;
+ }
+
+ /**
+ * @param showGroupConservation
+ * the showGroupConservation to set
+ */
+ public void setShowGroupConservation(boolean showGroupConservation)
+ {
+ this.showGroupConservation = showGroupConservation;
+ }
+
+ /**
+ * @return the showGroupConsensus
+ */
+ public boolean isShowGroupConsensus()
+ {
+ return showGroupConsensus;
+ }
+
+ /**
+ * @param showGroupConsensus
+ * the showGroupConsensus to set
+ */
+ public void setShowGroupConsensus(boolean showGroupConsensus)
+ {
+ this.showGroupConsensus = showGroupConsensus;
+ }
+
+ /**
+ *
+ * @return flag to indicate if the consensus histogram should be rendered by
+ * default
+ */
+ @Override
+ public boolean isShowConsensusHistogram()
+ {
+ return this.showConsensusHistogram;
+ }
+
+ /**
+ * when set, updateAlignment will always ensure sequences are of equal length
+ */
+ private boolean padGaps = false;
+
+ /**
+ * when set, alignment should be reordered according to a newly opened tree
+ */
+ public boolean sortByTree = false;
+
+ /**
+ *
+ *
+ * @return null or the currently selected sequence region
+ */
+ @Override
+ public SequenceGroup getSelectionGroup()
+ {
+ return selectionGroup;
+ }
+
+ /**
+ * Set the selection group for this window.
+ *
+ * @param sg
+ * - group holding references to sequences in this alignment view
+ *
+ */
+ @Override
+ public void setSelectionGroup(SequenceGroup sg)
+ {
+ selectionGroup = sg;
+ }
+
+ public void setHiddenColumns(ColumnSelection colsel)
+ {
+ this.colSel = colsel;
+ }
+
+ @Override
+ public ColumnSelection getColumnSelection()
+ {
+ return colSel;
+ }
+
+ @Override
+ public void setColumnSelection(ColumnSelection colSel)
+ {
+ this.colSel = colSel;
+ if (colSel != null)
+ {
+ updateHiddenColumns();
+ }
+ }
+
+ /**
+ *
+ * @return
+ */
+ @Override
+ public Map getHiddenRepSequences()
+ {
+ return hiddenRepSequences;
+ }
+
+ @Override
+ public void setHiddenRepSequences(
+ Map hiddenRepSequences)
+ {
+ this.hiddenRepSequences = hiddenRepSequences;
+ }
+
+ @Override
+ public boolean hasHiddenColumns()
+ {
+ return colSel != null && colSel.hasHiddenColumns();
+ }
+
+ public void updateHiddenColumns()
+ {
+ // this method doesn't really do anything now. But - it could, since a
+ // column Selection could be in the process of modification
+ // hasHiddenColumns = colSel.hasHiddenColumns();
+ }
+
+ @Override
+ public boolean hasHiddenRows()
+ {
+ return alignment.getHiddenSequences().getSize() > 0;
+ }
+
+ protected SequenceGroup selectionGroup;
+
+ public void setSequenceSetId(String newid)
+ {
+ if (sequenceSetID != null)
+ {
+ System.err
+ .println("Warning - overwriting a sequenceSetId for a viewport!");
+ }
+ sequenceSetID = new String(newid);
+ }
+
+ @Override
+ public String getSequenceSetId()
+ {
+ if (sequenceSetID == null)
+ {
+ sequenceSetID = alignment.hashCode() + "";
+ }
+
+ return sequenceSetID;
+ }
+
+ /**
+ * unique viewId for synchronizing state (e.g. with stored Jalview Project)
+ *
+ */
+ protected String viewId = null;
+
+ @Override
+ public String getViewId()
+ {
+ if (viewId == null)
+ {
+ viewId = this.getSequenceSetId() + "." + this.hashCode() + "";
+ }
+ return viewId;
+ }
+
+ public void setIgnoreGapsConsensus(boolean b, AlignmentViewPanel ap)
+ {
+ ignoreGapsInConsensusCalculation = b;
+ if (ap != null)
+ {
+ updateConsensus(ap);
+ if (globalColourScheme != null)
+ {
+ globalColourScheme.setThreshold(globalColourScheme.getThreshold(),
+ ignoreGapsInConsensusCalculation);
+ }
+ }
+
+ }
+
+ private long sgrouphash = -1, colselhash = -1;
+
+ /**
+ * checks current SelectionGroup against record of last hash value, and
+ * updates record.
+ *
+ * @param b
+ * update the record of last hash value
+ *
+ * @return true if SelectionGroup changed since last call (when b is true)
+ */
+ public boolean isSelectionGroupChanged(boolean b)
+ {
+ int hc = (selectionGroup == null || selectionGroup.getSize() == 0) ? -1
+ : selectionGroup.hashCode();
+ if (hc != -1 && hc != sgrouphash)
+ {
+ if (b)
+ {
+ sgrouphash = hc;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * checks current colsel against record of last hash value, and optionally
+ * updates record.
+ *
+ * @param b
+ * update the record of last hash value
+ * @return true if colsel changed since last call (when b is true)
+ */
+ public boolean isColSelChanged(boolean b)
+ {
+ int hc = (colSel == null || colSel.size() == 0) ? -1 : colSel
+ .hashCode();
+ if (hc != -1 && hc != colselhash)
+ {
+ if (b)
+ {
+ colselhash = hc;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isIgnoreGapsConsensus()
+ {
+ return ignoreGapsInConsensusCalculation;
+ }
+
+ // / property change stuff
+
+ // JBPNote Prolly only need this in the applet version.
+ private final java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
+ this);
+
+ protected boolean showConservation = true;
+
+ protected boolean showQuality = true;
+
+ protected boolean showConsensus = true;
+
+ private Map sequenceColours = new HashMap();
+
+ protected SequenceAnnotationOrder sortAnnotationsBy = null;
+
+ protected boolean showAutocalculatedAbove;
+
+ /**
+ * when set, view will scroll to show the highlighted position
+ */
+ private boolean followHighlight = true;
+
+ // TODO private with getters and setters?
+ public int startRes;
+
+ public int endRes;
+
+ public int startSeq;
+
+ public int endSeq;
+
+ /**
+ * Property change listener for changes in alignment
+ *
+ * @param listener
+ * DOCUMENT ME!
+ */
+ public void addPropertyChangeListener(
+ java.beans.PropertyChangeListener listener)
+ {
+ changeSupport.addPropertyChangeListener(listener);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param listener
+ * DOCUMENT ME!
+ */
+ public void removePropertyChangeListener(
+ java.beans.PropertyChangeListener listener)
+ {
+ changeSupport.removePropertyChangeListener(listener);
+ }
+
+ /**
+ * Property change listener for changes in alignment
+ *
+ * @param prop
+ * DOCUMENT ME!
+ * @param oldvalue
+ * DOCUMENT ME!
+ * @param newvalue
+ * DOCUMENT ME!
+ */
+ public void firePropertyChange(String prop, Object oldvalue,
+ Object newvalue)
+ {
+ changeSupport.firePropertyChange(prop, oldvalue, newvalue);
+ }
+
+ // common hide/show column stuff
+
+ public void hideSelectedColumns()
+ {
+ if (colSel.size() < 1)
+ {
+ return;
+ }
+
+ colSel.hideSelectedColumns();
+ setSelectionGroup(null);
+
+ }
+
+ public void hideColumns(int start, int end)
+ {
+ if (start == end)
+ {
+ colSel.hideColumns(start);
+ }
+ else
+ {
+ colSel.hideColumns(start, end);
+ }
+ }
+
+ public void showColumn(int col)
+ {
+ colSel.revealHiddenColumns(col);
+
+ }
+
+ public void showAllHiddenColumns()
+ {
+ colSel.revealAllHiddenColumns();
+ }
+
+ // common hide/show seq stuff
+ public void showAllHiddenSeqs()
+ {
+ if (alignment.getHiddenSequences().getSize() > 0)
+ {
+ if (selectionGroup == null)
+ {
+ selectionGroup = new SequenceGroup();
+ selectionGroup.setEndRes(alignment.getWidth() - 1);
+ }
+ List tmp = alignment.getHiddenSequences().showAll(
+ hiddenRepSequences);
+ for (SequenceI seq : tmp)
+ {
+ selectionGroup.addSequence(seq, false);
+ setSequenceAnnotationsVisible(seq, true);
+ }
+
+ hiddenRepSequences = null;
+
+ firePropertyChange("alignment", null, alignment.getSequences());
+ // used to set hasHiddenRows/hiddenRepSequences here, after the property
+ // changed event
+ sendSelection();
+ }
+ }
+
+ public void showSequence(int index)
+ {
+ List tmp = alignment.getHiddenSequences().showSequence(
+ index, hiddenRepSequences);
+ if (tmp.size() > 0)
+ {
+ if (selectionGroup == null)
+ {
+ selectionGroup = new SequenceGroup();
+ selectionGroup.setEndRes(alignment.getWidth() - 1);
+ }
+
+ for (SequenceI seq : tmp)
+ {
+ selectionGroup.addSequence(seq, false);
+ setSequenceAnnotationsVisible(seq, true);
+ }
+ firePropertyChange("alignment", null, alignment.getSequences());
+ sendSelection();
+ }
+ }
+
+ public void hideAllSelectedSeqs()
+ {
+ if (selectionGroup == null || selectionGroup.getSize() < 1)
+ {
+ return;
+ }
+
+ SequenceI[] seqs = selectionGroup.getSequencesInOrder(alignment);
+
+ hideSequence(seqs);
+
+ setSelectionGroup(null);
+ }
+
+ public void hideSequence(SequenceI[] seq)
+ {
+ if (seq != null)
+ {
+ for (int i = 0; i < seq.length; i++)
+ {
+ alignment.getHiddenSequences().hideSequence(seq[i]);
+ setSequenceAnnotationsVisible(seq[i], false);
+ }
+ firePropertyChange("alignment", null, alignment.getSequences());
+ }
+ }
+
+ /**
+ * Set visibility for any annotations for the given sequence.
+ *
+ * @param sequenceI
+ */
+ protected void setSequenceAnnotationsVisible(SequenceI sequenceI,
+ boolean visible)
+ {
+ for (AlignmentAnnotation ann : alignment.getAlignmentAnnotation())
+ {
+ if (ann.sequenceRef == sequenceI)
+ {
+ ann.visible = visible;
+ }
+ }
+ }
+
+ public void hideRepSequences(SequenceI repSequence, SequenceGroup sg)
+ {
+ int sSize = sg.getSize();
+ if (sSize < 2)
+ {
+ return;
+ }
+
+ if (hiddenRepSequences == null)
+ {
+ hiddenRepSequences = new Hashtable();
+ }
+
+ hiddenRepSequences.put(repSequence, sg);
+
+ // Hide all sequences except the repSequence
+ SequenceI[] seqs = new SequenceI[sSize - 1];
+ int index = 0;
+ for (int i = 0; i < sSize; i++)
+ {
+ if (sg.getSequenceAt(i) != repSequence)
+ {
+ if (index == sSize - 1)
+ {
+ return;
+ }
+
+ seqs[index++] = sg.getSequenceAt(i);
+ }
+ }
+ sg.setSeqrep(repSequence); // note: not done in 2.7applet
+ sg.setHidereps(true); // note: not done in 2.7applet
+ hideSequence(seqs);
+
+ }
+
+ public boolean isHiddenRepSequence(SequenceI seq)
+ {
+ return alignment.getSeqrep() == seq
+ || (hiddenRepSequences != null && hiddenRepSequences
+ .containsKey(seq));
+ }
+
+ public SequenceGroup getRepresentedSequences(SequenceI seq)
+ {
+ return (SequenceGroup) (hiddenRepSequences == null ? null
+ : hiddenRepSequences.get(seq));
+ }
+
+ @Override
+ public int adjustForHiddenSeqs(int alignmentIndex)
+ {
+ return alignment.getHiddenSequences().adjustForHiddenSeqs(
+ alignmentIndex);
+ }
+
+ @Override
+ public void invertColumnSelection()
+ {
+ colSel.invertColumnSelection(0, alignment.getWidth());
+ }
+
+ @Override
+ public SequenceI[] getSelectionAsNewSequence()
+ {
+ SequenceI[] sequences;
+ // JBPNote: Need to test jalviewLite.getSelectedSequencesAsAlignmentFrom -
+ // this was the only caller in the applet for this method
+ // JBPNote: in applet, this method returned references to the alignment
+ // sequences, and it did not honour the presence/absence of annotation
+ // attached to the alignment (probably!)
+ if (selectionGroup == null || selectionGroup.getSize() == 0)
+ {
+ sequences = alignment.getSequencesArray();
+ AlignmentAnnotation[] annots = alignment.getAlignmentAnnotation();
+ for (int i = 0; i < sequences.length; i++)
+ {
+ // construct new sequence with subset of visible annotation
+ sequences[i] = new Sequence(sequences[i], annots);
+ }
+ }
+ else
+ {
+ sequences = selectionGroup.getSelectionAsNewSequences(alignment);
+ }
+
+ return sequences;
+ }
+
+ @Override
+ public SequenceI[] getSequenceSelection()
+ {
+ SequenceI[] sequences = null;
+ if (selectionGroup != null)
+ {
+ sequences = selectionGroup.getSequencesInOrder(alignment);
+ }
+ if (sequences == null)
+ {
+ sequences = alignment.getSequencesArray();
+ }
+ return sequences;
+ }
+
+ @Override
+ public CigarArray getViewAsCigars(boolean selectedRegionOnly)
+ {
+ return new CigarArray(alignment, colSel,
+ (selectedRegionOnly ? selectionGroup : null));
+ }
+
+ @Override
+ public jalview.datamodel.AlignmentView getAlignmentView(
+ boolean selectedOnly)
+ {
+ return getAlignmentView(selectedOnly, false);
+ }
+
+ @Override
+ public jalview.datamodel.AlignmentView getAlignmentView(
+ boolean selectedOnly, boolean markGroups)
+ {
+ return new AlignmentView(alignment, colSel, selectionGroup,
+ colSel != null && colSel.hasHiddenColumns(), selectedOnly,
+ markGroups);
+ }
+
+ @Override
+ public String[] getViewAsString(boolean selectedRegionOnly)
+ {
+ String[] selection = null;
+ SequenceI[] seqs = null;
+ int i, iSize;
+ int start = 0, end = 0;
+ if (selectedRegionOnly && selectionGroup != null)
+ {
+ iSize = selectionGroup.getSize();
+ seqs = selectionGroup.getSequencesInOrder(alignment);
+ start = selectionGroup.getStartRes();
+ end = selectionGroup.getEndRes() + 1;
+ }
+ else
+ {
+ iSize = alignment.getHeight();
+ seqs = alignment.getSequencesArray();
+ end = alignment.getWidth();
+ }
+
+ selection = new String[iSize];
+ if (colSel != null && colSel.hasHiddenColumns())
+ {
+ selection = colSel.getVisibleSequenceStrings(start, end, seqs);
+ }
+ else
+ {
+ for (i = 0; i < iSize; i++)
+ {
+ selection[i] = seqs[i].getSequenceAsString(start, end);
+ }
+
+ }
+ return selection;
+ }
+
+ @Override
+ public List getVisibleRegionBoundaries(int min, int max)
{
- this.hiddenRepSequences = hiddenRepSequences;
+ ArrayList regions = new ArrayList();
+ int start = min;
+ int end = max;
+
+ do
+ {
+ if (colSel != null && colSel.hasHiddenColumns())
+ {
+ if (start == 0)
+ {
+ start = colSel.adjustForHiddenColumns(start);
+ }
+
+ end = colSel.getHiddenBoundaryRight(start);
+ if (start == end)
+ {
+ end = max;
+ }
+ if (end > max)
+ {
+ end = max;
+ }
+ }
+
+ regions.add(new int[] { start, end });
+
+ if (colSel != null && colSel.hasHiddenColumns())
+ {
+ start = colSel.adjustForHiddenColumns(end);
+ start = colSel.getHiddenBoundaryLeft(start) + 1;
+ }
+ } while (end < max);
+
+ int[][] startEnd = new int[regions.size()][2];
+
+ return regions;
+ }
+
+ @Override
+ public List getVisibleAlignmentAnnotation(
+ boolean selectedOnly)
+ {
+ ArrayList ala = new ArrayList();
+ AlignmentAnnotation[] aa;
+ if ((aa = alignment.getAlignmentAnnotation()) != null)
+ {
+ for (AlignmentAnnotation annot : aa)
+ {
+ AlignmentAnnotation clone = new AlignmentAnnotation(annot);
+ if (selectedOnly && selectionGroup != null)
+ {
+ colSel.makeVisibleAnnotation(selectionGroup.getStartRes(),
+ selectionGroup.getEndRes(), clone);
+ }
+ else
+ {
+ colSel.makeVisibleAnnotation(clone);
+ }
+ ala.add(clone);
+ }
+ }
+ return ala;
+ }
+
+ @Override
+ public boolean isPadGaps()
+ {
+ return padGaps;
+ }
+
+ @Override
+ public void setPadGaps(boolean padGaps)
+ {
+ this.padGaps = padGaps;
+ }
+
+ /**
+ * apply any post-edit constraints and trigger any calculations needed after
+ * an edit has been performed on the alignment
+ *
+ * @param ap
+ */
+ @Override
+ public void alignmentChanged(AlignmentViewPanel ap)
+ {
+ if (isPadGaps())
+ {
+ alignment.padGaps();
+ }
+ if (autoCalculateConsensus)
+ {
+ updateConsensus(ap);
+ }
+ if (hconsensus != null && autoCalculateConsensus)
+ {
+ updateConservation(ap);
+ }
+ if (autoCalculateStrucConsensus)
+ {
+ updateStrucConsensus(ap);
+ }
+
+ // Reset endRes of groups if beyond alignment width
+ int alWidth = alignment.getWidth();
+ List groups = alignment.getGroups();
+ if (groups != null)
+ {
+ for (SequenceGroup sg : groups)
+ {
+ if (sg.getEndRes() > alWidth)
+ {
+ sg.setEndRes(alWidth - 1);
+ }
+ }
+ }
+
+ if (selectionGroup != null && selectionGroup.getEndRes() > alWidth)
+ {
+ selectionGroup.setEndRes(alWidth - 1);
+ }
+
+ resetAllColourSchemes();
+ calculator.restartWorkers();
+ // alignment.adjustSequenceAnnotations();
+ }
+
+ /**
+ * reset scope and do calculations for all applied colourschemes on alignment
+ */
+ void resetAllColourSchemes()
+ {
+ ColourSchemeI cs = globalColourScheme;
+ if (cs != null)
+ {
+ cs.alignmentChanged(alignment, hiddenRepSequences);
+
+ cs.setConsensus(hconsensus);
+ if (cs.conservationApplied())
+ {
+ cs.setConservation(Conservation.calculateConservation("All",
+ ResidueProperties.propHash, 3, alignment.getSequences(), 0,
+ alignment.getWidth(), false, getConsPercGaps(), false));
+ }
+ }
+
+ for (SequenceGroup sg : alignment.getGroups())
+ {
+ if (sg.cs != null)
+ {
+ sg.cs.alignmentChanged(sg, hiddenRepSequences);
+ }
+ sg.recalcConservation();
+ }
+ }
+
+ protected void initAutoAnnotation()
+ {
+ // TODO: add menu option action that nulls or creates consensus object
+ // depending on if the user wants to see the annotation or not in a
+ // specific alignment
+
+ if (hconsensus == null && !isDataset)
+ {
+ if (!alignment.isNucleotide())
+ {
+ initConservation();
+ initQuality();
+ }
+ else
+ {
+ initRNAStructure();
+ }
+ consensus = new AlignmentAnnotation("Consensus", "PID",
+ new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
+ initConsensus(consensus);
+
+ initComplementConsensus();
+ }
+ }
+
+ /**
+ * If this is a protein alignment and there are mappings to cDNA, add the cDNA
+ * consensus annotation.
+ */
+ public void initComplementConsensus()
+ {
+ if (!alignment.isNucleotide())
+ {
+ final Set codonMappings = alignment
+ .getCodonFrames();
+ if (codonMappings != null && !codonMappings.isEmpty())
+ {
+ complementConsensus = new AlignmentAnnotation("cDNA Consensus",
+ "PID for cDNA", new Annotation[1], 0f, 100f,
+ AlignmentAnnotation.BAR_GRAPH);
+ initConsensus(complementConsensus);
+ }
+ }
+ }
+
+ private void initConsensus(AlignmentAnnotation aa)
+ {
+ aa.hasText = true;
+ aa.autoCalculated = true;
+
+ if (showConsensus)
+ {
+ alignment.addAnnotation(aa);
+ }
+ }
+
+ private void initConservation()
+ {
+ if (showConservation)
+ {
+ if (conservation == null)
+ {
+ 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;
+ alignment.addAnnotation(conservation);
+ }
+ }
+ }
+
+ private void initQuality()
+ {
+ if (showQuality)
+ {
+ if (quality == null)
+ {
+ 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);
+ }
+ }
+ }
+
+ private void initRNAStructure()
+ {
+ if (alignment.hasRNAStructure() && strucConsensus == null)
+ {
+ strucConsensus = new AlignmentAnnotation("StrucConsensus", "PID",
+ new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
+ strucConsensus.hasText = true;
+ strucConsensus.autoCalculated = true;
+
+ if (showConsensus)
+ {
+ alignment.addAnnotation(strucConsensus);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see jalview.api.AlignViewportI#calcPanelHeight()
+ */
+ @Override
+ public int calcPanelHeight()
+ {
+ // setHeight of panels
+ AlignmentAnnotation[] anns = getAlignment().getAlignmentAnnotation();
+ int height = 0;
+ int charHeight = getCharHeight();
+ if (anns != null)
+ {
+ BitSet graphgrp = new BitSet();
+ for (AlignmentAnnotation aa : anns)
+ {
+ if (aa == null)
+ {
+ System.err.println("Null annotation row: ignoring.");
+ continue;
+ }
+ if (!aa.visible)
+ {
+ continue;
+ }
+ if (aa.graphGroup > -1)
+ {
+ if (graphgrp.get(aa.graphGroup))
+ {
+ continue;
+ }
+ else
+ {
+ graphgrp.set(aa.graphGroup);
+ }
+ }
+ aa.height = 0;
+
+ if (aa.hasText)
+ {
+ aa.height += charHeight;
+ }
+
+ if (aa.hasIcons)
+ {
+ aa.height += 16;
+ }
+
+ if (aa.graph > 0)
+ {
+ aa.height += aa.graphHeight;
+ }
+
+ if (aa.height == 0)
+ {
+ aa.height = 20;
+ }
+
+ height += aa.height;
+ }
+ }
+ if (height == 0)
+ {
+ // set minimum
+ height = 20;
+ }
+ return height;
+ }
+
+ @Override
+ public void updateGroupAnnotationSettings(boolean applyGlobalSettings,
+ boolean preserveNewGroupSettings)
+ {
+ boolean updateCalcs = false;
+ boolean conv = isShowGroupConservation();
+ boolean cons = isShowGroupConsensus();
+ boolean showprf = isShowSequenceLogo();
+ boolean showConsHist = isShowConsensusHistogram();
+ boolean normLogo = isNormaliseSequenceLogo();
+
+ /**
+ * TODO reorder the annotation rows according to group/sequence ordering on
+ * alignment
+ */
+ boolean sortg = true;
+
+ // remove old automatic annotation
+ // add any new annotation
+
+ // intersect alignment annotation with alignment groups
+
+ AlignmentAnnotation[] aan = alignment.getAlignmentAnnotation();
+ List oldrfs = new ArrayList();
+ if (aan != null)
+ {
+ for (int an = 0; an < aan.length; an++)
+ {
+ if (aan[an].autoCalculated && aan[an].groupRef != null)
+ {
+ oldrfs.add(aan[an].groupRef);
+ alignment.deleteAnnotation(aan[an], false);
+ }
+ }
+ }
+ if (alignment.getGroups() != null)
+ {
+ for (SequenceGroup sg : alignment.getGroups())
+ {
+ updateCalcs = false;
+ if (applyGlobalSettings
+ || (!preserveNewGroupSettings && !oldrfs.contains(sg)))
+ {
+ // set defaults for this group's conservation/consensus
+ sg.setshowSequenceLogo(showprf);
+ sg.setShowConsensusHistogram(showConsHist);
+ sg.setNormaliseSequenceLogo(normLogo);
+ }
+ if (conv)
+ {
+ updateCalcs = true;
+ alignment.addAnnotation(sg.getConservationRow(), 0);
+ }
+ if (cons)
+ {
+ updateCalcs = true;
+ alignment.addAnnotation(sg.getConsensus(), 0);
+ }
+ // refresh the annotation rows
+ if (updateCalcs)
+ {
+ sg.recalcConservation();
+ }
+ }
+ }
+ oldrfs.clear();
}
- protected boolean hasHiddenColumns = false;
- public void updateHiddenColumns()
+ @Override
+ public boolean isDisplayReferenceSeq()
{
- hasHiddenColumns = colSel.getHiddenColumns() != null;
- }
-
- protected boolean hasHiddenRows = false;
-
- public boolean hasHiddenRows() {
- return hasHiddenRows;
+ return alignment.hasSeqrep() && viewStyle.isDisplayReferenceSeq();
}
- protected SequenceGroup selectionGroup;
-
- public void setSequenceSetId(String newid)
+ @Override
+ public void setDisplayReferenceSeq(boolean displayReferenceSeq)
{
- if (sequenceSetID!=null)
- {
- System.err.println("Warning - overwriting a sequenceSetId for a viewport!");
- }
- sequenceSetID=new String(newid);
+ viewStyle.setDisplayReferenceSeq(displayReferenceSeq);
}
- public String getSequenceSetId()
+
+ @Override
+ public boolean isColourByReferenceSeq()
{
- if (sequenceSetID == null)
- {
- sequenceSetID = alignment.hashCode() + "";
- }
+ return alignment.hasSeqrep() && viewStyle.isColourByReferenceSeq();
+ }
- return sequenceSetID;
+ @Override
+ public Color getSequenceColour(SequenceI seq)
+ {
+ Color sqc = sequenceColours.get(seq);
+ return (sqc == null ? Color.white : sqc);
}
- /**
- * unique viewId for synchronizing state (e.g. with stored Jalview Project)
- *
- */
- protected String viewId = null;
- public String getViewId()
+ @Override
+ public void setSequenceColour(SequenceI seq, Color col)
{
- if (viewId == null)
+ if (col == null)
{
- viewId = this.getSequenceSetId() + "." + this.hashCode() + "";
+ sequenceColours.remove(seq);
}
- return viewId;
- }
- public void setIgnoreGapsConsensus(boolean b, AlignmentViewPanel ap)
- {
- ignoreGapsInConsensusCalculation = b;
- if (ap!=null) {updateConsensus(ap);
- if (globalColourScheme != null)
+ else
{
- globalColourScheme.setThreshold(globalColourScheme.getThreshold(),
- ignoreGapsInConsensusCalculation);
- }}
-
+ sequenceColours.put(seq, col);
+ }
}
- private long sgrouphash = -1, colselhash = -1;
- /**
- * checks current SelectionGroup against record of last hash value, and
- * updates record.
- *
- * @param b
- * update the record of last hash value
- *
- * @return true if SelectionGroup changed since last call (when b is true)
- */
- public boolean isSelectionGroupChanged(boolean b)
+ @Override
+ public void updateSequenceIdColours()
{
- int hc = (selectionGroup == null || selectionGroup.getSize() == 0) ? -1
- : selectionGroup.hashCode();
- if (hc != -1 && hc != sgrouphash)
+ for (SequenceGroup sg : alignment.getGroups())
{
- if (b)
+ if (sg.idColour != null)
{
- sgrouphash = hc;
+ for (SequenceI s : sg.getSequences(getHiddenRepSequences()))
+ {
+ sequenceColours.put(s, sg.idColour);
+ }
}
- return true;
}
- return false;
+ }
+
+ @Override
+ public void clearSequenceColours()
+ {
+ sequenceColours.clear();
+ };
+
+ @Override
+ public AlignViewportI getCodingComplement()
+ {
+ return this.codingComplement;
}
/**
- * checks current colsel against record of last hash value, and optionally
- * updates record.
- *
- * @param b
- * update the record of last hash value
- * @return true if colsel changed since last call (when b is true)
+ * Set this as the (cDna/protein) complement of the given viewport. Also
+ * ensures the reverse relationship is set on the given viewport.
*/
- public boolean isColSelChanged(boolean b)
+ @Override
+ public void setCodingComplement(AlignViewportI av)
{
- int hc = (colSel == null || colSel.size() == 0) ? -1 : colSel
- .hashCode();
- if (hc != -1 && hc != colselhash)
+ if (this == av)
{
- if (b)
+ System.err.println("Ignoring recursive setCodingComplement request");
+ }
+ else
+ {
+ this.codingComplement = av;
+ // avoid infinite recursion!
+ if (av.getCodingComplement() != this)
{
- colselhash = hc;
+ av.setCodingComplement(this);
}
- return true;
}
- return false;
}
- public boolean getIgnoreGapsConsensus()
+ @Override
+ public boolean isNucleotide()
{
- return ignoreGapsInConsensusCalculation;
+ return getAlignment() == null ? false : getAlignment().isNucleotide();
}
- /// property change stuff
-
- // JBPNote Prolly only need this in the applet version.
- private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
- this);
-
+ @Override
+ public FeaturesDisplayedI getFeaturesDisplayed()
+ {
+ return featuresDisplayed;
+ }
- /**
- * Property change listener for changes in alignment
- *
- * @param listener
- * DOCUMENT ME!
- */
- public void addPropertyChangeListener(
- java.beans.PropertyChangeListener listener)
+ @Override
+ public void setFeaturesDisplayed(FeaturesDisplayedI featuresDisplayedI)
{
- changeSupport.addPropertyChangeListener(listener);
+ featuresDisplayed = featuresDisplayedI;
}
- /**
- * DOCUMENT ME!
- *
- * @param listener
- * DOCUMENT ME!
- */
- public void removePropertyChangeListener(
- java.beans.PropertyChangeListener listener)
+ @Override
+ public boolean areFeaturesDisplayed()
{
- changeSupport.removePropertyChangeListener(listener);
+ return featuresDisplayed != null
+ && featuresDisplayed.getRegisterdFeaturesCount() > 0;
}
/**
- * Property change listener for changes in alignment
+ * set the flag
*
- * @param prop
- * DOCUMENT ME!
- * @param oldvalue
- * DOCUMENT ME!
- * @param newvalue
- * DOCUMENT ME!
+ * @param b
+ * features are displayed if true
*/
- public void firePropertyChange(String prop, Object oldvalue,
- Object newvalue)
+ @Override
+ public void setShowSequenceFeatures(boolean b)
{
- changeSupport.firePropertyChange(prop, oldvalue, newvalue);
+ viewStyle.setShowSequenceFeatures(b);
}
- // common hide/show column stuff
-
-
- public void hideSelectedColumns()
+ @Override
+ public boolean isShowSequenceFeatures()
{
- if (colSel.size() < 1)
- {
- return;
- }
-
- colSel.hideSelectedColumns();
- setSelectionGroup(null);
-
- hasHiddenColumns = true;
+ return viewStyle.isShowSequenceFeatures();
}
- public void hideColumns(int start, int end)
+ @Override
+ public void setShowSequenceFeaturesHeight(boolean selected)
{
- if (start == end)
- {
- colSel.hideColumns(start);
- }
- else
- {
- colSel.hideColumns(start, end);
- }
-
- hasHiddenColumns = true;
+ viewStyle.setShowSequenceFeaturesHeight(selected);
}
- public void showColumn(int col)
+ @Override
+ public boolean isShowSequenceFeaturesHeight()
{
- colSel.revealHiddenColumns(col);
- if (colSel.getHiddenColumns() == null)
- {
- hasHiddenColumns = false;
- }
+ return viewStyle.isShowSequenceFeaturesHeight();
}
- public void showAllHiddenColumns()
+ @Override
+ public void setShowAnnotation(boolean b)
{
- colSel.revealAllHiddenColumns();
- hasHiddenColumns = false;
+ viewStyle.setShowAnnotation(b);
}
-
- // common hide/show seq stuff
- public void showAllHiddenSeqs()
+ @Override
+ public boolean isShowAnnotation()
{
- if (alignment.getHiddenSequences().getSize() > 0)
- {
- if (selectionGroup == null)
- {
- selectionGroup = new SequenceGroup();
- selectionGroup.setEndRes(alignment.getWidth() - 1);
- }
- Vector tmp = alignment.getHiddenSequences().showAll(
- hiddenRepSequences);
- for (int t = 0; t < tmp.size(); t++)
- {
- selectionGroup.addSequence((SequenceI) tmp.elementAt(t), false);
- }
-
- hasHiddenRows = false;
- hiddenRepSequences = null;
-
- firePropertyChange("alignment", null, alignment.getSequences());
- // used to set hasHiddenRows/hiddenRepSequences here, after the property changed event
- sendSelection();
- }
+ return viewStyle.isShowAnnotation();
}
- public void showSequence(int index)
+ @Override
+ public boolean isRightAlignIds()
{
- Vector tmp = alignment.getHiddenSequences().showSequence(index,
- hiddenRepSequences);
- if (tmp.size() > 0)
- {
- if (selectionGroup == null)
- {
- selectionGroup = new SequenceGroup();
- selectionGroup.setEndRes(alignment.getWidth() - 1);
- }
-
- for (int t = 0; t < tmp.size(); t++)
- {
- selectionGroup.addSequence((SequenceI) tmp.elementAt(t), false);
- }
- // JBPNote: refactor: only update flag if we modified visiblity (used to do this regardless)
- if (alignment.getHiddenSequences().getSize() < 1)
- {
- hasHiddenRows = false;
- }
- firePropertyChange("alignment", null, alignment.getSequences());
- sendSelection();
- }
+ return viewStyle.isRightAlignIds();
}
-
-
- public void hideAllSelectedSeqs()
+ @Override
+ public void setRightAlignIds(boolean rightAlignIds)
{
- if (selectionGroup == null || selectionGroup.getSize() < 1)
- {
- return;
- }
-
- SequenceI[] seqs = selectionGroup.getSequencesInOrder(alignment);
+ viewStyle.setRightAlignIds(rightAlignIds);
+ }
- hideSequence(seqs);
+ @Override
+ public boolean getConservationSelected()
+ {
+ return viewStyle.getConservationSelected();
+ }
- setSelectionGroup(null);
+ @Override
+ public void setShowBoxes(boolean state)
+ {
+ viewStyle.setShowBoxes(state);
}
-
- public void hideSequence(SequenceI[] seq)
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getTextColour()
+ */
+ public Color getTextColour()
{
- if (seq != null)
- {
- for (int i = 0; i < seq.length; i++)
- {
- alignment.getHiddenSequences().hideSequence(seq[i]);
- }
- hasHiddenRows = true;
- firePropertyChange("alignment", null, alignment.getSequences());
- }
+ return viewStyle.getTextColour();
}
- public void hideRepSequences(SequenceI repSequence, SequenceGroup sg)
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getTextColour2()
+ */
+ public Color getTextColour2()
{
- int sSize = sg.getSize();
- if (sSize < 2)
- {
- return;
- }
+ return viewStyle.getTextColour2();
+ }
- if (hiddenRepSequences == null)
- {
- hiddenRepSequences = new Hashtable();
- }
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#getThresholdTextColour()
+ */
+ public int getThresholdTextColour()
+ {
+ return viewStyle.getThresholdTextColour();
+ }
- hiddenRepSequences.put(repSequence, sg);
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#isConservationColourSelected()
+ */
+ public boolean isConservationColourSelected()
+ {
+ return viewStyle.isConservationColourSelected();
+ }
- // Hide all sequences except the repSequence
- SequenceI[] seqs = new SequenceI[sSize - 1];
- int index = 0;
- for (int i = 0; i < sSize; i++)
- {
- if (sg.getSequenceAt(i) != repSequence)
- {
- if (index == sSize - 1)
- {
- return;
- }
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#isRenderGaps()
+ */
+ public boolean isRenderGaps()
+ {
+ return viewStyle.isRenderGaps();
+ }
- seqs[index++] = sg.getSequenceAt(i);
- }
- }
- sg.setSeqrep(repSequence); // note: not done in 2.7applet
- sg.setHidereps(true); // note: not done in 2.7applet
- hideSequence(seqs);
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#isShowColourText()
+ */
+ public boolean isShowColourText()
+ {
+ return viewStyle.isShowColourText();
+ }
+ /**
+ * @param conservationColourSelected
+ * @see jalview.api.ViewStyleI#setConservationColourSelected(boolean)
+ */
+ public void setConservationColourSelected(
+ boolean conservationColourSelected)
+ {
+ viewStyle.setConservationColourSelected(conservationColourSelected);
}
- public boolean isHiddenRepSequence(SequenceI seq)
+ /**
+ * @param showColourText
+ * @see jalview.api.ViewStyleI#setShowColourText(boolean)
+ */
+ public void setShowColourText(boolean showColourText)
{
- return hiddenRepSequences != null
- && hiddenRepSequences.containsKey(seq);
+ viewStyle.setShowColourText(showColourText);
}
- public SequenceGroup getRepresentedSequences(SequenceI seq)
+
+ /**
+ * @param textColour
+ * @see jalview.api.ViewStyleI#setTextColour(java.awt.Color)
+ */
+ public void setTextColour(Color textColour)
{
- return (SequenceGroup) (hiddenRepSequences == null ? null : hiddenRepSequences.get(seq));
+ viewStyle.setTextColour(textColour);
}
- public int adjustForHiddenSeqs(int alignmentIndex)
+ /**
+ * @param thresholdTextColour
+ * @see jalview.api.ViewStyleI#setThresholdTextColour(int)
+ */
+ public void setThresholdTextColour(int thresholdTextColour)
{
- return alignment.getHiddenSequences().adjustForHiddenSeqs(
- alignmentIndex);
+ viewStyle.setThresholdTextColour(thresholdTextColour);
}
- // Selection manipulation
/**
- * broadcast selection to any interested parties
+ * @param textColour2
+ * @see jalview.api.ViewStyleI#setTextColour2(java.awt.Color)
*/
- public abstract void sendSelection();
-
+ public void setTextColour2(Color textColour2)
+ {
+ viewStyle.setTextColour2(textColour2);
+ }
- public void invertColumnSelection()
+ @Override
+ public ViewStyleI getViewStyle()
{
- colSel.invertColumnSelection(0, alignment.getWidth());
+ return new ViewStyle(viewStyle);
+ }
+
+ @Override
+ public void setViewStyle(ViewStyleI settingsForView)
+ {
+ viewStyle = new ViewStyle(settingsForView);
}
+ @Override
+ public boolean sameStyle(ViewStyleI them)
+ {
+ return viewStyle.sameStyle(them);
+ }
/**
- * This method returns an array of new SequenceI objects derived from the
- * whole alignment or just the current selection with start and end points
- * adjusted
- *
- * @note if you need references to the actual SequenceI objects in the
- * alignment or currently selected then use getSequenceSelection()
- * @return selection as new sequenceI objects
+ * @return
+ * @see jalview.api.ViewStyleI#getIdWidth()
*/
- public SequenceI[] getSelectionAsNewSequence()
+ public int getIdWidth()
{
- SequenceI[] sequences;
- // JBPNote: Need to test jalviewLite.getSelectedSequencesAsAlignmentFrom - this was the only caller in the applet for this method
- // JBPNote: in applet, this method returned references to the alignment sequences, and it did not honour the presence/absence of annotation attached to the alignment (probably!)
- if (selectionGroup == null)
- {
- sequences = alignment.getSequencesArray();
- AlignmentAnnotation[] annots = alignment.getAlignmentAnnotation();
- for (int i = 0; i < sequences.length; i++)
- {
- sequences[i] = new Sequence(sequences[i], annots); // construct new
- // sequence with
- // subset of visible
- // annotation
- }
- }
- else
- {
- sequences = selectionGroup.getSelectionAsNewSequences(alignment);
- }
+ return viewStyle.getIdWidth();
+ }
- return sequences;
+ /**
+ * @param i
+ * @see jalview.api.ViewStyleI#setIdWidth(int)
+ */
+ public void setIdWidth(int i)
+ {
+ viewStyle.setIdWidth(i);
}
+ /**
+ * @return
+ * @see jalview.api.ViewStyleI#isCentreColumnLabels()
+ */
+ public boolean isCentreColumnLabels()
+ {
+ return viewStyle.isCentreColumnLabels();
+ }
/**
- * get the currently selected sequence objects or all the sequences in the
- * alignment.
- *
- * @return array of references to sequence objects
+ * @param centreColumnLabels
+ * @see jalview.api.ViewStyleI#setCentreColumnLabels(boolean)
*/
- public SequenceI[] getSequenceSelection()
+ public void setCentreColumnLabels(boolean centreColumnLabels)
{
- SequenceI[] sequences = null;
- if (selectionGroup != null)
- {
- sequences = selectionGroup.getSequencesInOrder(alignment);
- }
- if (sequences == null)
- {
- sequences = alignment.getSequencesArray();
- }
- return sequences;
+ viewStyle.setCentreColumnLabels(centreColumnLabels);
}
+ /**
+ * @param showdbrefs
+ * @see jalview.api.ViewStyleI#setShowDBRefs(boolean)
+ */
+ public void setShowDBRefs(boolean showdbrefs)
+ {
+ viewStyle.setShowDBRefs(showdbrefs);
+ }
/**
- * This method returns the visible alignment as text, as seen on the GUI, ie
- * if columns are hidden they will not be returned in the result. Use this for
- * calculating trees, PCA, redundancy etc on views which contain hidden
- * columns.
- *
- * @return String[]
+ * @return
+ * @see jalview.api.ViewStyleI#isShowDBRefs()
*/
- public jalview.datamodel.CigarArray getViewAsCigars(
- boolean selectedRegionOnly)
+ public boolean isShowDBRefs()
{
- return new jalview.datamodel.CigarArray(alignment,
- (hasHiddenColumns ? colSel : null),
- (selectedRegionOnly ? selectionGroup : null));
+ return viewStyle.isShowDBRefs();
}
/**
- * return a compact representation of the current alignment selection to pass
- * to an analysis function
- *
- * @param selectedOnly
- * boolean true to just return the selected view
- * @return AlignmentView
+ * @return
+ * @see jalview.api.ViewStyleI#isShowNPFeats()
*/
- public jalview.datamodel.AlignmentView getAlignmentView(
- boolean selectedOnly)
+ public boolean isShowNPFeats()
{
- return getAlignmentView(selectedOnly, false);
+ return viewStyle.isShowNPFeats();
}
/**
- * return a compact representation of the current alignment selection to pass
- * to an analysis function
- *
- * @param selectedOnly
- * boolean true to just return the selected view
- * @param markGroups
- * boolean true to annotate the alignment view with groups on the
- * alignment (and intersecting with selected region if selectedOnly
- * is true)
- * @return AlignmentView
+ * @param shownpfeats
+ * @see jalview.api.ViewStyleI#setShowNPFeats(boolean)
*/
- public jalview.datamodel.AlignmentView getAlignmentView(
- boolean selectedOnly, boolean markGroups)
+ public void setShowNPFeats(boolean shownpfeats)
{
- return new AlignmentView(alignment, colSel, selectionGroup,
- hasHiddenColumns, selectedOnly, markGroups);
+ viewStyle.setShowNPFeats(shownpfeats);
}
+ public abstract StructureSelectionManager getStructureSelectionManager();
/**
- * This method returns the visible alignment as text, as seen on the GUI, ie
- * if columns are hidden they will not be returned in the result. Use this for
- * calculating trees, PCA, redundancy etc on views which contain hidden
- * columns.
+ * Add one command to the command history list.
*
- * @return String[]
+ * @param command
*/
- public String[] getViewAsString(boolean selectedRegionOnly)
+ public void addToHistoryList(CommandI command)
{
- String[] selection = null;
- SequenceI[] seqs = null;
- int i, iSize;
- int start = 0, end = 0;
- if (selectedRegionOnly && selectionGroup != null)
+ if (this.historyList != null)
{
- iSize = selectionGroup.getSize();
- seqs = selectionGroup.getSequencesInOrder(alignment);
- start = selectionGroup.getStartRes();
- end = selectionGroup.getEndRes() + 1;
+ this.historyList.push(command);
+ broadcastCommand(command, false);
}
- else
+ }
+
+ protected void broadcastCommand(CommandI command, boolean undo)
+ {
+ getStructureSelectionManager().commandPerformed(command, undo,
+ getVamsasSource());
+ }
+
+ /**
+ * Add one command to the command redo list.
+ *
+ * @param command
+ */
+ public void addToRedoList(CommandI command)
+ {
+ if (this.redoList != null)
{
- iSize = alignment.getHeight();
- seqs = alignment.getSequencesArray();
- end = alignment.getWidth();
+ this.redoList.push(command);
}
+ broadcastCommand(command, true);
+ }
- selection = new String[iSize];
- if (hasHiddenColumns)
+ /**
+ * Clear the command redo list.
+ */
+ public void clearRedoList()
+ {
+ if (this.redoList != null)
{
- selection = colSel.getVisibleSequenceStrings(start, end, seqs);
+ this.redoList.clear();
}
- else
- {
- for (i = 0; i < iSize; i++)
- {
- selection[i] = seqs[i].getSequenceAsString(start, end);
- }
+ }
- }
- return selection;
+ public void setHistoryList(Deque list)
+ {
+ this.historyList = list;
}
+ public Deque getHistoryList()
+ {
+ return this.historyList;
+ }
- /**
- * return visible region boundaries within given column range
- * @param min first column (inclusive, from 0)
- * @param max last column (exclusive)
- * @return int[][] range of {start,end} visible positions
- */
- public int[][] getVisibleRegionBoundaries(int min, int max)
+ public void setRedoList(Deque list)
{
- Vector regions = new Vector();
- int start = min;
- int end = max;
+ this.redoList = list;
+ }
- do
- {
- if (hasHiddenColumns)
- {
- if (start == 0)
- {
- start = colSel.adjustForHiddenColumns(start);
- }
+ public Deque getRedoList()
+ {
+ return this.redoList;
+ }
- end = colSel.getHiddenBoundaryRight(start);
- if (start == end)
- {
- end = max;
- }
- if (end > max)
- {
- end = max;
- }
- }
+ @Override
+ public VamsasSource getVamsasSource()
+ {
+ return this;
+ }
- regions.addElement(new int[]
- { start, end });
+ public SequenceAnnotationOrder getSortAnnotationsBy()
+ {
+ return sortAnnotationsBy;
+ }
- if (hasHiddenColumns)
- {
- start = colSel.adjustForHiddenColumns(end);
- start = colSel.getHiddenBoundaryLeft(start) + 1;
- }
- } while (end < max);
+ public void setSortAnnotationsBy(SequenceAnnotationOrder sortAnnotationsBy)
+ {
+ this.sortAnnotationsBy = sortAnnotationsBy;
+ }
- int[][] startEnd = new int[regions.size()][2];
+ public boolean isShowAutocalculatedAbove()
+ {
+ return showAutocalculatedAbove;
+ }
- regions.copyInto(startEnd);
+ public void setShowAutocalculatedAbove(boolean showAutocalculatedAbove)
+ {
+ this.showAutocalculatedAbove = showAutocalculatedAbove;
+ }
- return startEnd;
+ @Override
+ public boolean isScaleProteinAsCdna()
+ {
+ return viewStyle.isScaleProteinAsCdna();
+ }
+ @Override
+ public void setScaleProteinAsCdna(boolean b)
+ {
+ viewStyle.setScaleProteinAsCdna(b);
}
+
/**
- * @return the padGaps
+ * @return true if view should scroll to show the highlighted region of a
+ * sequence
+ * @return
*/
- public boolean isPadGaps()
+ @Override
+ public final boolean isFollowHighlight()
{
- return padGaps;
+ return followHighlight;
}
- /**
- * @param padGaps the padGaps to set
- */
- public void setPadGaps(boolean padGaps)
+
+ @Override
+ public final void setFollowHighlight(boolean b)
{
- this.padGaps = padGaps;
+ this.followHighlight = b;
}
- /**
- * apply any post-edit constraints and trigger any calculations needed after an edit has been performed on the alignment
- * @param ap
- */
- public void alignmentChanged(AlignmentViewPanel ap)
+
+ public int getStartRes()
{
- if (isPadGaps())
- {
- alignment.padGaps();
- }
- if (autoCalculateConsensus)
- {
- updateConsensus(ap);
- }
- if (hconsensus != null && autoCalculateConsensus)
+ 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)
{
- updateConservation(ap);
+ // log.System.out.println(" Corrected res from " + res + " to maximum " +
+ // (alignment.getWidth()-1));
+ res = alignment.getWidth() - 1;
}
- if (autoCalculateStrucConsensus)
+ if (res < 0)
{
- updateStrucConsensus(ap);
+ res = 0;
}
+ this.endRes = res;
+ }
- // Reset endRes of groups if beyond alignment width
- int alWidth = alignment.getWidth();
- Vector groups = alignment.getGroups();
- if (groups != null)
+ public void setEndSeq(int seq)
+ {
+ if (seq > alignment.getHeight())
{
- for (int i = 0; i < groups.size(); i++)
- {
- SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
- if (sg.getEndRes() > alWidth)
- {
- sg.setEndRes(alWidth - 1);
- }
- }
+ seq = alignment.getHeight();
}
-
- if (selectionGroup != null && selectionGroup.getEndRes() > alWidth)
+ if (seq < 0)
{
- selectionGroup.setEndRes(alWidth - 1);
+ seq = 0;
}
+ this.endSeq = seq;
+ }
- resetAllColourSchemes();
-
- // alignment.adjustSequenceAnnotations();
+ public int getEndSeq()
+ {
+ return endSeq;
}
-
/**
- * reset scope and do calculations for all applied colourschemes on alignment
+ * Helper method to populate the SearchResults with the location in the
+ * complementary alignment to scroll to, in order to match this one.
+ *
+ * @param sr
+ * the SearchResults to add to
+ * @return the offset (below top of visible region) of the matched sequence
*/
- void resetAllColourSchemes()
+ protected int findComplementScrollTarget(SearchResults sr)
{
- ColourSchemeI cs = globalColourScheme;
- if (cs != null)
+ final AlignViewportI complement = getCodingComplement();
+ if (complement == null || !complement.isFollowHighlight())
{
- if (cs instanceof ClustalxColourScheme)
+ return 0;
+ }
+ boolean iAmProtein = !getAlignment().isNucleotide();
+ AlignmentI proteinAlignment = iAmProtein ? getAlignment() : complement
+ .getAlignment();
+ if (proteinAlignment == null)
+ {
+ return 0;
+ }
+ final Set mappings = proteinAlignment
+ .getCodonFrames();
+
+ /*
+ * Heuristic: find the first mapped sequence (if any) with a non-gapped
+ * residue in the middle column of the visible region. Scroll the
+ * complementary alignment to line up the corresponding residue.
+ */
+ int seqOffset = 0;
+ SequenceI sequence = null;
+
+ /*
+ * locate 'middle' column (true middle if an odd number visible, left of
+ * middle if an even number visible)
+ */
+ int middleColumn = getStartRes() + (getEndRes() - getStartRes()) / 2;
+ final HiddenSequences hiddenSequences = getAlignment()
+ .getHiddenSequences();
+
+ /*
+ * searching to the bottom of the alignment gives smoother scrolling across
+ * all gapped visible regions
+ */
+ int lastSeq = alignment.getHeight() - 1;
+ for (int seqNo = getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++)
+ {
+ sequence = getAlignment().getSequenceAt(seqNo);
+ if (hiddenSequences != null && hiddenSequences.isHidden(sequence))
{
- ((ClustalxColourScheme) cs).resetClustalX(alignment.getSequences(),
- alignment.getWidth());
+ continue;
}
-
- cs.setConsensus(hconsensus);
- if (cs.conservationApplied())
+ if (Comparison.isGap(sequence.getCharAt(middleColumn)))
{
- cs.setConservation(Conservation.calculateConservation("All",
- ResidueProperties.propHash, 3, alignment.getSequences(), 0,
- alignment.getWidth(), false, getConsPercGaps(), false));
+ continue;
+ }
+ List seqMappings = MappingUtils
+ .findMappingsForSequence(sequence, mappings);
+ if (!seqMappings.isEmpty())
+ {
+ break;
}
}
- int s, sSize = alignment.getGroups().size();
- for (s = 0; s < sSize; s++)
+ if (sequence == null)
{
- SequenceGroup sg = (SequenceGroup) alignment.getGroups().elementAt(s);
- if (sg.cs != null && sg.cs instanceof ClustalxColourScheme)
- {
- ((ClustalxColourScheme) sg.cs).resetClustalX(sg
- .getSequences(hiddenRepSequences), sg.getWidth());
- }
- sg.recalcConservation();
+ /*
+ * No ungapped mapped sequence in middle column - do nothing
+ */
+ return 0;
}
+ MappingUtils.addSearchResults(sr, sequence,
+ sequence.findPosition(middleColumn), mappings);
+ return seqOffset;
}
-
}